Re: [Qemu-devel] [RFC PATCH 12/14] KVM-test: Add a subtest of netperf

Lucas Meneghel Rodrigues
2010-07-30T16:32:11Z

On Tue, 2010-07-20 at 09:36 +0800, Amos Kong wrote:
> Add network load by netperf, server is launched on guest, execute netperf
> client with different protocols on host. if all clients execute successfully,
> case will be pass. Test result will be record into result.txt.
> Now this case only tests with "TCP_RR TCP_CRR UDP_RR TCP_STREAM TCP_MAERTS
> TCP_SENDFILE UDP_STREAM". DLPI only supported by Unix, unix domain test is
> not necessary, so drop test of DLPI and unix domain.

Some general thoughts about this test:
* netperf2 has a fairly good wrapper code, that can do postprocessing
of the results. It'd be good to make use of it. What I was thinking:
- Import the netperf2 wrapper class on host and call run_once with
appropriate parameters on host
- Create a client control file and run it on guest using
kvm_test_utils.run_autotest()
- As this approach wouldn't work on windows, we could make a
netperf_windows test that would be very much like this test.

Of course, we could do that on a later time, I don't think it is
something urgent anyway.

> Signed-off-by: Amos Kong <akong@redhat.com>
> ---
> 0 files changed, 0 insertions(+), 0 deletions(-)
>
> diff --git a/client/tests/kvm/tests/netperf.py b/client/tests/kvm/tests/netperf.py
> new file mode 100644
> index 0000000..00a91f0
> --- /dev/null
> +++ b/client/tests/kvm/tests/netperf.py
> @@ -0,0 +1,56 @@
> +import logging, commands, os
> +from autotest_lib.client.common_lib import error
> +import kvm_subprocess, kvm_test_utils, kvm_utils
> +
> +def run_netperf(test, params, env):
> + """
> + Network stress test with netperf
> +
> + 1) Boot up a virtual machine
> + 2) Launch netserver on guest
> + 3) Execute netperf client on host with different protocols
> + 4) Outout the test result
> +
> + @param test: Kvm test object
> + @param params: Dictionary with the test parameters.
> + @param env: Dictionary with test environment.
> + """
> + vm = kvm_test_utils.get_living_vm(env, params.get("main_vm"))
> + session = kvm_test_utils.wait_for_login(vm,
> + timeout=int(params.get("login_timeout", 360)))
> + netperf_dir = os.path.join(os.environ['AUTODIR'], "tests/netperf2")
> + setup_cmd = params.get("setup_cmd")
> + guest_ip = vm.get_address()
> + result_file = os.path.join(test.debugdir, "result.txt")

^ test.resultsdir would be better. Also, it's better if we take into
account the fact that we can have more than one iteration of the test,
so we'd have something like:

self.results_path = os.path.join(self.resultsdir, 'raw_output_%s' %self.iteration)

Which is what we are doing currently for other benchmarks.

> + session.get_command_output("service iptables stop")

^ Again I think it'd be better to simply flush the firewall rules with
iptables -F because that's more likely to work on different linux
guests.

Also, this linux specific command makes the entire test linux specific,
so we have to put a rule telling the kvm autotest to not run it on
windows guests.

> + for i in params.get("netperf_files").split():
> + if not vm.copy_files_to(os.path.join(netperf_dir, i), "/tmp"):
> + raise error.TestError("Could not copy files to guest")
> + if session.get_command_status(setup_cmd % "/tmp", timeout=100) != 0:
> + raise error.TestFail("Fail to setup netperf on guest")
> + if session.get_command_status(params.get("netserver_cmd") % "/tmp") != 0:
> + raise error.TestFail("Fail to start netperf server on guest")
> +
> + try:
> + logging.info("Setup and run netperf client on host")
> + s, o = commands.getstatusoutput(setup_cmd % netperf_dir)
> + if s != 0:
> + raise error.TestFail("Fail to setup netperf on host, o: %s" % o)
> + success = True
> + file(result_file, "w").write("Netperf Test Result\n")
> + for i in params.get("protocols").split():
> + cmd = params.get("netperf_cmd") % (netperf_dir, i, guest_ip)
> + logging.debug("Execute netperf client test: %s" % cmd)
> + s, o = commands.getstatusoutput(cmd)
> + if s != 0:
> + logging.error("Fail to execute netperf test, protocol:%s" % i)
> + success = False
> + else:
> + logging.info(o)
> + file(result_file, "a+").write("%s\n" % o)
> + if not success:
> + raise error.TestFail("Not all the test passed")

^ "Some of the netperf tests failed"

> + finally:
> + session.get_command_output("killall netserver")
> + session.close()
> diff --git a/client/tests/kvm/tests_base.cfg.sample b/client/tests/kvm/tests_base.cfg.sample
> index 7716d48..dec988e 100644
> --- a/client/tests/kvm/tests_base.cfg.sample
> +++ b/client/tests/kvm/tests_base.cfg.sample
> @@ -398,6 +398,16 @@ variants:
> type = mac_change
> kill_vm = yes
>
> + - netperf: install setup unattended_install.cdrom
> + type = netperf
> + nic_mode = tap
> + netperf_files = netperf-2.4.5.tar.bz2 wait_before_data.patch
> + setup_cmd = "cd %s && tar xvfj netperf-2.4.5.tar.bz2 && cd netperf-2.4.5 && patch -p0 < ../wait_before_data.patch && ./configure && make"
> + netserver_cmd = %s/netperf-2.4.5/src/netserver
> + # test time is 60 seconds, set the buffer size to 1 for more hardware interrupt
> + netperf_cmd = %s/netperf-2.4.5/src/netperf -t %s -H %s -l 60 -- -m 1
> + protocols = "TCP_STREAM TCP_MAERTS TCP_RR TCP_CRR UDP_RR TCP_SENDFILE UDP_STREAM"
> +
> - physical_resources_check: install setup unattended_install.cdrom
> type = physical_resources_check
> catch_uuid_cmd = dmidecode | awk -F: '/UUID/ {print $2}'
>
>