X-Git-Url: http://git.onelab.eu/?p=mom.git;a=blobdiff_plain;f=swapmon.py;h=ac133fba955f3dc52e1e38a3e2b2039d4916d511;hp=e2215b279ed4a54fafa66cfee407e6101693b751;hb=1b22b4327b132b42f51effb7b8b6b73a881a83f6;hpb=534e6abb96f7711ce6de5888dea9305da1c95eff diff --git a/swapmon.py b/swapmon.py index e2215b2..ac133fb 100755 --- a/swapmon.py +++ b/swapmon.py @@ -129,6 +129,7 @@ Options: --min-thresh=PERCENT Minimum physical memory utilization to be considered a hog --system-slice=SLICE System slice that should not be reset --status Print memory usage statistics and exit + --memstatus Print total memory, total swap, and swap used -h, --help This message """.lstrip() % (sys.argv[0], debug, verbose, DATAFILE, format_period(period)) @@ -150,12 +151,13 @@ def slicestat(names = None): # Mandatory fields. xid is a virtual field inserted by vps. Make # sure cmd is last so that it does not get truncated # automatically. - fields = ['pid', 'xid', 'vsize', 'sz', 'rss', 'pmem', 'cmd'] + fields = ['pid', 'xid', 'vsname', 'vsize', 'sz', 'rss', 'pmem', 'cmd'] # vps inserts xid after pid in the output, but ps doesn't know # what the field means. ps_fields = list(fields) ps_fields.remove('xid') + ps_fields.remove('vsname') slices = {} @@ -166,14 +168,10 @@ def slicestat(names = None): # Chomp newline line = line.strip() - # Replace "0 MAIN" and "1 ALL_PROC" (the special monikers that - # vps uses to denote the root context and the "all contexts" - # context) with "0" so that we can just split() on whitespace. - line = line.replace("0 MAIN", "0").replace("1 ALL_PROC", "0") - # Represent process as a dict of fields values = line.split(None, len(fields) - 1) if len(values) != len(fields): + print "slicestat: failed to parse line: " + line continue proc = dict(zip(fields, values)) @@ -187,11 +185,12 @@ def slicestat(names = None): except ValueError: pass - # vps sometimes prints ERR or the name of the slice + # vps sometimes prints ERR or the name of the slice # instead of a context ID if it # cannot identify the context of an orphaned (usually dying) # process. Skip these processes. if (type(proc['xid']) != int) or (type(proc['vsize']) !=int): + print "slicestat: failed to parse line: " + line continue # Assign (pl_)sshd processes to slice instead of root @@ -236,7 +235,7 @@ def slicestat(names = None): slice['rss'] += proc['rss'] slices[proc['xid']] = slice - + return slices def memtotal(): @@ -385,7 +384,7 @@ def main(): emailed = {} try: - longopts = ["debug", "verbose", "file=", "slice=", "status", "help"] + longopts = ["debug", "verbose", "file=", "slice=", "status", "memstatus", "help"] longopts += ["period=", "reset-thresh=", "reboot-thresh=", "min-thresh=", "system-slice="] (opts, argv) = getopt.getopt(sys.argv[1:], "dvf:s:ph", longopts) except getopt.GetoptError, err: @@ -417,6 +416,13 @@ def main(): elif opt == "--status": print summary(slicestat(names)) sys.exit(0) + elif opt == "--memstatus": + (mem, swap) = memtotal() + swap_pct = swap_used() + print "memory total:", mem + print "swap total:", swap + print "swap used:", swap_pct + sys.exit(0) else: usage() sys.exit(0)