fix problem parsing output of vps; add --memstatus command
authorScott Baker <bakers@cs.arizona.edu>
Wed, 20 Apr 2011 15:51:21 +0000 (15:51 +0000)
committerScott Baker <bakers@cs.arizona.edu>
Wed, 20 Apr 2011 15:51:21 +0000 (15:51 +0000)
swapmon.py

index e2215b2..1076261 100755 (executable)
@@ -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))
 
@@ -192,6 +190,7 @@ def slicestat(names = None):
         # 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)