X-Git-Url: http://git.onelab.eu/?p=mom.git;a=blobdiff_plain;f=swapmon.py;h=6f995fa73eccf12e9265d2106db3d5848d602f65;hp=e2215b279ed4a54fafa66cfee407e6101693b751;hb=34e3e7729f3221afbcae3d2122af43c9c32c2450;hpb=534e6abb96f7711ce6de5888dea9305da1c95eff diff --git a/swapmon.py b/swapmon.py index e2215b2..6f995fa 100755 --- a/swapmon.py +++ b/swapmon.py @@ -23,7 +23,7 @@ import socket import time # bwlimit exports a few useful functions like run(), get_xid(), and get_slice() -import bwlimit +import plnode.bwlimit as bwlimit # Utility functions from pl_mom import * @@ -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,13 @@ 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): + if "ERR" in line: + pass # ignore spurious error message from vps + else: + print "slicestat: failed to parse line: " + line continue proc = dict(zip(fields, values)) @@ -187,11 +188,15 @@ 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): + if "ERR" in line: + pass # ignore spurious error message from vps + else: + print "slicestat: failed to parse line: " + line continue # Assign (pl_)sshd processes to slice instead of root @@ -236,7 +241,7 @@ def slicestat(names = None): slice['rss'] += proc['rss'] slices[proc['xid']] = slice - + return slices def memtotal(): @@ -385,7 +390,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 +422,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)