diff --git a/smem b/smem index 6b9fa35..0412d9d 100755 --- a/smem +++ b/smem @@ -15,7 +15,7 @@ def pidmaps(pid): else: start, end = f[0].split('-') start = int(start, 16) - name = "" + name = "" 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()