Package logilab :: Package common :: Module meminfo
[frames] | no frames]

Source Code for Module logilab.common.meminfo

 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 #KiB 
 7   
8 -def human(num, power="Ki"):
9 powers = ["Ki", "Mi", "Gi", "Ti"] 10 while num >= 1000: #4 digits 11 num /= 1024.0 12 power = powers[powers.index(power) + 1] 13 return "%.1f %s" % (num, power)
14
15 -def _memprint(pid, out=sys.stdout):
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): #stat 26 for line in open("/proc/%s/smaps" % pid).readlines(): #open 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 #Note shared + Private = Rss above 37 #The Rss in smaps includes video card mem etc. 38 if have_pss: 39 pss_adjust = 0.5 #add 0.5KiB as this average error due to trunctation 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 #lots of overestimation, but what can we do? 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
52 -def memprint(msg=None, out=sys.stdout):
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