-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathmemrank
executable file
·58 lines (50 loc) · 1.37 KB
/
memrank
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#!/usr/bin/env python
import os, array, sys
import pagemap
kpcount = pagemap.kpagecount("")
amap = pagemap.archmap("")
krange = kpcount.counts(amap.pfn_offset(), kpcount.pages())
def measure(pid):
vss, rss, uss, pss = 0, 0, 0, 0
try:
pmap = pagemap.processmap(pid)
except:
return 0, 0, 0, 0
for m in pmap.maps():
vss += m.end - m.start
r = pmap.range(m.start, m.end)
for idx in range(len(r)):
pfn = r[idx] & ((1 << 55) - 1)
if pfn == 0:
continue
rss += 4096
# skip framebuffer mappings
if pfn <= kpcount.pages():
c = krange[int(pfn) - amap.pfn_offset()]
else:
c = 0
if c == 1:
uss += 4096
if c:
pss += int(4096.0 / c)
return vss, rss, pss, uss
procs = []
for pid in os.listdir("/proc/"):
try:
pid = int(pid)
except:
continue
name = file("/proc/%d/status" % pid).readline()[6:-1]
e = measure(int(pid))
procs.append((-e[2], pid, name, e))
procs.sort()
print " VSS RSS PSS USS"
for pss, pid, name, e in procs:
vss, rss, pss, uss = e
print "%8d: % 7dk % 7dk % 7dk % 7dk %s" % (
int(pid),
vss / 1024,
rss / 1024,
pss / 1024,
uss / 1024,
name)