Change in vdsm[master]: [WIP] Start moving proc parsing to it's own module

smizrahi at redhat.com smizrahi at redhat.com
Mon Aug 27 21:43:48 UTC 2012


Saggi Mizrahi has uploaded a new change for review.

Change subject: [WIP] Start moving proc parsing to it's own module
......................................................................

[WIP] Start moving proc parsing to it's own module

Change-Id: I7ba84c7ece95bdef7448a7c7af277e7f58695401
Signed-off-by: Saggi Mizrahi <smizrahi at redhat.com>
---
M vdsm.spec.in
M vdsm/API.py
M vdsm/Makefile.am
M vdsm/caps.py
A vdsm/procfs.py
M vdsm/utils.py
M vdsm/vm.py
7 files changed, 53 insertions(+), 40 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/13/7513/1

diff --git a/vdsm.spec.in b/vdsm.spec.in
index bd01c2a..1f01961 100644
--- a/vdsm.spec.in
+++ b/vdsm.spec.in
@@ -573,6 +573,7 @@
 %{_datadir}/%{vdsm_name}/supervdsmServer.py*
 %{_datadir}/%{vdsm_name}/vmChannels.py*
 %{_datadir}/%{vdsm_name}/vmContainer.py*
+%{_datadir}/%{vdsm_name}/procfs.py*
 %{_datadir}/%{vdsm_name}/tc.py*
 %{_datadir}/%{vdsm_name}/vdsm
 %{_datadir}/%{vdsm_name}/vdsm-restore-net-config
diff --git a/vdsm/API.py b/vdsm/API.py
index 720c3b9..aab69cd 100644
--- a/vdsm/API.py
+++ b/vdsm/API.py
@@ -37,6 +37,7 @@
 from vdsm.define import doneCode, errCode, Kbytes, Mbytes
 import caps
 from vdsm.config import config
+import procfs
 
 import supervdsm
 
@@ -864,7 +865,7 @@
         """
 
         def _readSwapTotalFree():
-            meminfo = utils.readMemInfo()
+            meminfo = procfs.meminfo()
             return meminfo['SwapTotal'] / 1024, meminfo['SwapFree'] / 1024
 
         stats = {}
@@ -1111,17 +1112,16 @@
         memCommitted = self._memCommitted()
         resident = 0
         for v in self._cif.vmContainer.getVMs():
-            if v.conf['pid'] == '0':
-                continue
             try:
-                statmfile = file('/proc/' + v.conf['pid'] + '/statm')
-                resident += int(statmfile.read().split()[1])
+                resident += v.statm().resident
             except:
                 pass
+
         resident *= PAGE_SIZE_BYTES
-        meminfo = utils.readMemInfo()
-        freeOrCached = (meminfo['MemFree'] +
-                        meminfo['Cached'] + meminfo['Buffers']) * Kbytes
+
+        meminfo = procfs.meminfo()
+        freeOrCached = (meminfo['MemFree'] + meminfo['Cached'] +
+                        meminfo['Buffers']) * Kbytes
         return freeOrCached + resident - memCommitted - \
                 config.getint('vars', 'host_mem_reserve') * Mbytes
 
diff --git a/vdsm/Makefile.am b/vdsm/Makefile.am
index 574d762..1a3ac43 100644
--- a/vdsm/Makefile.am
+++ b/vdsm/Makefile.am
@@ -47,6 +47,7 @@
 	momIF.py \
 	neterrors.py \
 	parted_utils.py \
+	procfs.py \
 	pthread.py \
 	supervdsm.py \
 	supervdsmServer.py \
diff --git a/vdsm/caps.py b/vdsm/caps.py
index f1641ff..39fc837 100644
--- a/vdsm/caps.py
+++ b/vdsm/caps.py
@@ -41,6 +41,7 @@
 from vdsm import utils
 from vdsm import constants
 import storage.hba
+import procfs
 
 # For debian systems we can use python-apt if available
 try:
@@ -271,7 +272,7 @@
     caps['HBAInventory'] = storage.hba.HBAInventory()
     caps['vmTypes'] = ['kvm']
 
-    caps['memSize'] = str(utils.readMemInfo()['MemTotal'] / 1024)
+    caps['memSize'] = str(procfs.meminfo()['MemTotal'] / 1024)
     caps['reservedMem'] = str(
             config.getint('vars', 'host_mem_reserve') +
             config.getint('vars', 'extra_mem_reserve'))
diff --git a/vdsm/procfs.py b/vdsm/procfs.py
new file mode 100644
index 0000000..29fc973
--- /dev/null
+++ b/vdsm/procfs.py
@@ -0,0 +1,31 @@
+from collections import namedtuple
+
+buffsize = 4096
+
+MemStat = namedtuple("MemStat",
+                     "size, resident, share, text, UNUSED1, data, UNUSED2")
+
+
+def statm(pid):
+    """
+    Parses statm for a pid. Note all results are in pages.
+    """
+    with open("/proc/%d/statm" % pid, "rb") as f:
+        return MemStat(*(int(val) for val in f.read().split()))
+
+
+def meminfo():
+    """
+    Parse ``/proc/meminfo`` and return its content as a dictionary.
+
+    note.
+        All values are in KB
+    """
+    meminfo = {}
+    with open("/proc/meminfo", "rb") as f:
+        f.seek(0)
+        lines = f.readlines()
+        for var, val in (l.split()[0:2] for l in lines):
+            meminfo[var[:-1]] = int(val)
+
+    return meminfo
diff --git a/vdsm/utils.py b/vdsm/utils.py
index 5e2d4e5..048a528 100644
--- a/vdsm/utils.py
+++ b/vdsm/utils.py
@@ -19,7 +19,8 @@
 #
 
 """
