diff mbox

[KVM-AUTOTEST] KVM test: Add hugepage variant

Message ID 1248838829-7804-1-git-send-email-lmr@redhat.com (mailing list archive)
State New, archived
Headers show

Commit Message

Lucas Meneghel Rodrigues July 29, 2009, 3:40 a.m. UTC
This patch adds a small setup script to set up huge memory
pages during the kvm tests execution. Also, added hugepage setup to the
fc8_quick sample.

Signed-off-by: Lukáš Doktor <ldoktor@redhat.com>
Signed-off-by: Lucas Meneghel Rodrigues <lmr@redhat.com>
---
 client/tests/kvm/kvm_tests.cfg.sample |    8 +++
 client/tests/kvm/kvm_vm.py            |   11 +++
 client/tests/kvm/scripts/hugepage.py  |  109 +++++++++++++++++++++++++++++++++
 3 files changed, 128 insertions(+), 0 deletions(-)
 create mode 100644 client/tests/kvm/scripts/hugepage.py

Comments

Lukáš Doktor July 29, 2009, 8:02 a.m. UTC | #1
Dne 29.7.2009 05:40, Lucas Meneghel Rodrigues napsal(a):
> This patch adds a small setup script to set up huge memory
> pages during the kvm tests execution. Also, added hugepage setup to the
> fc8_quick sample.
>
> Signed-off-by: Lukáš Doktor<ldoktor@redhat.com>
> Signed-off-by: Lucas Meneghel Rodrigues<lmr@redhat.com>
> ---
>   client/tests/kvm/kvm_tests.cfg.sample |    8 +++
>   client/tests/kvm/kvm_vm.py            |   11 +++
>   client/tests/kvm/scripts/hugepage.py  |  109 +++++++++++++++++++++++++++++++++
>   3 files changed, 128 insertions(+), 0 deletions(-)
>   create mode 100644 client/tests/kvm/scripts/hugepage.py
>
> diff --git a/client/tests/kvm/kvm_tests.cfg.sample b/client/tests/kvm/kvm_tests.cfg.sample
> index 2d75a66..7cd12cb 100644
> --- a/client/tests/kvm/kvm_tests.cfg.sample
> +++ b/client/tests/kvm/kvm_tests.cfg.sample
> @@ -587,6 +587,13 @@ variants:
>
>
>   variants:
> +    - @kvm_smallpages:
> +    - kvm_hugepages:
> +        pre_command = "/usr/bin/python scripts/hugepage.py /mnt/kvm_hugepage"
> +        extra_params += " -mem-path /mnt/kvm_hugepage"
> +
> +
> +variants:
>       - @basic:
>           only Fedora Windows
>       - @full:
> @@ -598,6 +605,7 @@ variants:
>           only Fedora.8.32
>           only install setup boot shutdown
>           only rtl8139
> +        only kvm_hugepages
>       - @sample1:
>           only qcow2
>           only ide
> diff --git a/client/tests/kvm/kvm_vm.py b/client/tests/kvm/kvm_vm.py
> index d96b359..eba9b84 100644
> --- a/client/tests/kvm/kvm_vm.py
> +++ b/client/tests/kvm/kvm_vm.py
> @@ -397,6 +397,17 @@ class VM:
>                   self.destroy()
>                   return False
>
> +            # Get the output so far, to see if we have any problems with
> +            # hugepage setup.
> +            output = self.process.get_output()
> +
> +            if "alloc_mem_area" in output:
> +                logging.error("Could not allocate hugepage memory; "
> +                              "qemu command:\n%s" % qemu_command)
> +                logging.error("Output:" + kvm_utils.format_str_for_message(
> +                              self.process.get_output()))
> +                return False
> +
>               logging.debug("VM appears to be alive with PID %d",
>                             self.process.get_pid())
>               return True
> diff --git a/client/tests/kvm/scripts/hugepage.py b/client/tests/kvm/scripts/hugepage.py
> new file mode 100644
> index 0000000..dc36da4
> --- /dev/null
> +++ b/client/tests/kvm/scripts/hugepage.py
> @@ -0,0 +1,109 @@
> +#!/usr/bin/python
> +# -*- coding: utf-8 -*-
> +import os, sys, time
> +
> +"""
> +Simple script to allocate enough hugepages for KVM testing purposes.
> +"""
> +
> +class HugePageError(Exception):
> +    """
> +    Simple wrapper for the builtin Exception class.
> +    """
> +    pass
> +
> +
> +class HugePage:
> +    def __init__(self, hugepage_path=None):
> +        """
> +        Gets environment variable values and calculates the target number
> +        of huge memory pages.
> +
> +        @param hugepage_path: Path where to mount hugetlbfs path, if not
> +                yet configured.
> +        """
> +        self.vms = len(os.environ['KVM_TEST_vms'].split())
> +        self.mem = int(os.environ['KVM_TEST_mem'])
> +        try:
> +            self.max_vms = int(os.environ['KVM_TEST_max_vms'])
> +        except KeyError:
> +            self.max_vms = 0
> +
> +        if hugepage_path:
> +            self.hugepage_path = hugepage_path
> +        else:
> +            self.hugepage_path = '/mnt/kvm_hugepage'
> +
> +        self.hugepage_size = self.get_hugepage_size()
> +        self.target_hugepages = self.get_target_hugepages()
> +
> +
> +    def get_hugepage_size(self):
> +        """
> +        Get the current system setting for huge memory page size.
> +        """
> +        meminfo = open('/proc/meminfo', 'r').readlines()
> +        huge_line_list = [h for h in meminfo if h.startswith("Hugepagesize")]
> +        try:
> +            return int(huge_line_list[0].split()[1])
> +        except ValueError, e:
> +            raise HugePageError("Could not get huge page size setting from "
> +                                "/proc/meminfo: %s" % e)
> +
> +
> +    def get_target_hugepages(self):
> +        """
> +        Calculate the target number of hugepages for testing purposes.
> +        """
> +        if self.vms<  self.max_vms:
> +            self.vms = self.max_vms
> +        vmsm = (self.vms * self.mem) + (self.vms * 64)
> +        return int(vmsm * 1024 / self.hugepage_size)
> +
> +
> +    def set_hugepages(self):
> +        """
> +        Sets the hugepage limit to the target hugepage value calculated.
> +        """
> +        hugepage_cfg = open("/proc/sys/vm/nr_hugepages", "r+")
> +        hp = hugepage_cfg.readline()
> +        while int(hp)<  self.target_hugepages:
> +            loop_hp = hp
> +            hugepage_cfg.write(str(self.target_hugepages))
> +            hugepage_cfg.flush()
> +            hugepage_cfg.seek(0)
> +            hp = int(hugepage_cfg.readline())
> +            if loop_hp == hp:
> +                raise HugePageError("Cannot set the kernel hugepage setting "
> +                                    "to the target value of %d hugepages." %
> +                                    self.target_hugepages)
> +        hugepage_cfg.close()
> +
> +
> +    def mount_hugepage_fs(self):
> +        """
> +        Verify if there's a hugetlbfs mount set. If there's none, will set up
> +        a hugetlbfs mount using the class attribute that defines the mount
> +        point.
> +        """
> +        if not os.path.ismount(self.hugepage_path):
> +            if not os.path.isdir(self.hugepage_path):
> +                os.makedirs(self.hugepage_path)
> +            cmd = "mount -t hugetlbfs none %s" % self.hugepage_path
> +            if os.system(cmd):
> +                raise HugePageError("Cannot mount hugetlbfs path %s" %
> +                                    self.hugepage_path)
> +
> +
> +    def setup(self):
> +        self.set_hugepages()
> +        self.mount_hugepage_fs()
> +
> +
> +if __name__ == "__main__":
> +    if len(sys.argv)<  2:
> +        huge_page = HugePage()
> +    else:
> +        huge_page = HugePage(sys.argv[1])
> +
> +    huge_page.setup()


