1 """based on http://www.pixelbeat.org/scripts/ps_mem.py
2 """
3 import sys
4 import os
5
6 PAGESIZE = os.sysconf("SC_PAGE_SIZE") / 1024
7
8 -def human(num, power="Ki"):
9 powers = ["Ki", "Mi", "Gi", "Ti"]
10 while num >= 1000:
11 num /= 1024.0
12 power = powers[powers.index(power) + 1]
13 return "%.1f %s" % (num, power)
14
16 have_pss = False
17 private_lines = []
18 shared_lines = []
19 pss_lines = []
20 try:
21 rss = int(open("/proc/%s/statm" % pid).readline().split()[1]) * PAGESIZE
22 except IOError:
23 print 'unknown process', pid
24 return
25 if os.path.exists("/proc/%s/smaps" % pid):
26 for line in open("/proc/%s/smaps" % pid).readlines():
27 if line.startswith("Shared"):
28 shared_lines.append(line)
29 elif line.startswith("Private"):
30 private_lines.append(line)
31 elif line.startswith("Pss"):
32 have_pss = True
33 pss_lines.append(line)
34 shared = sum([int(line.split()[1]) for line in shared_lines])
35 private = sum([int(line.split()[1]) for line in private_lines])
36
37
38 if have_pss:
39 pss_adjust = 0.5
40 pss = sum([float(line.split()[1])+pss_adjust for line in pss_lines])
41 shared = pss - private
42 elif (2,6,1) <= kv <= (2,6,9):
43 shared = 0
44 private = rss
45 else:
46 shared = int(open("/proc/%s/statm" % pid).readline().split()[2])
47 shared *= PAGESIZE
48 private = rss - shared
49 print >> out, " Private + Shared = RAM used"
50 print >> out, "%8sB + %8sB = %8sB" % (human(private), human(shared), human(rss))
51
53 print >> out, '-' * 20
54 if msg:
55 print >> out, msg
56 _memprint(os.getpid(), out)
57 print >> out, '-' * 20
58
59 if __name__ == '__main__':
60 pid = int(sys.argv[1])
61 _memprint(pid)
62