All of lore.kernel.org
 help / color / mirror / Atom feed
From: Lucas Meneghel Rodrigues <lmr@redhat.com>
To: "Lukáš Doktor" <ldoktor@redhat.com>
Cc: KVM list <kvm@vger.kernel.org>,
	Autotest mailing list <autotest@test.kernel.org>,
	Jiri Zupka <jzupka@redhat.com>, Jason Wang <jasowang@redhat.com>
Subject: Re: [Autotest] [KVM_AUTOTEST][PATCH] KSM_overcommit: dynamic reserve calculation
Date: Thu, 06 May 2010 15:38:25 -0300	[thread overview]
Message-ID: <1273171105.15652.138.camel@freedom> (raw)
In-Reply-To: <4BE1DAAA.80508@redhat.com>

On Wed, 2010-05-05 at 21:52 +0100, Lukáš Doktor wrote:
> 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

Ok guys, thanks for working on this automatic evaluation of reserved
memory for host and guest!

> 
> 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

Ok, this sounds good, I'll give my round of testing on it after you guys
re-send the patch to me with the small comments below addressed.

Also, I noticed you guys are not using the full awesomeness of git.
Please read the mini tutorial I made so you can use git send-email.

http://autotest.kernel.org/wiki/GitWorkflow

I made comments on your patch using ------ so it's easier to identify
that is a comment and what is the actual patch. Next time, please send
the patch using git send-email.

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

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 
+

-------------------------------------------------------------------------------
Cool, how did you guys get to this constant?
-------------------------------------------------------------------------------

 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")

-------------------------------------------------------------------------------
The message above should be along the lines 

e_msg = "VM %s died while executing static_random_fill on allocator loop" % i
-------------------------------------------------------------------------------
             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")

-------------------------------------------------------------------------------
The message above also should be along the lines 

e_msg = "VM %s died while executing static_random_fill on allocator loop" % i
-------------------------------------------------------------------------------

                     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

-------------------------------------------------------------------------------
Be consistent above and assign True instead of 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-06 18:38 UTC|newest]

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

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=1273171105.15652.138.camel@freedom \
    --to=lmr@redhat.com \
    --cc=autotest@test.kernel.org \
    --cc=jasowang@redhat.com \
    --cc=jzupka@redhat.com \
    --cc=kvm@vger.kernel.org \
    --cc=ldoktor@redhat.com \
    /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.