Currently we use many threads/heavy control sessions to launch many
clients, Autotest takes too much host resouse.

This patch introduced an agent script, we execute it insider client
system to launch multiple sessions, and Autotest only need to use one
background thread to control clients.

We can consider to process the raw results in this agent script in
future, if it can help to simplify the case.

Signed-off-by: Amos Kong <[email protected]>
---
 shared/scripts/netperf_agent.py |   24 +++++++++++++++++++++++
 tests/netperf.py                |   40 ++++++++++++++------------------------
 2 files changed, 39 insertions(+), 25 deletions(-)
 create mode 100755 shared/scripts/netperf_agent.py

diff --git a/shared/scripts/netperf_agent.py b/shared/scripts/netperf_agent.py
new file mode 100755
index 0000000..294f447
--- /dev/null
+++ b/shared/scripts/netperf_agent.py
@@ -0,0 +1,24 @@
+#!/usr/bin/python
+"""
+@author Amos Kong <[email protected]>
+
+"""
+import os, sys, time
+
+if len(sys.argv) < 4:
+    print """ netperf agent usage:
+    %s [session_number] [netperf_path] [netperf_parameters_str]
+
+    $session_number: number of client sessions
+    $netperf_path: client path
+    $netperf_parameter_str: netperf parameters string""" % sys.argv[0]
+    sys.exit()
+
+n = int(sys.argv[1])
+path = sys.argv[2]
+params = " ".join(sys.argv[3:])
+
+for i in range(n - 1):
+    os.system("%s %s &" % (path, params))
+os.system("%s %s" % (path, params))
+
diff --git a/tests/netperf.py b/tests/netperf.py
index 999b523..aad0f91 100644
--- a/tests/netperf.py
+++ b/tests/netperf.py
@@ -90,6 +90,9 @@ def run_netperf(test, params, env):
                                      "%s/%s" % (netperf_dir, i), "/tmp/")
         ssh_cmd(session, params.get("setup_cmd"))
 
+        agent_path =  os.path.join(test.virtdir, "scripts/netperf_agent.py")
+        remote.scp_to_remote(ip, shell_port, username, password,
+                             agent_path, "/tmp/")
 
     def _pin_vm_threads(vm, node):
         if node:
@@ -159,14 +162,8 @@ def run_netperf(test, params, env):
     client = params.get("client", "localhost")
     client_ip = client
     clients = []
-    clients_n = 1
-    # Get the sessions that needed when run netperf parallel
-    # The default client connect is the first one.
-    if params.get("sessions") or params.get("sessions_rr"):
-        sessions_str = params.get('sessions') + " " + params.get("sessions_rr")
-        for i in sessions_str.split():
-            clients_n = max(clients_n, int(i.strip()))
-    for i in range(clients_n + 1):
+    # client session 1 for control, session 2 for data communication
+    for i in range(2):
         if client in params.get("vms"):
             vm_client = utils_test.get_living_vm(env, client)
             tmp = vm_client.wait_for_login(timeout=login_timeout)
@@ -472,15 +469,10 @@ def launch_client(sessions, server, server_ctl, host, 
clients, l, nf_args,
             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 -D 1 -H %s -l %s %s" % (client_path, server, int(l)*1.5, 
nf_args)
+        cmd += "/tmp/netperf_agent.py %d %s -D 1 -H %s -l %s %s" % (i,
+               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):
@@ -516,14 +508,13 @@ def launch_client(sessions, server, server_ctl, host, 
clients, l, nf_args,
     pid = str(os.getpid())
     fname = "/tmp/netperf.%s.nf" % pid
     ssh_cmd(clients[-1], "rm -f %s" % fname)
-    threads = []
     numa_enable = params.get("netperf_with_numa", "yes") == "yes"
-    for i in range(int(sessions)):
-        t = threading.Thread(target=netperf_thread,
-                             kwargs={"i": i, "numa_enable": numa_enable,
-                                     "client_s":clients[i]})
-        threads.append(t)
-        t.start()
+    client_thread = threading.Thread(target=netperf_thread,
+                                     kwargs={"i": int(sessions),
+                                     "numa_enable": numa_enable,
+                                     "client_s":clients[0]})
+    client_thread.start()
+
     ret = {}
     ret['pid'] = pid
 
@@ -554,9 +545,8 @@ 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()
+
+    client_thread.join()
 
     # recover result file to remove the noise from end
     f = open(fname, "w")
-- 
1.7.1

_______________________________________________
Virt-test-devel mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/virt-test-devel

Reply via email to