#!/usr/bin/python 

import subprocess
import re
import sys

from mdb import MDB

####################################
#
# ANON USAGE
#
# Shows top vnodes that use anonymous memory
# and their path (if applicable)
# Uses MDB (and mdb module)
# 
# ----------------------------------
#
# (c) Sergey Klyaus, Tune-IT, 2012
# myaut@tune-it.ru
#
####################################

SHOWPROGRESS = True
LIMIT = 10
MDB_COMMAND = 'mdb -k'

mdb_anon_proc = MDB(MDB_COMMAND, interactive=False)
mdb_anon_proc.send('::walk anon_cache | ::print struct anon an_vp')

vp_stat = {}
vp_num = 0

vpath_re = re.compile('"(.*)"$')

for vp_str in mdb_anon_proc:  
    vp = vp_str.split()[-1]
    
    if vp not in vp_stat:
        vp_stat[vp] = 0
    
    vp_stat[vp] += 1
    vp_num += 1
    
    if SHOWPROGRESS and vp_num % 4096 == 0:
        print >> sys.stderr, "Read %d anon entries" % vp_num
        
vp_top = sorted(vp_stat.items(), key=lambda item: item[1])[-LIMIT:]
#print vp_top

print "%16s %8s %s" % ("VP", "ANON_PGS", "VPATH")

mdb_vp_proc = MDB(MDB_COMMAND)

for vp_entry in vp_top:
    mdb_vp_proc.send(vp_entry[0]+'::print vnode_t v_path', wrap_hack=True)
    
    vpath = mdb_vp_proc.readstring()
    
    #print vp_entry
    print "%16s %8d %s" % (vp_entry[0], vp_entry[1], vpath)