All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Lukáš Doktor" <ldoktor@redhat.com>
To: KVM list <kvm@vger.kernel.org>,
	Autotest mailing list <autotest@test.kernel.org>,
	Jiri Zupka <jzupka@redhat.com>, Jason Wang <jasowang@redhat.com>
Subject: [KVM_AUTOTEST][PATCH] KSM_overcommit: dynamic reserve calculation
Date: Wed, 05 May 2010 21:52:58 +0100	[thread overview]
Message-ID: <4BE1DAAA.80508@redhat.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 840 bytes --]

Hi,

we are back with new features of KSM_overcommit test:
* NEW: guest_reserve and host_reserve are now calculated based on used 
memory
* NEW: tmpfs reserve is also evaluated to fit the overhead
* NEW: VM alive check during split_guest()
* FIX: In function split_guest() we used incorrect session
* MOD: Increase number of VNC ports


host_reserve:
* Still possible to set this value in cfg
* Calculation:
1) host_reserve = Available memory + minimal guest(128MB)
2) host_reserve += number of guests * 64

guest_reserve:
* Still possible to set this value in cfg
* Calculation:
1) guest_reserve = 256
2) guest_reserve += guest memory * constant
... where constant represents (TMPFS overhead and multiplicative OS 
memory consumption) per MB


Tested by ldoktor and jzupka on various HW (2GB-36GB host memory).

Best regards,
Lukáš Doktor