Acked-by: Lukáš Doktor <ldoktor@redhat.com>
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Ryan Harper July 29, 2009, 2:41 p.m. UTC | #2
* Lucas Meneghel Rodrigues <lmr@redhat.com> [2009-07-28 22:40]:
> This patch adds a small setup script to set up huge memory
> pages during the kvm tests execution. Also, added hugepage setup to the
> fc8_quick sample.
> 
> Signed-off-by: Luká?? Doktor <ldoktor@redhat.com>
> Signed-off-by: Lucas Meneghel Rodrigues <lmr@redhat.com>

Looks good.  one nit below.

Signed-off-by: Ryan Harper <ryanh@us.ibm.com>

> ---
>  client/tests/kvm/kvm_tests.cfg.sample |    8 +++
>  client/tests/kvm/kvm_vm.py            |   11 +++
>  client/tests/kvm/scripts/hugepage.py  |  109 +++++++++++++++++++++++++++++++++
>  3 files changed, 128 insertions(+), 0 deletions(-)
>  create mode 100644 client/tests/kvm/scripts/hugepage.py
> 
> diff --git a/client/tests/kvm/kvm_tests.cfg.sample b/client/tests/kvm/kvm_tests.cfg.sample
> index 2d75a66..7cd12cb 100644
> --- a/client/tests/kvm/kvm_tests.cfg.sample
> +++ b/client/tests/kvm/kvm_tests.cfg.sample
> @@ -587,6 +587,13 @@ variants:
> 
> 
>  variants:
> +    - @kvm_smallpages:
> +    - kvm_hugepages:
> +        pre_command = "/usr/bin/python scripts/hugepage.py /mnt/kvm_hugepage"
> +        extra_params += " -mem-path /mnt/kvm_hugepage"
> +
> +
> +variants:
>      - @basic:
>          only Fedora Windows
>      - @full:
> @@ -598,6 +605,7 @@ variants:
>          only Fedora.8.32
>          only install setup boot shutdown
>          only rtl8139
> +        only kvm_hugepages
>      - @sample1:
>          only qcow2
>          only ide
> diff --git a/client/tests/kvm/kvm_vm.py b/client/tests/kvm/kvm_vm.py
> index d96b359..eba9b84 100644
> --- a/client/tests/kvm/kvm_vm.py
> +++ b/client/tests/kvm/kvm_vm.py
> @@ -397,6 +397,17 @@ class VM:
>                  self.destroy()
>                  return False
> 
> +            # Get the output so far, to see if we have any problems with
> +            # hugepage setup.
> +            output = self.process.get_output()
> +
> +            if "alloc_mem_area" in output:
> +                logging.error("Could not allocate hugepage memory; "
> +                              "qemu command:\n%s" % qemu_command)
> +                logging.error("Output:" + kvm_utils.format_str_for_message(
> +                              self.process.get_output()))
> +                return False
> +
>              logging.debug("VM appears to be alive with PID %d",
>                            self.process.get_pid())
>              return True
> diff --git a/client/tests/kvm/scripts/hugepage.py b/client/tests/kvm/scripts/hugepage.py
> new file mode 100644
> index 0000000..dc36da4
> --- /dev/null
> +++ b/client/tests/kvm/scripts/hugepage.py
> @@ -0,0 +1,109 @@
> +#!/usr/bin/python
> +# -*- coding: utf-8 -*-
> +import os, sys, time
> +
> +"""
> +Simple script to allocate enough hugepages for KVM testing purposes.
> +"""
> +
> +class HugePageError(Exception):
> +    """
> +    Simple wrapper for the builtin Exception class.
> +    """
> +    pass
> +
> +
> +class HugePage:
> +    def __init__(self, hugepage_path=None):
> +        """
> +        Gets environment variable values and calculates the target number
> +        of huge memory pages.
> +
> +        @param hugepage_path: Path where to mount hugetlbfs path, if not
> +                yet configured.
> +        """
> +        self.vms = len(os.environ['KVM_TEST_vms'].split())
> +        self.mem = int(os.environ['KVM_TEST_mem'])
> +        try:
> +            self.max_vms = int(os.environ['KVM_TEST_max_vms'])
> +        except KeyError:
> +            self.max_vms = 0
> +
> +        if hugepage_path:
> +            self.hugepage_path = hugepage_path
> +        else:
> +            self.hugepage_path = '/mnt/kvm_hugepage'
> +
> +        self.hugepage_size = self.get_hugepage_size()
> +        self.target_hugepages = self.get_target_hugepages()
> +
> +
> +    def get_hugepage_size(self):
> +        """
> +        Get the current system setting for huge memory page size.
> +        """
> +        meminfo = open('/proc/meminfo', 'r').readlines()
> +        huge_line_list = [h for h in meminfo if h.startswith("Hugepagesize")]
> +        try:
> +            return int(huge_line_list[0].split()[1])
> +        except ValueError, e:
> +            raise HugePageError("Could not get huge page size setting from "
> +                                "/proc/meminfo: %s" % e)
> +
> +
> +    def get_target_hugepages(self):
> +        """
> +        Calculate the target number of hugepages for testing purposes.
> +        """
> +        if self.vms < self.max_vms:
> +            self.vms = self.max_vms
> +        vmsm = (self.vms * self.mem) + (self.vms * 64)

