diff mbox

KVM-test: Add hdparm subtest

Message ID 20110802033902.422.82801.stgit@t (mailing list archive)
State New, archived
Headers show

Commit Message

Amos Kong Aug. 2, 2011, 3:39 a.m. UTC
This test uses 'hdparm' to set disk device to low/high
performance status, and compare the reading speed.
The emulated device should pass all the tests.

Signed-off-by: Feng Yang <fyang@redhat.com>
Signed-off-by: Amos Kong <akong@redhat.com>
---
 client/tests/kvm/tests/hdparm.py       |   84 ++++++++++++++++++++++++++++++++
 client/tests/kvm/tests_base.cfg.sample |   13 +++++
 2 files changed, 97 insertions(+), 0 deletions(-)
 create mode 100644 client/tests/kvm/tests/hdparm.py


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

Comments

Lukáš Doktor Aug. 3, 2011, 2:19 p.m. UTC | #1
Reviewed, looks sane.

Lukáš

Dne 2.8.2011 05:39, Amos Kong napsal(a):
> This test uses 'hdparm' to set disk device to low/high
> performance status, and compare the reading speed.
> The emulated device should pass all the tests.
>
> Signed-off-by: Feng Yang<fyang@redhat.com>
> Signed-off-by: Amos Kong<akong@redhat.com>
> ---
>   client/tests/kvm/tests/hdparm.py       |   84 ++++++++++++++++++++++++++++++++
>   client/tests/kvm/tests_base.cfg.sample |   13 +++++
>   2 files changed, 97 insertions(+), 0 deletions(-)
>   create mode 100644 client/tests/kvm/tests/hdparm.py
>
> diff --git a/client/tests/kvm/tests/hdparm.py b/client/tests/kvm/tests/hdparm.py
> new file mode 100644
> index 0000000..79ce5db
> --- /dev/null
> +++ b/client/tests/kvm/tests/hdparm.py
> @@ -0,0 +1,84 @@
> +import re, logging
> +from autotest_lib.client.common_lib import error
> +
> +
> +@error.context_aware
> +def run_hdparm(test, params, env):
> +    """
> +    Test hdparm setting on linux guest os, this case will:
> +    1) Set/record parameters value of hard disk to low performance status.
> +    2) Perform device/cache read timings then record the results.
> +    3) Set/record parameters value of hard disk to high performance status.
> +    4) Perform device/cache read timings then compare two results.
> +
> +    @param test: kvm test object
> +    @param params: Dictionary with the test parameters
> +    @param env: Dictionary with test environmen.
> +    """
> +
> +    def check_setting_result(set_cmd, timeout):
> +        params = re.findall("(-[a-zA-Z])([0-9]*)", set_cmd)
> +        disk = re.findall("(\/+[a-z]*\/[a-z]*$)", set_cmd)[0]
> +        for (param, value) in params:
> +            cmd = "hdparm %s %s" % (param, disk)
> +            (s, output) = session.cmd_status_output(cmd, timeout)
> +            if s != 0:
> +                raise error.TestError("Fail to get %s parameter value\n"
> +                                     "Output is: %s" % (param, output))
> +            if value not in output:
> +                 raise error.TestFail("Fail to set %s parameter to value: %s"
> +                                      % (param, value))
> +
> +
> +    def perform_read_timing(disk, timeout, num=5):
> +        results = 0
> +        for i in range(num):
> +            cmd = params.get("device_cache_read_cmd") % disk
> +            (s, output) = session.cmd_status_output(cmd, timeout)
> +            if s != 0:
> +                raise error.TestFail("Fail to perform device/cache read"
> +                                     " timings \nOutput is: %s\n" % output)
> +            logging.info("Output of device/cache read timing check(%s of %s):"
> +                          " %s" % (i + 1, num, output))
> +            (result, post) = re.findall("= *([0-9]*.+[0-9]*) ([a-zA-Z]*)",
> +                             output)[1]
> +            if post == "kB":
> +                result = float(result)/1024.0
> +            results += float(result)
> +        return results/num
> +
> +    vm = env.get_vm(params["main_vm"])
> +    vm.create()
> +    session = vm.wait_for_login(timeout=int(params.get("login_timeout", 360)))
> +    try:
> +        timeout = float(params.get("cmd_timeout", 60))
> +        cmd = params.get("get_disk_cmd")
> +        (s, output) = session.cmd_status_output(cmd)
> +        disk = output.strip()
> +
> +        error.context("Setting hard disk to lower performance")
> +        cmd = params.get("low_status_cmd") % disk
> +        session.cmd(cmd, timeout)
> +
> +        error.context("Checking hard disk keyval under lower performance")
> +        check_setting_result(cmd, timeout)
> +        low_result = perform_read_timing(disk, timeout)
> +        logging.info("Buffered disk read speed under low performance"
> +                     " configuration: %s" % low_result)
> +        error.context("Setting hard disk to higher performance")
> +        cmd = params.get("high_status_cmd") % disk
> +        session.cmd(cmd, timeout)
> +
> +        error.context("Checking hard disk keyval under higher performance")
> +        check_setting_result(cmd, timeout)
> +        high_result = perform_read_timing(disk, timeout)
> +        logging.info("Buffered disk read speed under high performance"
> +                     " configuration: %s" % high_result)
> +        if not float(high_result)>  float(low_result):
> +            raise error.TestFail("High performance setting does not "
> +                                 "increase read speed\n")
> +        logging.debug("High performance setting increased read speed!")
> +
> +    finally:
> +        if session:
> +            session.close()
> diff --git a/client/tests/kvm/tests_base.cfg.sample b/client/tests/kvm/tests_base.cfg.sample
> index d597b52..5491630 100644
> --- a/client/tests/kvm/tests_base.cfg.sample
> +++ b/client/tests/kvm/tests_base.cfg.sample
> @@ -1115,6 +1115,19 @@ variants:
>           image_snapshot = yes
>           only Linux
>
> +    - hdparm:
> +        type = hdparm
> +        get_disk_cmd = \ls /dev/[vhs]da
> +        low_status_cmd = hdparm -a64 -d0 -u0 %s
> +        device_cache_read_cmd = hdparm -tT %s
> +        high_status_cmd = hdparm -a256 -d1 -u1 %s
> +        cmd_timeout = 540
> +        only Linux
> +        virtio_blk:
> +            get_disk_cmd = \ls /dev/vda
> +            low_status_cmd = hdparm -a32 -r0 %s
> +            high_status_cmd = hdparm -a256 -r1 %s
> +
>
>   # NICs
>   variants:
>
> _______________________________________________
> Autotest mailing list
> Autotest@test.kernel.org
> http://test.kernel.org/cgi-bin/mailman/listinfo/autotest

