On Fri, Dec 21, 2012 at 11:07:43AM +0800, wenli wrote:
> On Thu 20 Dec 2012 11:23:39 AM CST, Amos Kong wrote:
> >Enable demo mode of netperf, process mixed demo results to drop
> >unstable factors, only compute the effective demo results when
> >all the threads work. This would make performance result more
> >stable.
> >
> >We start many clients and watch the demo output, if all the threads
> >really work, then start to record the interrupt/packet number, and
> >count the cpu usage. After a fixed test time, record the final
> >interrupt/packet number.
> >
> >Signed-off-by: Amos Kong<[email protected]>
> >---
> > shared/cfg/subtests.cfg.sample | 2 +-
> > tests/netperf.py | 95
> > ++++++++++++++++++++++++++++-----------
> > 2 files changed, 69 insertions(+), 28 deletions(-)
> >
> >diff --git a/shared/cfg/subtests.cfg.sample b/shared/cfg/subtests.cfg.sample
> >index df30cdb..9b5bedd 100644
> >--- a/shared/cfg/subtests.cfg.sample
> >+++ b/shared/cfg/subtests.cfg.sample
> >@@ -2480,7 +2480,7 @@ variants:
> > # bridge_nic2 = switch
> > nic_model_nic2 = e1000
> > netperf_files = netperf-2.6.0.tar.bz2
> >- setup_cmd = "cd /tmp&& rm -rf netperf-2.6.0&& tar xvfj
> >netperf-2.6.0.tar.bz2&& cd netperf-2.6.0&& ./configure --enable-burst&&
> >make"
> >+ setup_cmd = "cd /tmp&& rm -rf netperf-2.6.0&& tar xvfj
> >netperf-2.6.0.tar.bz2&& cd netperf-2.6.0&& ./configure --enable-burst
> >--enable-demo=yes&& make"
> > # configure netperf test parameters
> > l = 60
> > protocols = "TCP_STREAM TCP_MAERTS TCP_RR"
> >diff --git a/tests/netperf.py b/tests/netperf.py
> >index cde8a39..68090fc 100644
> >--- a/tests/netperf.py
> >+++ b/tests/netperf.py
> >@@ -1,4 +1,4 @@
> >-import logging, os, commands, threading, re, glob, time
> >+import logging, os, commands, threading, re, glob, time, shutil
> > from autotest.client import utils
> > from autotest.client.shared import error
> > from virttest import utils_test, utils_misc, remote
> >@@ -247,18 +247,6 @@ def start_test(server, server_ctl, host, clients,
> >resultsdir, l=60,
> > @param server_cyg: shell session for cygwin in windows guest
> > """
> >
> >- def parse_file(file_prefix, raw=""):
> >- """ Parse result files and reture throughput total """
> >- thu = 0
> >- for filename in glob.glob("%s.*.nf" % file_prefix):
> >- o = commands.getoutput("cat %s |tail -n 1" % filename)
> >- try:
> >- thu += float(o.split()[raw])
> >- except Exception:
> >- logging.debug(commands.getoutput("cat %s.*" % file_prefix))
> >- return -1
> >- return thu
> >-
> > guest_ver_cmd = params.get("guest_ver_cmd", "uname -r")
> > fd = open("%s/netperf-result.%s.RHS" % (resultsdir, time.time()), "w")
> >
> >@@ -307,19 +295,18 @@ def start_test(server, server_ctl, host, clients,
> >resultsdir, l=60,
> > for j in sessions_test:
> > if (protocol == "TCP_RR"):
> > ret = launch_client(j, server, server_ctl, host,
> > clients, l,
> >- "-t %s -v 0 -P -0 -- -r %s,%s" % (protocol, i, i),
> >+ "-t %s -v 1 -- -r %s,%s" % (protocol, i, i),
> > netserver_port, params, server_cyg)
> >- thu = parse_file("/tmp/netperf.%s" % ret['pid'], 0)
> > elif (protocol == "TCP_MAERTS"):
> > ret = launch_client(j, server, server_ctl, host,
> > clients, l,
> > "-C -c -t %s -- -m ,%s" % (protocol,
> > i),
> > netserver_port, params, server_cyg)
> >- thu = parse_file("/tmp/netperf.%s" % ret['pid'], 4)
> > else:
> > ret = launch_client(j, server, server_ctl, host,
> > clients, l,
> > "-C -c -t %s -- -m %s" % (protocol,
> > i),
> > netserver_port, params, server_cyg)
> >- thu = parse_file("/tmp/netperf.%s" % ret['pid'], 4)
> >+
> >+ thu = float(ret['thu'])
> > cpu = 100 - float(ret['mpstat'].split()[mpstat_index])
> > normal = thu / cpu
> > if ret.get('rx_pkts') and ret.get('irq_inj'):
> >@@ -353,7 +340,7 @@ def start_test(server, server_ctl, host, clients,
> >resultsdir, l=60,
> >
> > fd.flush()
> > logging.debug("Remove temporary files")
> >- commands.getoutput("rm -f /tmp/netperf.%s.*.nf" %
> >ret['pid'])
> >+ commands.getoutput("rm -f /tmp/netperf.%s.nf" % ret['pid'])
> > fd.close()
> >
> >
> >@@ -472,19 +459,51 @@ def launch_client(sessions, server, server_ctl, host,
> >clients, l, nf_args,
> >
> > def netperf_thread(i, numa_enable, client_s):
> > cmd = ""
> >+ fname = "/tmp/netperf.%s.nf" % pid
> > if numa_enable:
> > output = ssh_cmd(client_s, "numactl --hardware")
> > n = int(re.findall("available: (\d+) nodes", output)[0]) - 1
> > cmd += "numactl --cpunodebind=%s --membind=%s " % (n, n)
> >- cmd += "%s -H %s -l %s %s" % (client_path, server, l, nf_args)
> >+ cmd += "%s -D 1 -H %s -l %s %s" % (client_path, server, int(l)*1.5,
> >nf_args)
> >+ cmd += ">> %s" % fname
> >+
> >+ ssh_cmd(client_s, cmd)
> >+ output = ssh_cmd(client_s, "cat %s" % fname)
> >+ if not os.path.exists(fname):
> >+ f = file(fname, "w")
> >+ f.write(output)
> >+ f.close()
> >+
> >+
> >+ def parse_demo_result(fname, sessions):
> >+ """
> >+ Process the demo result, remove the noise from head,
> >+ and compute the final throughout.
> >+
> >+ @param fname: result file name
> >+ @param sessions: sessions' number
> >+ """
> >+ fd = open(fname)
> >+ lines = fd.readlines()
> >+ fd.close()
> >+
> >+ for i in range(1, len(lines)+1):
> >+ if "AF_INET" in lines[-i]:
> >+ break
> >+ nresult = i - 1
> >+ if nresult< int(sessions):
> >+ raise error.TestError("We couldn't expect this parallism,"
> >+ "expect %s get %s" % (sessions, nresult))
> >+
> >+ niteration = nresult / sessions
> >+ result = 0.0
> >+ for this in lines[-sessions * niteration:]:
logging.debug(this)
^^^ wenli, can you help to add this debug line, and provide the output
to me?
> >+ result += float(re.findall("Interim result: *(\S+)", this)[0])
>
> It seem's that result not like you except, error:
>
> Traceback (most recent call last):
> File "/usr/local/autotest-devel/client/shared/test.py", line 852,
> in _call_test_function
> return func(*args, **dargs)
> File "/usr/local/autotest-devel/client/shared/test.py", line 304,
> in execute
> postprocess_profiled_run, args, dargs)
> File "/usr/local/autotest-devel/client/shared/test.py", line 221,
> in _call_run_once
> *args, **dargs)
> File "/usr/local/autotest-devel/client/shared/test.py", line 327,
> in run_once_profiling
> self.run_once(*args, **dargs)
> File "/usr/local/autotest-devel/client/virt/virt_test.py", line
> 101, in run_once
> run_func(self, params, env)
> File "/usr/local/autotest-devel/client/shared/error.py", line 138,
> in new_fn
> return fn(*args, **kwargs)
> File "/usr/local/autotest-devel/client/virt/tests/netperf.py", line
> 215, in run_netperf
> params=params, server_cyg=server_cyg, test=test)
> File "/usr/local/autotest-devel/client/shared/error.py", line 138,
> in new_fn
> return fn(*args, **kwargs)
> File "/usr/local/autotest-devel/client/virt/tests/netperf.py", line
> 314, in start_test
> netserver_port, params, server_cyg)
> File "/usr/local/autotest-devel/client/shared/error.py", line 138,
> in new_fn
> return fn(*args, **kwargs)
> File "/usr/local/autotest-devel/client/virt/tests/netperf.py", line
> 557, in launch_client
> ret['thu'] = parse_demo_result(fname, int(sessions))
> File "/usr/local/autotest-devel/client/virt/tests/netperf.py", line
> 500, in parse_demo_result
> print float(re.findall("Interim result: *(\S+)", this)[0])
> IndexError: list index out of range
>
>
> >+ result = result / niteration
> >+ logging.debug("niteration: %s" % niteration)
> >+ return result
> >
> >- output = ssh_cmd(client_s, cmd)
> >- f = file("/tmp/netperf.%s.%s.nf" % (pid, i), "w")
> >- f.write(output)
> >- f.close()
> >
> >- if get_status_flag:
> >- start_state = get_state()
> > pid = str(os.getpid())
> > threads = []
> > numa_enable = params.get("netperf_with_numa", "yes") == "yes"
> >@@ -496,10 +515,25 @@ def launch_client(sessions, server, server_ctl, host,
> >clients, l, nf_args,
> > t.start()
> > ret = {}
> > ret['pid'] = pid
> >+ fname = "/tmp/netperf.%s.nf" % pid
> >+ while True:
> >+ try:
> >+ fd = open(fname)
> >+ content = "".join(fd.readlines())
> >+ fd.close()
> >+ except IOError:
> >+ content = ""
> >+ if int(sessions) == len(re.findall("MIGRATE", content)):
> >+ logging.debug("All netperf clients start to work.")
> >+ break
> >+
> >+ # real& effective test starts
> >+ if get_status_flag:
> >+ start_state = get_state()
> > ret['mpstat'] = ssh_cmd(host, "mpstat 1 %d |tail -n 1" % (l - 1))
> >- for t in threads:
> >- t.join()
> >+ shutil.copy(fname, "/tmp/finished_result")
> >
> >+ # real& effective test ends
> > if get_status_flag:
> > end_state = get_state()
> > if len(start_state) != len(end_state):
> >@@ -511,4 +545,11 @@ def launch_client(sessions, server, server_ctl, host,
> >clients, l, nf_args,
> > for i in range(len(end_state) / 2):
> > ret[end_state[i * 2]] = (end_state[i * 2 + 1]
> > - start_state[i * 2 + 1])
> >+ # wait all the threads stop
> >+ for t in threads:
> >+ t.join()
> >+
> >+ # recover result file to remove the noise from end
> >+ shutil.copy("/tmp/finished_result", fname)
> >+ ret['thu'] = parse_demo_result(fname, int(sessions))
> > return ret
>
--
Amos.
_______________________________________________
Autotest-kernel mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/autotest-kernel