Nit: Maybe a comment about the fudge factor being added in?

> +        return int(vmsm * 1024 / self.hugepage_size)
> +
> +
> +    def set_hugepages(self):
> +        """
> +        Sets the hugepage limit to the target hugepage value calculated.
> +        """
> +        hugepage_cfg = open("/proc/sys/vm/nr_hugepages", "r+")
> +        hp = hugepage_cfg.readline()
> +        while int(hp) < self.target_hugepages:
> +            loop_hp = hp
> +            hugepage_cfg.write(str(self.target_hugepages))
> +            hugepage_cfg.flush()
> +            hugepage_cfg.seek(0)
> +            hp = int(hugepage_cfg.readline())
> +            if loop_hp == hp:
> +                raise HugePageError("Cannot set the kernel hugepage setting "
> +                                    "to the target value of %d hugepages." %
> +                                    self.target_hugepages)
> +        hugepage_cfg.close()
> +
> +
> +    def mount_hugepage_fs(self):
> +        """
> +        Verify if there's a hugetlbfs mount set. If there's none, will set up
> +        a hugetlbfs mount using the class attribute that defines the mount
> +        point.
> +        """
> +        if not os.path.ismount(self.hugepage_path):
> +            if not os.path.isdir(self.hugepage_path):
> +                os.makedirs(self.hugepage_path)
> +            cmd = "mount -t hugetlbfs none %s" % self.hugepage_path
> +            if os.system(cmd):
> +                raise HugePageError("Cannot mount hugetlbfs path %s" %
> +                                    self.hugepage_path)
> +
> +
> +    def setup(self):
> +        self.set_hugepages()
> +        self.mount_hugepage_fs()
> +
> +
> +if __name__ == "__main__":
> +    if len(sys.argv) < 2:
> +        huge_page = HugePage()
> +    else:
> +        huge_page = HugePage(sys.argv[1])
> +
> +    huge_page.setup()
> -- 
> 1.6.2.5
> 
> --
> To unsubscribe from this list: send the line "unsubscribe kvm" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
Lukáš Doktor Aug. 4, 2009, 1 p.m. UTC | #3
Hello Ryan,