--
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
Lucas Meneghel Rodrigues Aug. 3, 2011, 11:40 p.m. UTC | #2
It does look sane to me too. However, I find this to work only under
virtio_blk. (ide hard drive that qemu has doesn't have the needed
ioctls for hdparm to work)

Amos and Feng, I'll trust that this somehow should pass on non-virtio,
so I won't restrict it to virtio_blk. I made some minor changes to the
test that make the logs look a lot better. Other than that, excellent
work, thank you very much!

http://autotest.kernel.org/changeset/5519

On Wed, Aug 3, 2011 at 11:19 AM, Lukáš Doktor <ldoktor@redhat.com> wrote:
> Reviewed, looks sane.
>
> Lukáš
>
> Dne 2.8.2011 05:39, Amos Kong napsal(a):
>> This test uses 'hdparm' to set disk device to low/high
>> performance status, and compare the reading speed.
>> The emulated device should pass all the tests.
>>
>> Signed-off-by: Feng Yang<fyang@redhat.com>
>> Signed-off-by: Amos Kong<akong@redhat.com>
>> ---
>>   client/tests/kvm/tests/hdparm.py       |   84 ++++++++++++++++++++++++++++++++
>>   client/tests/kvm/tests_base.cfg.sample |   13 +++++
>>   2 files changed, 97 insertions(+), 0 deletions(-)
>>   create mode 100644 client/tests/kvm/tests/hdparm.py
>>
>> diff --git a/client/tests/kvm/tests/hdparm.py b/client/tests/kvm/tests/hdparm.py
>> new file mode 100644
>> index 0000000..79ce5db
>> --- /dev/null
>> +++ b/client/tests/kvm/tests/hdparm.py
>> @@ -0,0 +1,84 @@
>> +import re, logging
>> +from autotest_lib.client.common_lib import error
>> +
>> +
>> +@error.context_aware
>> +def run_hdparm(test, params, env):
>> +    """
>> +    Test hdparm setting on linux guest os, this case will:
>> +    1) Set/record parameters value of hard disk to low performance status.
>> +    2) Perform device/cache read timings then record the results.
>> +    3) Set/record parameters value of hard disk to high performance status.
>> +    4) Perform device/cache read timings then compare two results.
>> +
>> +    @param test: kvm test object
>> +    @param params: Dictionary with the test parameters
>> +    @param env: Dictionary with test environmen.
>> +    """
>> +
>> +    def check_setting_result(set_cmd, timeout):
>> +        params = re.findall("(-[a-zA-Z])([0-9]*)", set_cmd)
>> +        disk = re.findall("(\/+[a-z]*\/[a-z]*$)", set_cmd)[0]
>> +        for (param, value) in params:
>> +            cmd = "hdparm %s %s" % (param, disk)
>> +            (s, output) = session.cmd_status_output(cmd, timeout)
>> +            if s != 0:
>> +                raise error.TestError("Fail to get %s parameter value\n"
>> +                                     "Output is: %s" % (param, output))
>> +            if value not in output:
>> +                 raise error.TestFail("Fail to set %s parameter to value: %s"
>> +                                      % (param, value))
>> +
>> +
>> +    def perform_read_timing(disk, timeout, num=5):
>> +        results = 0
>> +        for i in range(num):
>> +            cmd = params.get("device_cache_read_cmd") % disk
>> +            (s, output) = session.cmd_status_output(cmd, timeout)
>> +            if s != 0:
>> +                raise error.TestFail("Fail to perform device/cache read"
>> +                                     " timings \nOutput is: %s\n" % output)
>> +            logging.info("Output of device/cache read timing check(%s of %s):"
>> +                          " %s" % (i + 1, num, output))
>> +            (result, post) = re.findall("= *([0-9]*.+[0-9]*) ([a-zA-Z]*)",
>> +                             output)[1]
>> +            if post == "kB":
>> +                result = float(result)/1024.0
>> +            results += float(result)
>> +        return results/num
>> +
>> +    vm = env.get_vm(params["main_vm"])
>> +    vm.create()
>> +    session = vm.wait_for_login(timeout=int(params.get("login_timeout", 360)))
>> +    try:
>> +        timeout = float(params.get("cmd_timeout", 60))
>> +        cmd = params.get("get_disk_cmd")
>> +        (s, output) = session.cmd_status_output(cmd)
>> +        disk = output.strip()
>> +
>> +        error.context("Setting hard disk to lower performance")
>> +        cmd = params.get("low_status_cmd") % disk
>> +        session.cmd(cmd, timeout)
>> +
>> +        error.context("Checking hard disk keyval under lower performance")
>> +        check_setting_result(cmd, timeout)
>> +        low_result = perform_read_timing(disk, timeout)
>> +        logging.info("Buffered disk read speed under low performance"
>> +                     " configuration: %s" % low_result)
>> +        error.context("Setting hard disk to higher performance")
>> +        cmd = params.get("high_status_cmd") % disk
>> +        session.cmd(cmd, timeout)
>> +
>> +        error.context("Checking hard disk keyval under higher performance")
>> +        check_setting_result(cmd, timeout)
>> +        high_result = perform_read_timing(disk, timeout)
>> +        logging.info("Buffered disk read speed under high performance"
>> +                     " configuration: %s" % high_result)
>> +        if not float(high_result)>  float(low_result):
>> +            raise error.TestFail("High performance setting does not "
>> +                                 "increase read speed\n")
>> +        logging.debug("High performance setting increased read speed!")
>> +
>> +    finally:
>> +        if session:
>> +            session.close()
>> diff --git a/client/tests/kvm/tests_base.cfg.sample b/client/tests/kvm/tests_base.cfg.sample
>> index d597b52..5491630 100644
>> --- a/client/tests/kvm/tests_base.cfg.sample
>> +++ b/client/tests/kvm/tests_base.cfg.sample
>> @@ -1115,6 +1115,19 @@ variants:
>>           image_snapshot = yes
>>           only Linux
>>
>> +    - hdparm:
>> +        type = hdparm
>> +        get_disk_cmd = \ls /dev/[vhs]da
>> +        low_status_cmd = hdparm -a64 -d0 -u0 %s
>> +        device_cache_read_cmd = hdparm -tT %s
>> +        high_status_cmd = hdparm -a256 -d1 -u1 %s
>> +        cmd_timeout = 540
>> +        only Linux
>> +        virtio_blk:
>> +            get_disk_cmd = \ls /dev/vda
>> +            low_status_cmd = hdparm -a32 -r0 %s
>> +            high_status_cmd = hdparm -a256 -r1 %s
>> +
>>
>>   # NICs
>>   variants:
>>
>> _______________________________________________
>> Autotest mailing list
>> Autotest@test.kernel.org
>> http://test.kernel.org/cgi-bin/mailman/listinfo/autotest
>
> _______________________________________________
> Autotest mailing list
> Autotest@test.kernel.org
> http://test.kernel.org/cgi-bin/mailman/listinfo/autotest
>
diff mbox