[-- Attachment #2: 2010-05-05_ksm_overcommit.diff --]
[-- Type: text/x-patch, Size: 7845 bytes --]

diff --git a/client/tests/kvm/kvm_vm.py b/client/tests/kvm/kvm_vm.py
index 6bc7987..1d83120 100755
--- a/client/tests/kvm/kvm_vm.py
+++ b/client/tests/kvm/kvm_vm.py
@@ -396,7 +396,7 @@ class VM:
 
             # Find available VNC port, if needed
             if params.get("display") == "vnc":
-                self.vnc_port = kvm_utils.find_free_port(5900, 6000)
+                self.vnc_port = kvm_utils.find_free_port(5900, 6100)
 
             # Find random UUID if specified 'uuid = random' in config file
             if params.get("uuid") == "random":
diff --git a/client/tests/kvm/scripts/allocator.py b/client/tests/kvm/scripts/allocator.py
index 1036893..227745a 100755
--- a/client/tests/kvm/scripts/allocator.py
+++ b/client/tests/kvm/scripts/allocator.py
@@ -8,10 +8,12 @@ Auxiliary script used to allocate memory on guests.
 """
 
 
-import os, array, sys, struct, random, copy, inspect, tempfile, datetime
+import os, array, sys, struct, random, copy, inspect, tempfile, datetime, math
 
 PAGE_SIZE = 4096 # machine page size
 
+TMPFS_OVERHEAD = 0.0022 # overhead on 1MB of write data 
+
 
 class MemFill(object):
     """
@@ -32,7 +34,8 @@ class MemFill(object):
 
         self.tmpdp = tempfile.mkdtemp()
         ret_code = os.system("mount -o size=%dM tmpfs %s -t tmpfs" %
-                             ((mem + 25), self.tmpdp))
+                             ((mem+math.ceil(mem*TMPFS_OVERHEAD)), 
+                             self.tmpdp))
         if ret_code != 0:
             if os.getuid() != 0:
                 print ("FAIL: Unable to mount tmpfs "
@@ -42,7 +45,7 @@ class MemFill(object):
         else:
             self.f = tempfile.TemporaryFile(prefix='mem', dir=self.tmpdp)
             self.allocate_by = 'L'
-            self.npages = (mem * 1024 * 1024) / PAGE_SIZE
+            self.npages = ((mem * 1024 * 1024) / PAGE_SIZE)
             self.random_key = random_key
             self.static_value = static_value
             print "PASS: Initialization"
@@ -83,7 +86,7 @@ class MemFill(object):
         @return: return array of bytes size PAGE_SIZE.
         """
         a = array.array("B")
-        for i in range(PAGE_SIZE / a.itemsize):
+        for i in range((PAGE_SIZE / a.itemsize)):
             try:
                 a.append(value)
             except:
diff --git a/client/tests/kvm/tests/ksm_overcommit.py b/client/tests/kvm/tests/ksm_overcommit.py
index 2dd46c4..31d5c61 100644
--- a/client/tests/kvm/tests/ksm_overcommit.py
+++ b/client/tests/kvm/tests/ksm_overcommit.py
@@ -142,6 +142,10 @@ def run_ksm_overcommit(test, params, env):
         session = None
         vm = None
         for i in range(1, vmsc):
+            # Check VMs
+            for j in range(0, vmsc):
+                if not lvms[i].is_alive:
+                    raise error.TestFail("one of other VMs is death")
             vm = lvms[i]
             session = lsessions[i]
             a_cmd = "mem.static_random_fill()"
@@ -154,6 +158,8 @@ def run_ksm_overcommit(test, params, env):
                 logging.debug("Watching host memory while filling vm %s memory",
                               vm.name)
                 while not out.startswith("PASS") and not out.startswith("FAIL"):
+                    if not vm.is_alive():
+                        raise error.TestFail("VM is death")
                     free_mem = int(utils.read_from_meminfo("MemFree"))
                     if (ksm_swap):
                         free_mem = (free_mem +
@@ -202,7 +208,7 @@ def run_ksm_overcommit(test, params, env):
 
         # Verify last machine with randomly generated memory
         a_cmd = "mem.static_random_verify()"
-        _execute_allocator(a_cmd, lvms[last_vm], session,
+        _execute_allocator(a_cmd, lvms[last_vm], lsessions[last_vm],
                            (mem / 200 * 50 * perf_ratio))
         logging.debug(kvm_test_utils.get_memory_info([lvms[last_vm]]))
 
@@ -338,12 +344,29 @@ def run_ksm_overcommit(test, params, env):
 
     # Main test code
     logging.info("Starting phase 0: Initialization")
+
     # host_reserve: mem reserve kept for the host system to run
-    host_reserve = int(params.get("ksm_host_reserve", 512))
+    host_reserve = int(params.get("ksm_host_reserve", -1))
+    if (host_reserve == -1):
+        # default host_reserve = MemAvailable + one_minimal_guest(128MB)
+        # later we add 64MB per additional guest
+        host_reserve = ((utils.memtotal() - utils.read_from_meminfo("MemFree"))
+                        / 1024 + 128)
+        # using default reserve
+        _host_reserve = 1
+    else:
+        _host_reserve = False
+
     # guest_reserve: mem reserve kept to avoid guest OS to kill processes
-    guest_reserve = int(params.get("ksm_guest_reserve", 1024))
-    logging.debug("Memory reserved for host to run: %d", host_reserve)
-    logging.debug("Memory reserved for guest to run: %d", guest_reserve)
+    guest_reserve = int(params.get("ksm_guest_reserve", -1))
+    if (guest_reserve == -1):
+        # default guest_reserve = minimal_system_mem(256MB)
+        # later we add tmpfs overhead
+        guest_reserve = 256
+        # using default reserve
+        _guest_reserve = True
+    else:
+        _guest_reserve = False
 
     max_vms = int(params.get("max_vms", 2))
     overcommit = float(params.get("ksm_overcommit_ratio", 2.0))
@@ -355,6 +378,10 @@ def run_ksm_overcommit(test, params, env):
 
     if (params['ksm_mode'] == "serial"):
         max_alloc = vmsc
+        if _host_reserve:
+            # First round of additional guest reserves
+            host_reserve += vmsc * 64
+            _host_reserve = vmsc
 
     host_mem = (int(utils.memtotal()) / 1024 - host_reserve)
 
@@ -402,6 +429,10 @@ def run_ksm_overcommit(test, params, env):
             if mem - guest_reserve - 1 > 3100:
                 vmsc = int(math.ceil((host_mem * overcommit) /
                                      (3100 + guest_reserve)))
+                if _host_reserve:
+                    host_reserve += (vmsc - _host_reserve) * 64
+                    host_mem -= (vmsc - _host_reserve) * 64
+                    _host_reserve = vmsc
                 mem = int(math.floor(host_mem * overcommit / vmsc))
 
         if os.popen("uname -i").readline().startswith("i386"):
@@ -410,8 +441,19 @@ def run_ksm_overcommit(test, params, env):
             if mem > 3100 - 64:
                 vmsc = int(math.ceil((host_mem * overcommit) /
                                      (3100 - 64.0)))
+                if _host_reserve:
+                    host_reserve += (vmsc - _host_reserve) * 64
+                    host_mem -= (vmsc - _host_reserve) * 64
+                    _host_reserve = vmsc
                 mem = int(math.floor(host_mem * overcommit / vmsc))
 
+    # 0.055 represents OS + TMPFS additional reserve per guest ram MB
+    if _guest_reserve:
+        guest_reserve += math.ceil(mem * 0.055)
+
+    logging.debug("Memory reserved for host to run: %d", host_reserve)
+    logging.debug("Memory reserved for guest to run: %d", guest_reserve)
+
     logging.debug("Checking KSM status...")
     ksm_flag = 0
     for line in os.popen('ksmctl info').readlines():
diff --git a/client/tests/kvm/tests_base.cfg.sample b/client/tests/kvm/tests_base.cfg.sample
index ee83ac2..d3a5982 100644
--- a/client/tests/kvm/tests_base.cfg.sample
+++ b/client/tests/kvm/tests_base.cfg.sample
@@ -302,9 +302,9 @@ variants:
         ksm_overcommit_ratio = 3
         # Max paralel runs machine
         ksm_parallel_ratio = 4
-        # Host memory reserve
-        ksm_host_reserve = 512
-        ksm_guest_reserve = 1024
+        # Host memory reserve (default - best fit for used mem)
+        # ksm_host_reserve = 512
+        # ksm_guest_reserve = 1024
         variants:
             - ksm_serial:
                 ksm_mode = "serial"

             reply	other threads:[~2010-05-05 20:53 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-05-05 20:52 Lukáš Doktor [this message]
2010-05-06 18:38 ` [Autotest] [KVM_AUTOTEST][PATCH] KSM_overcommit: dynamic reserve calculation Lucas Meneghel Rodrigues

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4BE1DAAA.80508@redhat.com \
    --to=ldoktor@redhat.com \
    --cc=autotest@test.kernel.org \
    --cc=jasowang@redhat.com \
    --cc=jzupka@redhat.com \
    --cc=kvm@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.