see below...

Dne 29.7.2009 16:41, Ryan Harper napsal(a):
> * Lucas Meneghel Rodrigues<lmr@redhat.com>  [2009-07-28 22:40]:
>> This patch adds a small setup script to set up huge memory
>> pages during the kvm tests execution. Also, added hugepage setup to the
>> fc8_quick sample.
>>
>> Signed-off-by: Luká?? Doktor<ldoktor@redhat.com>
>> Signed-off-by: Lucas Meneghel Rodrigues<lmr@redhat.com>
>
> Looks good.  one nit below.
>
> Signed-off-by: Ryan Harper<ryanh@us.ibm.com>
>
>> ---
>> +
>> +    def get_target_hugepages(self):
>> +        """
>> +        Calculate the target number of hugepages for testing purposes.
>> +        """
>> +        if self.vms<  self.max_vms:
>> +            self.vms = self.max_vms
>> +        vmsm = (self.vms * self.mem) + (self.vms * 64)
>
> Nit: Maybe a comment about the fudge factor being added in?

It's qemu-kvm overhead. Should I change the patch or is this explanation 
sufficient?

Thanks for the feedback,
bye, Lukáš
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/client/tests/kvm/kvm_tests.cfg.sample b/client/tests/kvm/kvm_tests.cfg.sample
index 2d75a66..7cd12cb 100644
--- a/client/tests/kvm/kvm_tests.cfg.sample
+++ b/client/tests/kvm/kvm_tests.cfg.sample
@@ -587,6 +587,13 @@  variants:
 
 
 variants:
+    - @kvm_smallpages:
+    - kvm_hugepages:
+        pre_command = "/usr/bin/python scripts/hugepage.py /mnt/kvm_hugepage"
+        extra_params += " -mem-path /mnt/kvm_hugepage"
+
+
+variants:
     - @basic:
         only Fedora Windows
     - @full:
@@ -598,6 +605,7 @@  variants:
         only Fedora.8.32
         only install setup boot shutdown
         only rtl8139
+        only kvm_hugepages
     - @sample1:
         only qcow2
         only ide
diff --git a/client/tests/kvm/kvm_vm.py b/client/tests/kvm/kvm_vm.py
index d96b359..eba9b84 100644
--- a/client/tests/kvm/kvm_vm.py
+++ b/client/tests/kvm/kvm_vm.py
@@ -397,6 +397,17 @@  class VM:
                 self.destroy()
                 return False
 
+            # Get the output so far, to see if we have any problems with
+            # hugepage setup.
+            output = self.process.get_output()
+
+            if "alloc_mem_area" in output:
+                logging.error("Could not allocate hugepage memory; "
+                              "qemu command:\n%s" % qemu_command)
+                logging.error("Output:" + kvm_utils.format_str_for_message(
+                              self.process.get_output()))
+                return False
+
             logging.debug("VM appears to be alive with PID %d",
                           self.process.get_pid())
             return True
diff --git a/client/tests/kvm/scripts/hugepage.py b/client/tests/kvm/scripts/hugepage.py
new file mode 100644
index 0000000..dc36da4
--- /dev/null
+++ b/client/tests/kvm/scripts/hugepage.py
@@ -0,0 +1,109 @@ 
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+import os, sys, time
+
+"""
+Simple script to allocate enough hugepages for KVM testing purposes.
+"""
+
+class HugePageError(Exception):
+    """
+    Simple wrapper for the builtin Exception class.
+    """
+    pass
+
+
+class HugePage:
+    def __init__(self, hugepage_path=None):
+        """
+        Gets environment variable values and calculates the target number
+        of huge memory pages.
+
+        @param hugepage_path: Path where to mount hugetlbfs path, if not
+                yet configured.
+        """
+        self.vms = len(os.environ['KVM_TEST_vms'].split())
+        self.mem = int(os.environ['KVM_TEST_mem'])
+        try:
+            self.max_vms = int(os.environ['KVM_TEST_max_vms'])
+        except KeyError:
+            self.max_vms = 0
+
+        if hugepage_path:
+            self.hugepage_path = hugepage_path
+        else:
+            self.hugepage_path = '/mnt/kvm_hugepage'
+
+        self.hugepage_size = self.get_hugepage_size()
+        self.target_hugepages = self.get_target_hugepages()
+
+
+    def get_hugepage_size(self):
+        """
+        Get the current system setting for huge memory page size.
+        """
+        meminfo = open('/proc/meminfo', 'r').readlines()
+        huge_line_list = [h for h in meminfo if h.startswith("Hugepagesize")]
+        try:
+            return int(huge_line_list[0].split()[1])
+        except ValueError, e:
+            raise HugePageError("Could not get huge page size setting from "
+                                "/proc/meminfo: %s" % e)
+
+
+    def get_target_hugepages(self):
+        """
+        Calculate the target number of hugepages for testing purposes.
+        """
+        if self.vms < self.max_vms:
+            self.vms = self.max_vms
+        vmsm = (self.vms * self.mem) + (self.vms * 64)
+        return int(vmsm * 1024 / self.hugepage_size)
+
+
+    def set_hugepages(self):
+        """
+        Sets the hugepage limit to the target hugepage value calculated.
+        """
+        hugepage_cfg = open("/proc/sys/vm/nr_hugepages", "r+")
+        hp = hugepage_cfg.readline()
+        while int(hp) < self.target_hugepages:
+            loop_hp = hp
+            hugepage_cfg.write(str(self.target_hugepages))
+            hugepage_cfg.flush()
+            hugepage_cfg.seek(0)
+            hp = int(hugepage_cfg.readline())
+            if loop_hp == hp:
+                raise HugePageError("Cannot set the kernel hugepage setting "
+                                    "to the target value of %d hugepages." %
+                                    self.target_hugepages)
+        hugepage_cfg.close()
+
+
+    def mount_hugepage_fs(self):
+        """
+        Verify if there's a hugetlbfs mount set. If there's none, will set up
+        a hugetlbfs mount using the class attribute that defines the mount
+        point.
+        """
+        if not os.path.ismount(self.hugepage_path):
+            if not os.path.isdir(self.hugepage_path):
+                os.makedirs(self.hugepage_path)
+            cmd = "mount -t hugetlbfs none %s" % self.hugepage_path
+            if os.system(cmd):
+                raise HugePageError("Cannot mount hugetlbfs path %s" %
+                                    self.hugepage_path)
+
+
+    def setup(self):
+        self.set_hugepages()
+        self.mount_hugepage_fs()
+
+
+if __name__ == "__main__":
+    if len(sys.argv) < 2:
+        huge_page = HugePage()
+    else:
+        huge_page = HugePage(sys.argv[1])
+
+    huge_page.setup()