This patch introduces new test for testing short-lived connections. The
topology is the same as in regression-tests/phase1/simple_netperf test.
It's two baremetal hosts, each with one NIC. Measurement tool is
netperf, test types are TCP_RR and TCP_CRR. For both test types, the
test is run with these Request/Response sizes: 1K, 5K, 7K, 10K, 12K.
The test does have working integration with PerfRepo and uses all
aliases used in regression-tests/.
Signed-off-by: Jiri Prochazka <jprochaz(a)redhat.com>
---
.../short_lived_connections.py | 169 +++++++++++++++++++++
.../short_lived_connections.xml | 43 ++++++
2 files changed, 212 insertions(+)
create mode 100644 recipes/short-lived-connections/short_lived_connections.py
create mode 100644 recipes/short-lived-connections/short_lived_connections.xml
diff --git a/recipes/short-lived-connections/short_lived_connections.py
b/recipes/short-lived-connections/short_lived_connections.py
new file mode 100644
index 0000000..0b07f61
--- /dev/null
+++ b/recipes/short-lived-connections/short_lived_connections.py
@@ -0,0 +1,169 @@
+from lnst.Controller.Task import ctl
+from lnst.Controller.PerfRepoUtils import netperf_baseline_template
+from lnst.Controller.PerfRepoUtils import netperf_result_template
+
+from lnst.RecipeCommon.IRQ import pin_dev_irqs
+from lnst.RecipeCommon.PerfRepo import generate_perfrepo_comment
+
+# ------
+# SETUP
+# ------
+
+mapping_file = ctl.get_alias("mapping_file")
+perf_api = ctl.connect_PerfRepo(mapping_file)
+
+product_name = ctl.get_alias("product_name")
+
+m1 = ctl.get_host("machine1")
+m2 = ctl.get_host("machine2")
+
+m1.sync_resources(modules=["Netperf"])
+m2.sync_resources(modules=["Netperf"])
+
+# ------
+# TESTS
+# ------
+
+mtu = ctl.get_alias("mtu")
+netperf_duration = int(ctl.get_alias("netperf_duration"))
+nperf_reserve = int(ctl.get_alias("nperf_reserve"))
+nperf_confidence = ctl.get_alias("nperf_confidence")
+nperf_max_runs = int(ctl.get_alias("nperf_max_runs"))
+nperf_cpupin = ctl.get_alias("nperf_cpupin")
+nperf_cpu_util = ctl.get_alias("nperf_cpu_util")
+nperf_mode = ctl.get_alias("nperf_mode")
+nperf_num_parallel = int(ctl.get_alias("nperf_num_parallel"))
+nperf_debug = ctl.get_alias("nperf_debug")
+nperf_max_dev = ctl.get_alias("nperf_max_dev")
+pr_user_comment = ctl.get_alias("perfrepo_comment")
+
+m1_testiface = m1.get_interface("testiface")
+m2_testiface = m2.get_interface("testiface")
+
+m1_testiface.set_mtu(mtu)
+m2_testiface.set_mtu(mtu)
+
+pr_comment = generate_perfrepo_comment([m1, m2], pr_user_comment)
+
+if nperf_cpupin:
+ m1.run("service irqbalance stop")
+ m2.run("service irqbalance stop")
+
+ for m, d in [ (m1, m1_testiface), (m2, m2_testiface) ]:
+ pin_dev_irqs(m, d, 0)
+
+p_opts = "-L %s" % (m2_testiface.get_ip(0))
+
+if nperf_cpupin and nperf_mode != "multi":
+ p_opts += " -T%s,%s" % (nperf_cpupin, nperf_cpupin)
+
+for size in ["1K,1K", "5K,5K", "7K,7K",
"10K,10K", "12K,12K"]:
+
+ n_p_opts = p_opts
+
+ netperf_cli_tcp_rr = ctl.get_module("Netperf",
+ options={
+ "role" : "client",
+ "netperf_server" :
m1_testiface.get_ip(0),
+ "duration" : netperf_duration,
+ "testname" : "TCP_RR",
+ "confidence" : nperf_confidence,
+ "cpu_util" : nperf_cpu_util,
+ "runs" : nperf_max_runs,
+ "netperf_opts" : n_p_opts,
+ "max_deviation" : nperf_max_dev,
+ "debug" : nperf_debug,
+ "testoptions" : "-r %s" %
size
+ })
+
+
+ netperf_cli_tcp_crr = ctl.get_module("Netperf",
+ options={
+ "role" : "client",
+ "netperf_server" :
m1_testiface.get_ip(0),
+ "duration" : netperf_duration,
+ "testname" : "TCP_CRR",
+ "confidence" : nperf_confidence,
+ "cpu_util" : nperf_cpu_util,
+ "runs" : nperf_max_runs,
+ "netperf_opts" : n_p_opts,
+ "max_deviation" : nperf_max_dev,
+ "debug" : nperf_debug,
+ "testoptions" : "-r %s" %
size
+ })
+
+
+ netperf_srv = ctl.get_module("Netperf",
+ options={
+ "role" : "server",
+ "bind" : m1_testiface.get_ip(0)
+ })
+
+ if nperf_mode == "multi":
+ netperf_cli_tcp_rr.unset_option("confidence")
+ netperf_cli_tcp_crr.unset_option("confidence")
+
+ netperf_cli_tcp_rr.update_options({"num_parallel":
nperf_num_parallel})
+ netperf_cli_tcp_crr.update_options({"num_parallel":
nperf_num_parallel})
+
+ # we have to use multiqueue qdisc to get appropriate data
+ m1.run("tc qdisc replace dev %s root mq" % m1_phy1.get_devname())
+ m2.run("tc qdisc replace dev %s root mq" % m2_phy1.get_devname())
+
+ ctl.wait(15)
+
+ # Netperf test
+ srv_proc = m1.run(netperf_srv, bg=True)
+ ctl.wait(2)
+
+ # prepare PerfRepo result for tcp_rr
+ result_tcp_rr = perf_api.new_result("tcp_rr_id",
+ "tcp_rr_result",
+ hash_ignore=[
+ 'kernel_release',
+ 'redhat_release'])
+ result_tcp_rr.add_tag(product_name)
+ if nperf_mode == "multi":
+ result_tcp_rr.add_tag("multithreaded")
+ result_tcp_rr.set_parameter('num_parallel', nperf_num_parallel)
+
+ result_tcp_rr.set_parameter("rr_size", size)
+
+ baseline = perf_api.get_baseline_of_result(result_tcp_rr)
+ netperf_baseline_template(netperf_cli_tcp_rr, baseline, test_type="RR")
+
+ tcp_rr_res_data = m2.run(netperf_cli_tcp_rr,
+ timeout = (netperf_duration + nperf_reserve)*nperf_max_runs)
+
+ netperf_result_template(result_tcp_rr, tcp_rr_res_data, test_type="RR")
+ result_tcp_rr.set_comment(pr_comment)
+ perf_api.save_result(result_tcp_rr)
+
+ # prepare PerfRepo result for tcp_crr
+ result_tcp_crr = perf_api.new_result("tcp_crr_id",
+ "tcp_crr_result",
+ hash_ignore=[
+ 'kernel_release',
+ 'redhat_release'])
+ result_tcp_crr.add_tag(product_name)
+ if nperf_mode == "multi":
+ result_tcp_crr.add_tag("multithreaded")
+ result_tcp_crr.set_parameter('num_parallel', nperf_num_parallel)
+
+ result_tcp_crr.set_parameter("rr_size", size)
+
+ baseline = perf_api.get_baseline_of_result(result_tcp_crr)
+ netperf_baseline_template(netperf_cli_tcp_crr, baseline, test_type="RR")
+
+ tcp_crr_res_data = m2.run(netperf_cli_tcp_crr,
+ timeout = (netperf_duration + nperf_reserve)*nperf_max_runs)
+
+ netperf_result_template(result_tcp_crr, tcp_crr_res_data, test_type="RR")
+ result_tcp_crr.set_comment(pr_comment)
+ perf_api.save_result(result_tcp_crr)
+
+ srv_proc.intr()
+
+if nperf_cpupin:
+ m1.run("service irqbalance start")
+ m2.run("service irqbalance start")
diff --git a/recipes/short-lived-connections/short_lived_connections.xml
b/recipes/short-lived-connections/short_lived_connections.xml
new file mode 100644
index 0000000..289205e
--- /dev/null
+++ b/recipes/short-lived-connections/short_lived_connections.xml
@@ -0,0 +1,43 @@
+<lnstrecipe>
+ <define>
+ <alias name="mtu" value="1500" />
+ <alias name="netperf_duration" value="60" />
+ <alias name="nperf_reserve" value="20" />
+ <alias name="nperf_confidence" value="99,5" />
+ <alias name="nperf_max_runs" value="5" />
+ <alias name="nperf_mode" value="default"/>
+ <alias name="nperf_num_parallel" value="2"/>
+ <alias name="nperf_debug" value="0"/>
+ <alias name="nperf_max_dev" value="20%"/>
+ <alias name="mapping_file"
value="short_lived_connections.mapping" />
+ <alias name="net" value="192.168.101" />
+ <alias name="driver" value="ixgbe" />
+ </define>
+ <network>
+ <host id="machine1">
+ <interfaces>
+ <eth id="testiface" label="testnet">
+ <params>
+ <param name="driver"
value="{$driver}"/>
+ </params>
+ <addresses>
+ <address>{$net}.10/24</address>
+ </addresses>
+ </eth>
+ </interfaces>
+ </host>
+ <host id="machine2">
+ <interfaces>
+ <eth id="testiface" label="testnet">
+ <params>
+ <param name="driver"
value="{$driver}"/>
+ </params>
+ <addresses>
+ <address>{$net}.11/24</address>
+ </addresses>
+ </eth>
+ </interfaces>
+ </host>
+ </network>
+ <task python="short_lived_connections.py"/>
+</lnstrecipe>
--
2.9.4