blob: a28794b9d834aeeb5fdb000c1dafb87938994546 [file] [log] [blame]
#!/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())