Get maps view working
This commit is contained in:
parent
f411af9d30
commit
09d7939030
1 changed files with 52 additions and 25 deletions
77
smem
77
smem
|
|
@ -15,7 +15,7 @@ def pidmaps(pid):
|
|||
else:
|
||||
start, end = f[0].split('-')
|
||||
start = int(start, 16)
|
||||
name = ""
|
||||
name = "<anonymous>"
|
||||
if len(f) > 5:
|
||||
name = f[5]
|
||||
maps[start] = dict(end=int(end, 16), mode=f[1],
|
||||
|
|
@ -43,10 +43,6 @@ def processtotals(pids):
|
|||
continue
|
||||
return totals
|
||||
|
||||
def maptotals():
|
||||
t = dict(size=0, rss=0, pss=0, shared_clean=0, shared_dirty=0,
|
||||
private_clean=0, private_dirty=0, referenced=0, swap=0)
|
||||
|
||||
def sortmaps(totals, key):
|
||||
l = []
|
||||
for pid in totals:
|
||||
|
|
@ -115,11 +111,6 @@ def showpids():
|
|||
return piduser(p)
|
||||
return username(piduser(p))
|
||||
|
||||
def showsize(field):
|
||||
if numeric:
|
||||
return lambda n: pt[n][field]
|
||||
return lambda n: units(pt[n][field])
|
||||
|
||||
fields = dict(
|
||||
pid=('PID', lambda n: n, '% 5s', lambda x: len(p)),
|
||||
uid=('UID', username, '%-5s', None),
|
||||
|
|
@ -136,6 +127,46 @@ def showpids():
|
|||
|
||||
showtable(p, fields, columns.split(), options.sort or 'pss')
|
||||
|
||||
def maptotals(pids):
|
||||
totals = {}
|
||||
for pid in pids:
|
||||
try:
|
||||
maps = pidmaps(pid)
|
||||
for m in maps.iterkeys():
|
||||
name = maps[m]['name']
|
||||
if name not in totals:
|
||||
t = dict(size=0, rss=0, pss=0, shared_clean=0,
|
||||
shared_dirty=0, private_clean=0, count=0,
|
||||
private_dirty=0, referenced=0, swap=0)
|
||||
else:
|
||||
t = totals[name]
|
||||
|
||||
for k in t:
|
||||
t[k] += maps[m].get(k, 0)
|
||||
t['count'] += 1
|
||||
totals[name] = t
|
||||
except:
|
||||
raise
|
||||
print len(totals), totals.keys()[0]
|
||||
return totals
|
||||
|
||||
def showmaps():
|
||||
p = pids()
|
||||
pt = maptotals(p)
|
||||
|
||||
fields = dict(
|
||||
map=('Map', lambda n: n, '%-24.24s', len),
|
||||
count=('Count', lambda n: pt[n]['count'], '% 8s', sum),
|
||||
swap=('Swap',lambda n: pt[n]['swap'], '% 8s', sum),
|
||||
uss=('USS', lambda n: pt[n]['private_clean']
|
||||
+ pt[n]['private_dirty'], '% 8s', sum),
|
||||
rss=('RSS', lambda n: pt[n]['rss'], '% 8s', sum),
|
||||
pss=('PSS', lambda n: pt[n]['pss'], '% 8s', sum),
|
||||
)
|
||||
columns = options.columns or 'map count swap uss pss rss'
|
||||
|
||||
showtable(pt.keys(), fields, columns.split(), options.sort or 'pss')
|
||||
|
||||
def showtable(rows, fields, columns, sort):
|
||||
header = ""
|
||||
format = ""
|
||||
|
|
@ -170,29 +201,25 @@ def showtable(rows, fields, columns, sort):
|
|||
print "-" * len(header)
|
||||
print format % tuple(t)
|
||||
|
||||
# todo
|
||||
# fix disappearing dirs
|
||||
# show unknowns
|
||||
|
||||
# options
|
||||
# columns
|
||||
# numeric
|
||||
# sort order
|
||||
|
||||
parser = optparse.OptionParser("%prog [options]")
|
||||
parser.add_option("-H", "--no-header", action="store_true",
|
||||
help="disable header line")
|
||||
help="disable header line")
|
||||
parser.add_option("-n", "--numeric", action="store_true",
|
||||
help="numeric output")
|
||||
help="numeric output")
|
||||
parser.add_option("-s", "--sort", type="str",
|
||||
help="field to sort on")
|
||||
help="field to sort on")
|
||||
parser.add_option("-t", "--totals", action="store_true",
|
||||
help="show totals")
|
||||
help="show totals")
|
||||
parser.add_option("-c", "--columns", type="str",
|
||||
help="columns to show")
|
||||
help="columns to show")
|
||||
parser.add_option("-m", "--mappings", action="store_true",
|
||||
help="show mappings")
|
||||
|
||||
defaults = {}
|
||||
parser.set_defaults(**defaults)
|
||||
(options, args) = parser.parse_args()
|
||||
|
||||
showpids()
|
||||
if options.mappings:
|
||||
showmaps()
|
||||
else:
|
||||
showpids()
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue