Change in vdsm[master]: sampling: use constants for counter bounds

danken at redhat.com danken at redhat.com
Fri Feb 7 10:33:47 UTC 2014


Dan Kenigsberg has uploaded a new change for review.

Change subject: sampling: use constants for counter bounds
......................................................................

sampling: use constants for counter bounds

When we report cpu and network usage, we take two samples of Linux
counters, and divide their difference by the elapsed time. If a sampled
counter wraps around its upper bound, we might report an invalid
negative value. To avoid that, we take the modulu of the difference.
For example, assume that the first sample was (2**64 - 10) jiffies and
30 jiffies have passed until the second sample, the difference would be
the hugely negative value (30 - 2**64). Taking modulu 2**64 returns the
correct value of 30 jiffies.

JIFFIES_BOUND is taken from the size of clock_t and NETSTATS_BOUND -
from the size of the fields of struct net_device_stats. I am not aware
of any programmatic way to acquire this value, but they are both of 64
bit size on x86_64 and ppc64.

Taking modulu 2**32 works perfectly well, since two subsequent samples
are unlikly to be that far apart, and it has the benefit of working well
on a 32 bit host, too.

Change-Id: I706000106c3bc31edf8541c980bce1f49464ebf8
Signed-off-by: Dan Kenigsberg <danken at redhat.com>
---
M vdsm/sampling.py
M vdsm/vm.py
2 files changed, 11 insertions(+), 8 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/94/24194/1

diff --git a/vdsm/sampling.py b/vdsm/sampling.py
index 54b6381..a5492ce 100644
--- a/vdsm/sampling.py
+++ b/vdsm/sampling.py
@@ -42,6 +42,9 @@
 if not os.path.exists(_THP_STATE_PATH):
     _THP_STATE_PATH = '/sys/kernel/mm/redhat_transparent_hugepage/enabled'
 
+JIFFIES_BOUND = 2 ** 32
+NETSTATS_BOUND = 2 ** 32
+
 
 class InterfaceSample:
     """
@@ -430,14 +433,14 @@
             return stats
         hs0, hs1 = self._samples[0], self._samples[-1]
         interval = hs1.timestamp - hs0.timestamp
-        jiffies = (hs1.pidcpu.user - hs0.pidcpu.user) % (2 ** 32)
+        jiffies = (hs1.pidcpu.user - hs0.pidcpu.user) % JIFFIES_BOUND
         stats['cpuUserVdsmd'] = (jiffies / interval)
-        jiffies = hs1.pidcpu.sys - hs0.pidcpu.sys % (2 ** 32)
+        jiffies = hs1.pidcpu.sys - hs0.pidcpu.sys % JIFFIES_BOUND
         stats['cpuSysVdsmd'] = (jiffies / interval)
 
-        jiffies = (hs1.totcpu.user - hs0.totcpu.user) % (2 ** 32)
+        jiffies = (hs1.totcpu.user - hs0.totcpu.user) % JIFFIES_BOUND
         stats['cpuUser'] = jiffies / interval / self._ncpus
-        jiffies = (hs1.totcpu.sys - hs0.totcpu.sys) % (2 ** 32)
+        jiffies = (hs1.totcpu.sys - hs0.totcpu.sys) % JIFFIES_BOUND
         stats['cpuSys'] = jiffies / interval / self._ncpus
         stats['cpuIdle'] = max(0.0,
                                100.0 - stats['cpuUser'] - stats['cpuSys'])
@@ -479,9 +482,9 @@
             ifrate = ifrate or 1000
             Mbps2Bps = (10 ** 6) / 8
             thisRx = (hs1.interfaces[ifid].rx - hs0.interfaces[ifid].rx) % \
-                (2 ** 32)
+                NETSTATS_BOUND
             thisTx = (hs1.interfaces[ifid].tx - hs0.interfaces[ifid].tx) % \
-                (2 ** 32)
+                NETSTATS_BOUND
             rxRate = 100.0 * thisRx / interval / ifrate / Mbps2Bps
             txRate = 100.0 * thisTx / interval / ifrate / Mbps2Bps
             if txRate > 100 or rxRate > 100:
diff --git a/vdsm/vm.py b/vdsm/vm.py
index aae8bd6..07fb581 100644
--- a/vdsm/vm.py
+++ b/vdsm/vm.py
@@ -606,11 +606,11 @@
 
                 ifRxBytes = (100.0 *
                              (eInfo[nic.name][0] - sInfo[nic.name][0]) %
-                             2 ** 32 /
+                             sampling.NETSTATS_BOUND /
                              sampleInterval / ifSpeed / self.MBPS_TO_BPS)
                 ifTxBytes = (100.0 *
                              (eInfo[nic.name][4] - sInfo[nic.name][4]) %
-                             2 ** 32 /
+                             sampling.NETSTATS_BOUND /
                              sampleInterval / ifSpeed / self.MBPS_TO_BPS)
 
                 ifStats['rxRate'] = '%.1f' % ifRxBytes


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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I706000106c3bc31edf8541c980bce1f49464ebf8
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Dan Kenigsberg <danken at redhat.com>


More information about the vdsm-patches mailing list