From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) by dpdk.org (Postfix) with ESMTP id 8C2622B88 for ; Thu, 2 Mar 2017 03:49:09 +0100 (CET) Received: from orsmga005.jf.intel.com ([10.7.209.41]) by orsmga104.jf.intel.com with ESMTP; 01 Mar 2017 18:49:08 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.35,228,1484035200"; d="scan'208";a="70630358" Received: from fmsmsx105.amr.corp.intel.com ([10.18.124.203]) by orsmga005.jf.intel.com with ESMTP; 01 Mar 2017 18:49:08 -0800 Received: from fmsmsx123.amr.corp.intel.com (10.18.125.38) by FMSMSX105.amr.corp.intel.com (10.18.124.203) with Microsoft SMTP Server (TLS) id 14.3.248.2; Wed, 1 Mar 2017 18:49:07 -0800 Received: from shsmsx103.ccr.corp.intel.com (10.239.4.69) by fmsmsx123.amr.corp.intel.com (10.18.125.38) with Microsoft SMTP Server (TLS) id 14.3.248.2; Wed, 1 Mar 2017 18:49:07 -0800 Received: from shsmsx102.ccr.corp.intel.com ([169.254.2.88]) by SHSMSX103.ccr.corp.intel.com ([10.239.4.69]) with mapi id 14.03.0248.002; Thu, 2 Mar 2017 10:49:04 +0800 From: "Pei, Yulong" To: "Liu, Yong" , "dts@dpdk.org" Thread-Topic: [PATCH 2/2] tests l3fwd: fix issue for performance test Thread-Index: AQHSkvVdRQD4YtbfPkKgHamY52ZROqGAQ44AgACP+iA= Date: Thu, 2 Mar 2017 02:49:03 +0000 Message-ID: <188971FCDA171749BED5DA74ABF3E6F03B690748@shsmsx102.ccr.corp.intel.com> References: <1488418539-8237-1-git-send-email-yulong.pei@intel.com> <1488418539-8237-2-git-send-email-yulong.pei@intel.com> <86228AFD5BCD8E4EBFD2B90117B5E81E62D6CC33@SHSMSX103.ccr.corp.intel.com> In-Reply-To: <86228AFD5BCD8E4EBFD2B90117B5E81E62D6CC33@SHSMSX103.ccr.corp.intel.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-titus-metadata-40: eyJDYXRlZ29yeUxhYmVscyI6IiIsIk1ldGFkYXRhIjp7Im5zIjoiaHR0cDpcL1wvd3d3LnRpdHVzLmNvbVwvbnNcL0ludGVsMyIsImlkIjoiMDdjNjM2MjctZDI0NC00ZmE5LWIwYzYtNzliZTRjMmNlMzMxIiwicHJvcHMiOlt7Im4iOiJDVFBDbGFzc2lmaWNhdGlvbiIsInZhbHMiOlt7InZhbHVlIjoiQ1RQX0lDIn1dfV19LCJTdWJqZWN0TGFiZWxzIjpbXSwiVE1DVmVyc2lvbiI6IjE1LjkuNi42IiwiVHJ1c3RlZExhYmVsSGFzaCI6InRrZnhqU29yTmNcLzh0dllzM29lS3NnYTFMdHNcL1hFMnVnMWl4dGVJdlhrUT0ifQ== x-ctpclassification: CTP_IC x-originating-ip: [10.239.127.40] Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Subject: Re: [dts] [PATCH 2/2] tests l3fwd: fix issue for performance test X-BeenThere: dts@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: test suite reviews and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 02 Mar 2017 02:49:10 -0000 Hi, -----Original Message----- From: Liu, Yong=20 Sent: Thursday, March 2, 2017 9:54 AM To: Pei, Yulong ; dts@dpdk.org Subject: RE: [PATCH 2/2] tests l3fwd: fix issue for performance test Yulong, Some questions below. Thank, Marvin > -----Original Message----- > From: Pei, Yulong > Sent: Thursday, March 02, 2017 9:36 AM > To: dts@dpdk.org; Liu, Yong > Cc: Pei, Yulong > Subject: [PATCH 2/2] tests l3fwd: fix issue for performance test >=20 > 1. do changes due to dpdk example l3fwd src change. > 2. remove useless code. > 3. change calculate method for run_rfc2544 function. > 4. use tcp packet stream for traffic >=20 > Signed-off-by: Yulong Pei > --- > framework/tester.py | 24 ++--- > tests/TestSuite_l3fwd.py | 271=20 > ++++-------------------------------------- > ----- > 2 files changed, 27 insertions(+), 268 deletions(-) >=20 > diff --git a/framework/tester.py b/framework/tester.py index=20 > 50f687d..d793e91 100644 > --- a/framework/tester.py > +++ b/framework/tester.py > @@ -480,30 +480,20 @@ class Tester(Crb): >=20 > def run_rfc2544(self, portlist, delay=3D120, permit_loss_rate=3D0): > """ > - zero_rate: dpdk will not lost packet in this line rate. > - loss_rate: dpdk will loss packet in this line rate. > test_rate: the line rate we are going to test. > """ > - zero_rate =3D 0.0 > - loss_rate =3D 100.0 > - test_rate =3D 100.0 > + test_rate =3D float(100) >=20 > - while (loss_rate - zero_rate) > 0.002: > - self.logger.info("test rate: %f " % test_rate) > - if test_rate =3D=3D 100: > - lost, tx_num, rx_num =3D > self.traffic_generator_loss(portlist, test_rate, delay) > - else: > - lost, _, _ =3D self.traffic_generator_loss(portl= ist, > test_rate, delay) > - if lost > permit_loss_rate: > - loss_rate =3D test_rate > - test_rate =3D (test_rate + zero_rate)/2 > - else: > - zero_rate =3D test_rate > - test_rate =3D (test_rate + loss_rate)/2 > + self.logger.info("test rate: %f " % test_rate) > + loss_rate, tx_num, rx_num =3D=20 > + self.traffic_generator_loss(portlist, > test_rate, delay) > + while loss_rate > permit_loss_rate: > + test_rate =3D float(1 - loss_rate) * test_rate > + loss_rate, tx_num, rx_num =3D > self.traffic_generator_loss(portlist, test_rate, delay) Will this algorithm got same result like bisection algorithm? Based on the past performance test for Niantic , fvl 10G & 40G, it is more = accurate than before. >=20 > self.logger.info("zero loss rate is %s" % test_rate) > return test_rate, tx_num, rx_num >=20 > + > def traffic_generator_loss(self, portList, ratePercent, delay=3D60): > """ > Run loss performance test on specified ports. > diff --git a/tests/TestSuite_l3fwd.py b/tests/TestSuite_l3fwd.py index=20 > 43af04d..86fc29c 100644 > --- a/tests/TestSuite_l3fwd.py > +++ b/tests/TestSuite_l3fwd.py > @@ -93,7 +93,8 @@ class TestL3fwd(TestCase,IxiaPacketGenerator): > "{IPv4(13,101,0,0), 24, P3}", > ] >=20 > - frame_sizes =3D [64, 72, 128, 256, 512, 1024, 2048] # 65, 128 > + frame_sizes =3D [64, 72, 128, 256, 512, 1024, 1518, 2048] # 65,=20 > + 128 > + > methods =3D ['lpm']#, 'exact'] >=20 > # > @@ -114,8 +115,6 @@ class TestL3fwd(TestCase,IxiaPacketGenerator): > return '%s' % valports[int(portid)] >=20 > # > - # > - # > # Test cases. > # >=20 > @@ -151,13 +150,14 @@ class TestL3fwd(TestCase,IxiaPacketGenerator): >=20 > pat =3D re.compile("P([0123])") > # Update config file and rebuild to get best perf on FVL > -# self.dut.send_expect("sed -i -e > 's/CONFIG_RTE_PCI_CONFIG=3Dn/CONFIG_RTE_PCI_CONFIG=3Dy/'=20 > ./config/common_base", "#", 20) > -# self.dut.send_expect("sed -i -e > 's/CONFIG_RTE_PCI_EXTENDED_TAG=3D.*$/CONFIG_RTE_PCI_EXTENDED_TAG=3D\"on\"= / > ' ./ config/common_base", "#", 20) > -# self.dut.build_install_dpdk(self.target) > - > + self.dut.send_expect("sed -i -e > 's/CONFIG_RTE_PCI_CONFIG=3Dn/CONFIG_RTE_PCI_CONFIG=3Dy/'=20 > ./config/common_base", "#", 20) As I remember these two options won't affect performance anymore. Past performance test always with these two options , do you agree just kee= p it temporary ,=20 And remove it in the future after do more test for it. > + self.dut.send_expect("sed -i -e > 's/CONFIG_RTE_PCI_EXTENDED_TAG=3D.*$/CONFIG_RTE_PCI_EXTENDED_TAG=3D\"on\"= / > ' ./ config/common_base", "#", 20) > + self.dut.send_expect("sed -i -e 's/define > RTE_TEST_RX_DESC_DEFAULT.*$/define RTE_TEST_RX_DESC_DEFAULT 2048/'=20 > ./examples/l3fwd/main.c", "#", 20) > + self.dut.send_expect("sed -i -e 's/define > RTE_TEST_TX_DESC_DEFAULT.*$/define RTE_TEST_TX_DESC_DEFAULT 2048/'=20 > ./examples/l3fwd/main.c", "#", 20) > + self.dut.build_install_dpdk(self.target) >=20 > # Prepare long prefix match table, replace P(x) port pattern > - lpmStr =3D "static struct ipv4_l3fwd_route ipv4_l3fwd_route_arra= y[] > =3D {\\\n" > + lpmStr =3D "static struct ipv4_l3fwd_lpm_route > ipv4_l3fwd_lpm_route_array[] =3D {\\\n" > for idx in range(len(TestL3fwd.lpm_table)): > TestL3fwd.lpm_table[idx] =3D pat.sub(self.portRepl, > TestL3fwd.lpm_table[idx]) > lpmStr =3D lpmStr + ' ' * 4 + TestL3fwd.lpm_table[idx] +=20 > ",\\\n" > @@ -165,7 +165,7 @@ class TestL3fwd(TestCase,IxiaPacketGenerator): > self.logger.debug(lpmStr) >=20 > # Prepare host route table, replace P(x) port pattern > - exactStr =3D "static struct ipv4_l3fwd_route > ipv4_l3fwd_route_array[] =3D {\\\n" > + exactStr =3D "static struct ipv4_l3fwd_em_route > ipv4_l3fwd_em_route_array[] =3D {\\\n" > for idx in range(len(TestL3fwd.host_table)): > TestL3fwd.host_table[idx] =3D pat.sub(self.portRepl, > TestL3fwd.host_table[idx]) > exactStr =3D exactStr + ' ' * 4 + TestL3fwd.host_table[idx]= =20 > + ",\\\n" > @@ -173,7 +173,7 @@ class TestL3fwd(TestCase,IxiaPacketGenerator): > self.logger.debug(exactStr) >=20 > # Compile l3fwd with LPM lookup. > - self.dut.send_expect(r"sed -i > '/ipv4_l3fwd_route_array\[\].*{/,/^\}\;/c\\%s' examples/l3fwd/main.c"=20 > % lpmStr, "# ") > + self.dut.send_expect(r"sed -i > '/ipv4_l3fwd_lpm_route_array\[\].*{/,/^\}\;/c\\%s' > examples/l3fwd/l3fwd_lpm.c" % lpmStr, "# ") > out =3D self.dut.build_dpdk_apps("./examples/l3fwd",=20 > "USER_FLAGS=3D- > DAPP_LOOKUP_METHOD=3D1") > self.verify("Error" not in out, "compilation error 1") > self.verify("No such file" not in out, "compilation error 2")=20 > @@ -183,7 +183,7 @@ class TestL3fwd(TestCase,IxiaPacketGenerator): > out =3D self.dut.send_expect("make clean -C examples/l3fwd", "#= =20 > ") >=20 > # Compile l3fwd with hash/exact lookup. > - self.dut.send_expect(r"sed -i -e > '/ipv4_l3fwd_route_array\[\].*{/,/^\}\;/c\\%s' examples/l3fwd/main.c"=20 > % exactStr, "# ") > + self.dut.send_expect(r"sed -i -e > '/ipv4_l3fwd_em_route_array\[\].*{/,/^\}\;/c\\%s' > examples/l3fwd/l3fwd_em.c" % exactStr, "# ") > out =3D self.dut.build_dpdk_apps("./examples/l3fwd",=20 > "USER_FLAGS=3D- > DAPP_LOOKUP_METHOD=3D0") >=20 > self.verify("Error" not in out, "compilation error 1") @@=20 > -226,247 +226,12 @@ class TestL3fwd(TestCase,IxiaPacketGenerator): >=20 > return '%s,%s,%s' % (str(valports[int(pid)]), qid, lcid) >=20 > - def get_throughput(self, frame_size, rx_queues_per_port, cores_confi= g, > command_line): > - """ > - Get the throughput for a test case from test_cases_4_ports. > - """ > - > - output_pattern =3D re.compile("P([0123]),([0123]),(C\{\d.\d.\d\}= )") > - pat2 =3D re.compile("C\{\d") > - repl1 =3D "C{" + str(self.port_socket) > - > - bps =3D dict() > - pps =3D dict() > - pct =3D dict() > - > - global corelist > - corelist =3D [] > - > - > - while output_pattern.search(command_line): > - # If one socket case, we update the socket to ensure the core > used by l3fwd is on the same socket of the NIC. > - if cores_config.find('1S')>=3D0: > - command_line =3D pat2.sub(repl1,command_line) > - command_line =3D output_pattern.sub(self.repl, command_line) > - > - > - self.logger.debug("%s\n" % str(corelist)) > - core_mask =3D utils.create_mask(set(corelist)) > - > - # First, measure by two different methods > - for method in TestL3fwd.methods: > - # start l3fwd > - method_command_line =3D command_line % (TestL3fwd.path + > "l3fwd_" + method, > - core_mask, > - > self.dut.get_memory_channels(), > - > utils.create_mask(valports[:4])) > - > - if frame_size > 1518: > - method_command_line =3D method_command_line + " --enable- > jumbo --max-pkt-len %d" % frame_size > - self.rst_report(method_command_line + "\n", frame=3DTrue, > annex=3DTrue) > - > - out =3D self.dut.send_expect(method_command_line, "L3FWD:", = 120) > - > - # measure test > - tgen_input =3D [] > - for rxPort in range(4): > - if rxPort % 2 =3D=3D 0: > - tx_interface =3D > self.tester.get_local_port(valports[rxPort + 1]) > - else: > - tx_interface =3D > self.tester.get_local_port(valports[rxPort - 1]) > - > - rx_interface =3D > self.tester.get_local_port(valports[rxPort]) > - # Make sure the traffic send to the correct MAC address > - if rxPort % 2 =3D=3D 0: > - tgen_input.append((tx_interface, rx_interface, > "dst%d.pcap" % valports[rxPort+1])) > - else: > - tgen_input.append((tx_interface, rx_interface, > "dst%d.pcap" % valports[rxPort-1])) > - > - # FIX ME > - bps[method], pps[method] =3D > self.tester.traffic_generator_throughput(tgen_input) > - self.verify(pps[method] > 0, "No traffic detected") > - pps[method] /=3D 1000000.0 > - pct[method] =3D pps[method] * 100 / > float(self.wirespeed(self.nic, > - > frame_size, > - 4)) > - > - # stop l3fwd > - self.dut.send_expect("^C", "#") > - > - data_row =3D [frame_size, method, cores_config, rx_queues_per_po= rt] > - for method in TestL3fwd.methods: > - data_row.append(pps[method]) > - data_row.append(pct[method]) > - > - # generate report table > - self.result_table_add(data_row) > - self.l3fwd_test_results['data'].append(data_row) > - > def set_up(self): > """ > Run before each test case. > """ > pass >=20 > - def no_test_perf_l3fwd_4ports(self): > - """ > - L3fwd main 4 ports. > - """ > - > - # Based on h/w type, choose how many ports to use > - ports =3D self.dut.get_ports() > - # Verify that enough ports are available > - self.verify(len(ports) >=3D 4, "Insufficient ports for speed > testing") > - > - header_row =3D ["Frame size", "mode", "S/C/T", "RX Queues/NIC Po= rt"] > - > - for method in TestL3fwd.methods: > - header_row.append('%s Mpps' % method) > - header_row.append('% linerate') > - > - self.result_table_create(header_row) > - self.l3fwd_test_results['header'] =3D header_row > - self.l3fwd_test_results['data'] =3D [] > - > - for frame_size in TestL3fwd.frame_sizes: > - > - # Prepare traffic flow > - payload_size =3D frame_size - \ > - HEADER_SIZE['ip'] - HEADER_SIZE['eth'] > - > - for _port in range(4): > - dmac =3D self.dut.get_mac_address(valports[_port]) > - flows =3D ['Ether(dst=3D"%s")/%s/("X"*%d)' % (dmac, flow= , > payload_size) for flow in self.flows()[_port * 2:(_port + 1) * 2]] > - self.tester.scapy_append('wrpcap("dst%d.pcap", [%s])' % > (valports[_port], string.join(flows, ','))) > - > - self.tester.scapy_execute() > - > - self.rst_report("Flows for 4 ports, %d frame size.\n" % > (frame_size), > - annex=3DTrue) > - self.rst_report("%s" % string.join(flows, '\n'), > - frame=3DTrue, annex=3DTrue) > - > - # Get the number of sockets of the board > - number_sockets =3D self.dut.send_expect("grep > \"processor\|physical id\|core id\|^$\" /proc/cpuinfo | grep physical=20 > | sort -u | wc -l", "# ") > - number_sockets =3D int(number_sockets.split('\r\n')[0]) > - > - # Run case by case > - for test_case in TestL3fwd.test_cases_4_ports: > - > - # Check if the board has sockets enough for the test cas= e > - if number_sockets >=3D int(test_case[1].split('/')[0][0]= ): > - self.get_throughput(frame_size, *test_case) > - > - self.result_table_print() > - > - def no_test_perf_l3fwd_2ports(self): > - """ > - L3fwd main 2 ports. > - """ > - > - header_row =3D ["Frame", "mode", "S/C/T", "Mpps", "% linerate", > "latency_max(us)", "latency_min(us)", "latency_avg(us)"] > - self.l3fwd_test_results['header'] =3D header_row > - self.result_table_create(header_row) > - self.l3fwd_test_results['data'] =3D [] > - > - for frame_size in TestL3fwd.frame_sizes: > - > - # Prepare traffic flow > - payload_size =3D frame_size - \ > - HEADER_SIZE['ip'] - HEADER_SIZE['eth'] > - for _port in range(2): > - dmac =3D self.dut.get_mac_address(valports[_port]) > - flows =3D ['Ether(dst=3D"%s")/%s/("X"*%d)' % (dmac, flow= , > payload_size) for flow in self.flows()[_port *2:(_port +1)*2]] > - self.tester.scapy_append('wrpcap("dst%d.pcap", > [%s])' %(valports[_port],string.join(flows,','))) > - self.tester.scapy_execute() > - > - self.rst_report("Flows for 2 ports, %d frame size.\n" % > (frame_size), > - annex=3DTrue) > - self.rst_report("%s" % string.join(flows, '\n'), > - frame=3DTrue, annex=3DTrue) > - > - > - # Prepare the command line > - global corelist > - pat =3D re.compile("P([0123]),([0123]),(C\{\d.\d.\d\})") > - > - pat2 =3D re.compile("C\{\d") > - repl1 =3D "C{" + str(self.port_socket) > - > - coreMask =3D {} > - cmdlist =3D [] > - rtCmdLines =3D {} > - cmdlist =3D TestL3fwd.test_cases_2_ports > - for cmdline_pat in cmdlist: > - corelist =3D [] > - rtCmdLines[cmdline_pat[1]] =3D cmdline_pat[2] > - while pat.search(rtCmdLines[cmdline_pat[1]]): > - # Change the socket to the NIC's socket > - if cmdline_pat[1].find('1S')>=3D0: > - rtCmdLines[cmdline_pat[1]] =3D pat2.sub(repl1, > rtCmdLines[cmdline_pat[1]]) > - rtCmdLines[cmdline_pat[1]] =3D pat.sub(self.repl, > rtCmdLines[cmdline_pat[1]]) > - > - self.logger.info("%s\n" % str(corelist)) > - coreMask[cmdline_pat[1]] =3D > utils.create_mask(set(corelist)) > - > - # measure by two different mode > - for mode in TestL3fwd.methods: > - > - # start l3fwd > - index =3D 0 > - subtitle =3D [] > - for cores in rtCmdLines.keys(): > - > - info =3D "Executing l3fwd using %s mode, 2 ports, %s > and %d frame size.\n" % ( > - mode, cores, frame_size) > - > - self.logger.info(info) > - self.rst_report(info, annex=3DTrue) > - > - subtitle.append(cores) > - cmdline =3D rtCmdLines[cores] % (TestL3fwd.path + > "l3fwd_" + mode, coreMask[cores], > - > self.dut.get_memory_channels(), utils.create_mask(valports[:2])) > - > - if frame_size > 1518: > - cmdline =3D cmdline + " --enable-jumbo --max-pkt= - > len %d" % frame_size > - self.rst_report(cmdline + "\n", frame=3DTrue, > annex=3DTrue) > - > - out =3D self.dut.send_expect(cmdline, "L3FWD:", 120) > - > - # Measure test > - tgenInput =3D [] > - for rxPort in range(2): > - # No use on rx/tx limitation > - if rxPort % 2 =3D=3D 0: > - txIntf =3D > self.tester.get_local_port(valports[rxPort + 1]) > - else: > - txIntf =3D > self.tester.get_local_port(valports[rxPort - 1]) > - > - rxIntf =3D > self.tester.get_local_port(valports[rxPort]) > - if rxPort % 2 =3D=3D 0: > - tgenInput.append((txIntf, rxIntf, > "dst%d.pcap" %valports[rxPort+1])) > - else: > - tgenInput.append((txIntf, rxIntf, > "dst%d.pcap" %valports[rxPort-1])) > - > - _, pps =3D > self.tester.traffic_generator_throughput(tgenInput) > - self.verify(pps > 0, "No traffic detected") > - pps /=3D 1000000.0 > - linerate =3D self.wirespeed(self.nic, frame_size, 2) > - pct =3D pps * 100 / linerate > - latencys =3D > self.tester.traffic_generator_latency(tgenInput) > - > - index +=3D 1 > - > - # Stop l3fwd > - self.dut.send_expect("^C", "#") > - > - for latency in latencys: > - data_row =3D [frame_size, mode, cores, str(pps), > str(pct), str(latency['max']), str(latency['min']),=20 > str(latency['average'])] > - self.result_table_add(data_row) > - self.l3fwd_test_results['data'].append(data_row) > - > - self.result_table_print() > - > def test_perf_rfc2544(self): >=20 > ports =3D self.dut.get_ports() > @@ -480,10 +245,11 @@ class TestL3fwd(TestCase,IxiaPacketGenerator): >=20 > # Prepare traffic flow > payload_size =3D frame_size - \ > - HEADER_SIZE['ip'] - HEADER_SIZE['eth'] > + HEADER_SIZE['ip'] - HEADER_SIZE['eth'] - > HEADER_SIZE['tcp'] > + > for _port in range(ports_num): > dmac =3D self.dut.get_mac_address(valports[_port]) > - flows =3D ['Ether(dst=3D"%s")/%s/("X"*%d)' % (dmac, flow= , > payload_size) for flow in self.flows()[_port *2:(_port +1)*2]] > + flows =3D ['Ether(dst=3D"%s")/%s/TCP()/("X"*%d)' % (dmac= , > flow, payload_size) for flow in self.flows()[_port *2:(_port +1)*2]] > self.tester.scapy_append('wrpcap("dst%d.pcap", > [%s])' %(valports[_port],string.join(flows,','))) > self.tester.scapy_execute() >=20 > @@ -543,6 +309,8 @@ class TestL3fwd(TestCase,IxiaPacketGenerator): > subtitle.append(cores) > cmdline =3D rtCmdLines[cores] % (TestL3fwd.path= =20 > + "l3fwd_" + mode, coreMask[cores], >=20 > self.dut.get_memory_channels(),=20 > utils.create_mask(valports[:ports_num])) > + if self.nic =3D=3D "niantic": > + cmdline =3D cmdline + " --parse-ptype" >=20 Enabled software parse-type will harm the performance, is it necessary? For Niantic, run l3fwd, need this param, otherwise it will fail. And seems = that do not affect Niantic performance data. Best Regards Yulong Pei=20 > if frame_size > 1518: > cmdline =3D cmdline + " --enable-jumbo=20 > --max- pkt-len %d" % frame_size @@ -571,9 +339,10 @@ class=20 > TestL3fwd(TestCase,IxiaPacketGenerator): > linerate =3D self.wirespeed(self.nic,=20 > frame_size, > ports_num) > zero_loss_throughput =3D (linerate *=20 > zero_loss_rate) / 100 >=20 > - tx_pkts =3D human_read_number(tx_pkts) > - rx_pkts =3D human_read_number(rx_pkts) > - loss_pkts =3D human_read_number(loss_pkts) > + tx_pkts =3D utils.human_read_number(tx_pkts) > + rx_pkts =3D utils.human_read_number(rx_pkts) > + loss_pkts =3D=20 > + utils.human_read_number(loss_pkts) > + >=20 > #data_row =3D [frame_size, mode, cores,=20 > tx_pkts, rx_pkts, loss_pkts, zero_loss_rate, zero_loss_throughput] > data_row =3D [frame_size, mode, cores,=20 > zero_loss_throughput, zero_loss_rate] > -- > 2.1.0