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@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@redhat.com
oVirt Jenkins CI Server has posted comments on this change.
Change subject: [WIP] Start moving proc parsing to it's own module ......................................................................
Patch Set 1:
Build Successful
http://jenkins.ovirt.info/job/patch_vdsm_unit_tests/697/ : SUCCESS
-- To view, visit http://gerrit.ovirt.org/7513 To unsubscribe, visit http://gerrit.ovirt.org/settings
Gerrit-MessageType: comment Gerrit-Change-Id: I7ba84c7ece95bdef7448a7c7af277e7f58695401 Gerrit-PatchSet: 1 Gerrit-Project: vdsm Gerrit-Branch: master Gerrit-Owner: Saggi Mizrahi smizrahi@redhat.com Gerrit-Reviewer: oVirt Jenkins CI Server
Adam Litke has posted comments on this change.
Change subject: [WIP] Start moving proc parsing to it's own module ......................................................................
Patch Set 1: (2 inline comments)
Just a couple of minor comments ... PLEASE improve your commit messages too!
.................................................... Commit Message Line 4: Commit: Saggi Mizrahi smizrahi@redhat.com Line 5: CommitDate: 2012-08-27 17:43:35 -0400 Line 6: Line 7: [WIP] Start moving proc parsing to it's own module Line 8: We really need to do a better job describing our patches. This is just not good enough. Line 9: Change-Id: I7ba84c7ece95bdef7448a7c7af277e7f58695401
.................................................... File vdsm/utils.py Line 18: # Refer to the README and COPYING files for full details of the license Line 19: # Line 20: Line 21: """ Line 22: A module containing miscellaneous functions and classes that are user s/user/used/ Line 23: plentifuly around vdsm. Line 24: Line 25: .. attribute:: utils.symbolerror Line 26:
-- To view, visit http://gerrit.ovirt.org/7513 To unsubscribe, visit http://gerrit.ovirt.org/settings
Gerrit-MessageType: comment Gerrit-Change-Id: I7ba84c7ece95bdef7448a7c7af277e7f58695401 Gerrit-PatchSet: 1 Gerrit-Project: vdsm Gerrit-Branch: master Gerrit-Owner: Saggi Mizrahi smizrahi@redhat.com Gerrit-Reviewer: Adam Litke agl@us.ibm.com Gerrit-Reviewer: oVirt Jenkins CI Server
Itamar Heim has posted comments on this change.
Change subject: Start moving proc parsing to it's own module ......................................................................
Patch Set 2:
ping - still relevant?
Itamar Heim has abandoned this change.
Change subject: Start moving proc parsing to it's own module ......................................................................
Abandoned
abandoning - old. no reply. not touched for a while. please restore if relevant
vdsm-patches@lists.fedorahosted.org