-A module containing miscellaneous functions and classes that are user plentifuly around vdsm.
+A module containing miscellaneous functions and classes that are user
+plentifuly around vdsm.
 
 .. attribute:: utils.symbolerror
 
@@ -28,7 +29,8 @@
 from SimpleXMLRPCServer import SimpleXMLRPCServer
 import SocketServer
 import threading
-import os, time
+import os
+import time
 import logging
 import errno
 import subprocess
@@ -42,6 +44,7 @@
 import constants
 from config import config
 import netinfo
+import procfs
 
 _THP_STATE_PATH = '/sys/kernel/mm/transparent_hugepage/enabled'
 if not os.path.exists(_THP_STATE_PATH):
@@ -63,34 +66,6 @@
         os.unlink(fileToRemove)
     except:
         pass
-
-def readMemInfo():
-    """
-    Parse ``/proc/meminfo`` and return its content as a dictionary.
-
-    For a reason unknown to me, ``/proc/meminfo`` is is sometime
-    empty when opened. If that happens, the function retries to open it
-    3 times.
-
-    :returns: a dictionary representation of ``/proc/meminfo``
-    """
-    # FIXME the root cause for these retries should be found and fixed
-    tries = 3
-    meminfo = {}
-    while True:
-        tries -= 1
-        try:
-            lines = []
-            lines = file('/proc/meminfo').readlines()
-            for line in lines:
-                var, val = line.split()[0:2]
-                meminfo[var[:-1]] = int(val)
-            return meminfo
-        except:
-            logging.warning(lines, exc_info=True)
-            if tries <= 0:
-                raise
-            time.sleep(0.1)
 
 #Threaded version of SimpleXMLRPCServer
 class SimpleThreadedXMLRPCServer(SocketServer.ThreadingMixIn, SimpleXMLRPCServer):
@@ -225,7 +200,7 @@
         """
         BaseSample.__init__(self, pid, ifids)
         self.totcpu = TotalCpuSample()
-        meminfo = readMemInfo()
+        meminfo = procfs.meminfo()
         freeOrCached = (meminfo['MemFree'] +
                         meminfo['Cached'] + meminfo['Buffers'])
         self.memUsed = 100 - int(100.0 * (freeOrCached) / meminfo['MemTotal'])
diff --git a/vdsm/vm.py b/vdsm/vm.py
index c1a22b0..bd436e0 100644
--- a/vdsm/vm.py
+++ b/vdsm/vm.py
@@ -36,6 +36,7 @@
 import libvirt
 from vdsm import vdscli
 import caps
+import procfs
 
 DEFAULT_BRIDGE = config.get("vars", "default_bridge")
 
@@ -693,6 +694,9 @@
             load = len(self.cif.vmContainer.getVMs())
         return base * (doubler + load) / doubler
 
+    def statm(self):
+        return procfs.statm(int(self.conf['pid']))
+
     def saveState(self):
         if self.destroyed:
             return


--
To view, visit http://gerrit.ovirt.org/7513
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I7ba84c7ece95bdef7448a7c7af277e7f58695401
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Saggi Mizrahi <smizrahi at redhat.com>


More information about the vdsm-patches mailing list