Patch

diff --git a/client/tests/kvm/tests/hdparm.py b/client/tests/kvm/tests/hdparm.py
new file mode 100644
index 0000000..79ce5db
--- /dev/null
+++ b/client/tests/kvm/tests/hdparm.py
@@ -0,0 +1,84 @@ 
+import re, logging
+from autotest_lib.client.common_lib import error
+
+
+@error.context_aware
+def run_hdparm(test, params, env):
+    """
+    Test hdparm setting on linux guest os, this case will:
+    1) Set/record parameters value of hard disk to low performance status.
+    2) Perform device/cache read timings then record the results.
+    3) Set/record parameters value of hard disk to high performance status.
+    4) Perform device/cache read timings then compare two results.
+
+    @param test: kvm test object
+    @param params: Dictionary with the test parameters
+    @param env: Dictionary with test environmen.
+    """
+
+    def check_setting_result(set_cmd, timeout):
+        params = re.findall("(-[a-zA-Z])([0-9]*)", set_cmd)
+        disk = re.findall("(\/+[a-z]*\/[a-z]*$)", set_cmd)[0]
+        for (param, value) in params:
+            cmd = "hdparm %s %s" % (param, disk)
+            (s, output) = session.cmd_status_output(cmd, timeout)
+            if s != 0:
+                raise error.TestError("Fail to get %s parameter value\n"
+                                     "Output is: %s" % (param, output))
+            if value not in output:
+                 raise error.TestFail("Fail to set %s parameter to value: %s"
+                                      % (param, value))
+
+
+    def perform_read_timing(disk, timeout, num=5):
+        results = 0
+        for i in range(num):
+            cmd = params.get("device_cache_read_cmd") % disk
+            (s, output) = session.cmd_status_output(cmd, timeout)
+            if s != 0:
+                raise error.TestFail("Fail to perform device/cache read"
+                                     " timings \nOutput is: %s\n" % output)
+            logging.info("Output of device/cache read timing check(%s of %s):"
+                          " %s" % (i + 1, num, output))
+            (result, post) = re.findall("= *([0-9]*.+[0-9]*) ([a-zA-Z]*)",
+                             output)[1]
+            if post == "kB":
+                result = float(result)/1024.0
+            results += float(result)
+        return results/num
+
+    vm = env.get_vm(params["main_vm"])
+    vm.create()
+    session = vm.wait_for_login(timeout=int(params.get("login_timeout", 360)))
+    try:
+        timeout = float(params.get("cmd_timeout", 60))
+        cmd = params.get("get_disk_cmd")
+        (s, output) = session.cmd_status_output(cmd)
+        disk = output.strip()
+
+        error.context("Setting hard disk to lower performance")
+        cmd = params.get("low_status_cmd") % disk
+        session.cmd(cmd, timeout)
+
+        error.context("Checking hard disk keyval under lower performance")
+        check_setting_result(cmd, timeout)
+        low_result = perform_read_timing(disk, timeout)
+        logging.info("Buffered disk read speed under low performance"
+                     " configuration: %s" % low_result)
+        error.context("Setting hard disk to higher performance")
+        cmd = params.get("high_status_cmd") % disk
+        session.cmd(cmd, timeout)
+
+        error.context("Checking hard disk keyval under higher performance")
+        check_setting_result(cmd, timeout)
+        high_result = perform_read_timing(disk, timeout)
+        logging.info("Buffered disk read speed under high performance"
+                     " configuration: %s" % high_result)
+        if not float(high_result) > float(low_result):
+            raise error.TestFail("High performance setting does not "
+                                 "increase read speed\n")
+        logging.debug("High performance setting increased read speed!")
+
+    finally:
+        if session:
+            session.close()
diff --git a/client/tests/kvm/tests_base.cfg.sample b/client/tests/kvm/tests_base.cfg.sample
index d597b52..5491630 100644
--- a/client/tests/kvm/tests_base.cfg.sample
+++ b/client/tests/kvm/tests_base.cfg.sample
@@ -1115,6 +1115,19 @@  variants:
         image_snapshot = yes
         only Linux
 
+    - hdparm:
+        type = hdparm
+        get_disk_cmd = \ls /dev/[vhs]da
+        low_status_cmd = hdparm -a64 -d0 -u0 %s
+        device_cache_read_cmd = hdparm -tT %s
+        high_status_cmd = hdparm -a256 -d1 -u1 %s
+        cmd_timeout = 540
+        only Linux
+        virtio_blk:
+            get_disk_cmd = \ls /dev/vda
+            low_status_cmd = hdparm -a32 -r0 %s
+            high_status_cmd = hdparm -a256 -r1 %s
+
 
 # NICs
 variants: