Dudi Maroshi has uploaded a new change for review.

Change subject: monitor: implement NUMA aware KSM policy
......................................................................

monitor: implement NUMA aware KSM policy

Add parameter to HostKSM.py collector to collect merge_across_nodes
Add parameter to KSM.py controller to udpate merge_across_nodes kernel flag
Used Entity.py to debug by monitoring the state of variables change

Change-Id: I26caf0abe0a33a82b242549ba2ba4ad7f01ec925
Related-to: https://bugzilla.redhat.com/show_bug.cgi?id=840114
Signed-off-by: Dudi Maroshi <d...@redhat.com>
---
M mom/Collectors/HostKSM.py
M mom/Controllers/KSM.py
M mom/Entity.py
3 files changed, 13 insertions(+), 3 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/mom refs/changes/30/40130/1

diff --git a/mom/Collectors/HostKSM.py b/mom/Collectors/HostKSM.py
index 68ab957..027dd0b 100644
--- a/mom/Collectors/HostKSM.py
+++ b/mom/Collectors/HostKSM.py
@@ -32,17 +32,19 @@
         ksm_full_scans - The number of times all mergeable memory areas have 
been scanned
         ksm_shareable - Estimated amount of host memory that is eligible for 
sharing
         ksmd_cpu_usage - The cpu usage of kernel thread ksmd during the 
monitor interval
+        ksm_share_across_nodes - Toggle, policy_string, Share memory pages 
across all NUMA nodes = 1, default = 1
     """
 
     sysfs_keys = [ 'full_scans', 'pages_sharing', 'pages_unshared', 'run',
                    'pages_shared', 'pages_to_scan', 'pages_volatile',
-                   'sleep_millisecs' ]
+                   'sleep_millisecs', 'merge_across_nodes']
 
     def __init__(self, properties):
         self.open_files()
         self.interval = properties['interval']
         self.pid = self._get_ksmd_pid()
         self.last_jiff = self.get_ksmd_jiffies()
+        self.log = logging.getLogger('mom.Collectors.HostKSM')
 
     def __del__(self):
         for datum in self.sysfs_keys:
@@ -112,6 +114,7 @@
             data['ksm_' + datum] = parse_int('(.*)', file.read())
         data['ksm_shareable'] = self.get_shareable_mem()
         data['ksmd_cpu_usage'] = self.get_ksmd_cpu_usage()
+#        self.log.debug("HostKSM.collect.data[ksm_merge_across_nodes] = %s", 
data['ksm_merge_across_nodes'])
         return data
 
     def getFields(self=None):
diff --git a/mom/Controllers/KSM.py b/mom/Controllers/KSM.py
index fbe921a..1e07e5a 100644
--- a/mom/Controllers/KSM.py
+++ b/mom/Controllers/KSM.py
@@ -20,14 +20,17 @@
     """
     Simple controller to tune KSM paramaters.  Output triggers are:
         - ksm_run - Change the state of the KSM kernel daemon:
-                        0 - Stop, 1 - Run
+                        0 - Stop, 1 - Run, 2 - unmerge shared pages
         - ksm_pages_to_scan - Set the number of pages to be scanned per work 
unit
         - ksm_sleep_millisecs - Set the time to sleep between scans
+        - ksm_merge_across_nodes - Toggle (0/1), default 1, 
+                        merge across all nodes = 1, merge inside each NUMA 
node = 0
     """
     def __init__(self, properties):
         self.hypervisor_iface = properties['hypervisor_iface']
         self.logger = logging.getLogger('mom.Controllers.KSM')
-        self.cur = { 'run': '0', 'pages_to_scan': '0', 'sleep_millisecs': '0' }
+        self.cur = { 'run': '0', 'pages_to_scan': '0', 'sleep_millisecs': '0', 
'merge_across_nodes': '8'}
+        self.logger.debug("KSM policy initialized")
 
     def write_value(self, fname, value):
         try:
diff --git a/mom/Entity.py b/mom/Entity.py
index 48a065c..7874ea1 100644
--- a/mom/Entity.py
+++ b/mom/Entity.py
@@ -14,6 +14,8 @@
 # License along with this program; if not, write to the Free Software
 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
 
+import logging
+
 class EntityError(Exception):
     def __init__(self, message):
         self.message = message
@@ -31,6 +33,7 @@
         self.statistics = []
         self.controls = {}
         self.monitor = monitor
+        self.logger = logging.getLogger('mom.Entity')
 
     def _set_property(self, name, val):
         self.properties[name] = val
@@ -141,6 +144,7 @@
         """
         Set a control variable in this instance.
         """
+#        self.logger.debug("set Control %s=%s", name, val)
         self.controls[name] = val
 
     def GetControl(self, name):


-- 
To view, visit https://gerrit.ovirt.org/40130
To unsubscribe, visit https://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I26caf0abe0a33a82b242549ba2ba4ad7f01ec925
Gerrit-PatchSet: 1
Gerrit-Project: mom
Gerrit-Branch: master
Gerrit-Owner: Dudi Maroshi <d...@redhat.com>
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to