| #!/usr/bin/env python |
| |
| # Copyright (c) 2009, Giampaolo Rodola'. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| """ |
| Show detailed memory usage about all (querable) processes. |
| |
| Processes are sorted by their "USS" (Unique Set Size) memory, which is |
| probably the most representative metric for determining how much memory |
| is actually being used by a process. |
| |
| This is similar to "smem" cmdline utility on Linux: |
| https://www.selenic.com/smem/ |
| |
| Author: Giampaolo Rodola' <g.rodola@gmail.com> |
| |
| ~/svn/psutil$ ./scripts/procsmem.py |
| PID User Cmdline USS PSS Swap RSS |
| ============================================================================== |
| ... |
| 3986 giampao /usr/bin/python3 /usr/bin/indi 15.3M 16.6M 0B 25.6M |
| 3906 giampao /usr/lib/ibus/ibus-ui-gtk3 17.6M 18.1M 0B 26.7M |
| 3991 giampao python /usr/bin/hp-systray -x 19.0M 23.3M 0B 40.7M |
| 3830 giampao /usr/bin/ibus-daemon --daemoni 19.0M 19.0M 0B 21.4M |
| 20529 giampao /opt/sublime_text/plugin_host 19.9M 20.1M 0B 22.0M |
| 3990 giampao nautilus -n 20.6M 29.9M 0B 50.2M |
| 3898 giampao /usr/lib/unity/unity-panel-ser 27.1M 27.9M 0B 37.7M |
| 4176 giampao /usr/lib/evolution/evolution-c 35.7M 36.2M 0B 41.5M |
| 20712 giampao /usr/bin/python -B /home/giamp 45.6M 45.9M 0B 49.4M |
| 3880 giampao /usr/lib/x86_64-linux-gnu/hud/ 51.6M 52.7M 0B 61.3M |
| 20513 giampao /opt/sublime_text/sublime_text 65.8M 73.0M 0B 87.9M |
| 3976 giampao compiz 115.0M 117.0M 0B 130.9M |
| 32486 giampao skype 145.1M 147.5M 0B 149.6M |
| """ |
| |
| from __future__ import print_function |
| import sys |
| |
| import psutil |
| |
| |
| if not (psutil.LINUX or psutil.OSX or psutil.WINDOWS): |
| sys.exit("platform not supported") |
| |
| |
| def convert_bytes(n): |
| symbols = ('K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y') |
| prefix = {} |
| for i, s in enumerate(symbols): |
| prefix[s] = 1 << (i + 1) * 10 |
| for s in reversed(symbols): |
| if n >= prefix[s]: |
| value = float(n) / prefix[s] |
| return '%.1f%s' % (value, s) |
| return "%sB" % n |
| |
| |
| def main(): |
| ad_pids = [] |
| procs = [] |
| for p in psutil.process_iter(): |
| with p.oneshot(): |
| try: |
| mem = p.memory_full_info() |
| info = p.as_dict(attrs=["cmdline", "username"]) |
| except psutil.AccessDenied: |
| ad_pids.append(p.pid) |
| except psutil.NoSuchProcess: |
| pass |
| else: |
| p._uss = mem.uss |
| p._rss = mem.rss |
| if not p._uss: |
| continue |
| p._pss = getattr(mem, "pss", "") |
| p._swap = getattr(mem, "swap", "") |
| p._info = info |
| procs.append(p) |
| |
| procs.sort(key=lambda p: p._uss) |
| templ = "%-7s %-7s %-30s %7s %7s %7s %7s" |
| print(templ % ("PID", "User", "Cmdline", "USS", "PSS", "Swap", "RSS")) |
| print("=" * 78) |
| for p in procs[:86]: |
| line = templ % ( |
| p.pid, |
| p._info["username"][:7], |
| " ".join(p._info["cmdline"])[:30], |
| convert_bytes(p._uss), |
| convert_bytes(p._pss) if p._pss != "" else "", |
| convert_bytes(p._swap) if p._swap != "" else "", |
| convert_bytes(p._rss), |
| ) |
| print(line) |
| if ad_pids: |
| print("warning: access denied for %s pids" % (len(ad_pids)), |
| file=sys.stderr) |
| |
| |
| if __name__ == '__main__': |
| sys.exit(main()) |