From: "Tu, Lijuan" <lijuan.tu@intel.com>
To: "Han, YingyaX" <yingyax.han@intel.com>, "dts@dpdk.org" <dts@dpdk.org>
Cc: "Han, YingyaX" <yingyax.han@intel.com>
Subject: Re: [dts] [PATCH V1]tests/nic_single_core: replace etgen with pktgen
Date: Wed, 18 Sep 2019 05:06:36 +0000 [thread overview]
Message-ID: <8CE3E05A3F976642AAB0F4675D0AD20E0BB23A61@SHSMSX101.ccr.corp.intel.com> (raw)
In-Reply-To: <20190904154457.2774-1-yingyax.han@intel.com>
Applied, thanks
> -----Original Message-----
> From: dts [mailto:dts-bounces@dpdk.org] On Behalf Of hanyingya
> Sent: Wednesday, September 4, 2019 11:45 PM
> To: dts@dpdk.org
> Cc: Han, YingyaX <yingyax.han@intel.com>
> Subject: [dts] [PATCH V1]tests/nic_single_core: replace etgen with pktgen
>
> use the new pktgen API and change the configuration for flow.
> fix pep8 issue.
>
> Signed-off-by: hanyingya <yingyax.han@intel.com>
> ---
> tests/TestSuite_nic_single_core_perf.py | 151 +++++++++++++++---------
> 1 file changed, 92 insertions(+), 59 deletions(-)
>
> diff --git a/tests/TestSuite_nic_single_core_perf.py
> b/tests/TestSuite_nic_single_core_perf.py
> index 847a94c..6a22027 100644
> --- a/tests/TestSuite_nic_single_core_perf.py
> +++ b/tests/TestSuite_nic_single_core_perf.py
> @@ -35,16 +35,14 @@ DPDK Test suite.
> import utils
> import json
> import os
> -import re
> -import time
> +import string
> from test_case import TestCase
> -from time import sleep
> from exception import VerifyFailure
> from settings import HEADER_SIZE, UPDATE_EXPECTED, load_global_setting
> from pmd_output import PmdOutput from copy import deepcopy -from
> prettytable import PrettyTable import rst
> +from pktgen import PacketGeneratorHelper
>
>
> class TestNicSingleCorePerf(TestCase):
> @@ -74,6 +72,16 @@ class TestNicSingleCorePerf(TestCase):
> # determine if to save test result as a separated file
> self.save_result_flag = True
>
> + # get dts output path
> + if self.logger.log_path.startswith(os.sep):
> + self.output_path = self.logger.log_path
> + else:
> + cur_path = os.path.dirname(
> + os.path.dirname(os.path.realpath(__file__)))
> + self.output_path = os.sep.join([cur_path, self.logger.log_path])
> + # create an instance to set stream field setting
> + self.pktgen_helper = PacketGeneratorHelper()
> +
> def set_up(self):
> """
> Run before each test case.
> @@ -112,9 +120,60 @@ class TestNicSingleCorePerf(TestCase):
> 'Expected Throughput', 'Throughput Difference']
> self.test_result = {}
>
> - def test_nic_single_core_perf(self):
> + def flows(self):
> + """
> + Return a list of packets that implements the flows described in l3fwd.
> + """
> + return [
> + 'IP(src="1.2.3.4",dst="192.18.1.0")',
> + 'IP(src="1.2.3.4",dst="192.18.1.1")',
> + 'IP(src="1.2.3.4",dst="192.18.0.0")',
> + 'IP(src="1.2.3.4",dst="192.18.0.1")',
> + 'IP(src="1.2.3.4",dst="192.18.3.0")',
> + 'IP(src="1.2.3.4",dst="192.18.3.1")',
> + 'IP(src="1.2.3.4",dst="192.18.2.0")',
> + 'IP(src="1.2.3.4",dst="192.18.2.1")']
> +
> + def create_pacap_file(self, frame_size):
> + """
> + Prepare traffic flow
> + """
> + payload_size = frame_size - HEADER_SIZE['ip'] - HEADER_SIZE['eth']
> + pcaps = {}
> + for _port in self.dut_ports:
> + index = self.dut_ports[_port]
> + cnt = 0
> + for layer in self.flows()[_port * 2:(_port + 1) * 2]:
> + flow = ['Ether(src="52:00:00:00:00:00")/%s/("X"*%d)' % (layer,
> payload_size)]
> + pcap = os.sep.join([self.output_path,
> "dst{0}_{1}.pcap".format(index, cnt)])
> + self.tester.scapy_append('wrpcap("%s", [%s])' % (pcap,
> string.join(flow, ',')))
> + self.tester.scapy_execute()
> + if index not in pcaps:
> + pcaps[index] = []
> + pcaps[index].append(pcap)
> + cnt += 1
> + return pcaps
> +
> + def prepare_stream(self, pcaps):
> + """
> + create streams for ports,one port one stream
> + """
> + tgen_input = []
> + for rxPort in range(self.nb_ports):
> + if rxPort % self.nb_ports == 0 or self.nb_ports % rxPort == 2:
> + txIntf = self.tester.get_local_port(self.dut_ports[rxPort + 1])
> + port_id = self.dut_ports[rxPort + 1]
> + else:
> + txIntf = self.tester.get_local_port(self.dut_ports[rxPort - 1])
> + port_id = self.dut_ports[rxPort - 1]
> + rxIntf = self.tester.get_local_port(self.dut_ports[rxPort])
> + for pcap in pcaps[port_id]:
> + tgen_input.append((txIntf, rxIntf, pcap))
> + return tgen_input
> +
> + def test_perf_nic_single_core(self):
> """
> - Run nic single core performance
> + Run nic single core performance
> """
> self.nb_ports = len(self.dut_ports)
> self.verify(self.nb_ports == 2 or self.nb_ports == 4, @@ -126,10 +185,8
> @@ class TestNicSingleCorePerf(TestCase):
> try:
> for frame_size in self.test_parameters.keys():
> for nb_desc in self.test_parameters[frame_size]:
> - cur_gap = (self.expected_throughput[frame_size][nb_desc] -
> - self.throughput[frame_size][nb_desc])
> - self.verify(cur_gap < self.gap,
> - "Beyond Gap, Possible regression")
> + cur_gap = (self.expected_throughput[frame_size][nb_desc] -
> self.throughput[frame_size][nb_desc])
> + self.verify(cur_gap < self.gap, "Beyond Gap,
> + Possible regression")
> except Exception as e:
> self.logger.error(e)
> self.handle_expected()
> @@ -146,7 +203,7 @@ class TestNicSingleCorePerf(TestCase):
> for frame_size in self.test_parameters.keys():
> for nb_desc in self.test_parameters[frame_size]:
> self.expected_throughput[frame_size][nb_desc] = \
> - round(self.throughput[frame_size][nb_desc],3)
> + round(self.throughput[frame_size][nb_desc], 3)
>
> def perf_test(self, port_num):
> """
> @@ -171,6 +228,8 @@ class TestNicSingleCorePerf(TestCase):
>
> for frame_size in self.test_parameters.keys():
> self.throughput[frame_size] = dict()
> + pcaps = self.create_pacap_file(frame_size)
> + tgenInput = self.prepare_stream(pcaps)
> for nb_desc in self.test_parameters[frame_size]:
> self.logger.info("Test running at parameters: " +
> "framesize: {}, rxd/txd: {}".format(frame_size, nb_desc)) @@ -
> 179,10 +238,17 @@ class TestNicSingleCorePerf(TestCase):
> core_config, parameter, eal_para, socket = self.socket)
> self.dut.send_expect("start", "testpmd> ", 15)
>
> - # measure throughput
> - stream_ids = self.prepare_stream(frame_size)
> - _, packets_received = self.tester.pktgen.measure_throughput(
> - stream_ids = stream_ids, delay = self.test_duration)
> + vm_config = self.set_fields()
> + # clear streams before add new streams
> + self.tester.pktgen.clear_streams()
> +
> + # run packet generator
> + streams =
> self.pktgen_helper.prepare_stream_from_tginput(tgenInput, 100, vm_config,
> self.tester.pktgen)
> + # set traffic option
> + traffic_opt = {'delay': 30}
> + # _, pps = self.tester.traffic_generator_throughput(tgenInput,
> rate_percent=100, delay=30)
> + _, packets_received =
> self.tester.pktgen.measure_throughput(stream_ids=streams,
> options=traffic_opt)
> + self.verify(packets_received > 0, "No traffic
> + detected")
> throughput = packets_received / 1000000.0
> self.throughput[frame_size][nb_desc] = throughput
>
> @@ -243,46 +309,6 @@ class TestNicSingleCorePerf(TestCase):
> if self.save_result_flag:
> self.save_result(self.test_result)
>
> - def prepare_stream(self, frame_size):
> - '''
> - create streams for ports, one port two streams, and configure them.
> - '''
> - # traffic option
> - options = {
> - 'rate': '100%',
> - }
> -
> - # create pcap file
> - payload_size = frame_size - self.headers_size
> - self.tester.scapy_append(
> - 'wrpcap("/tmp/test0.pcap",
> [Ether(src="52:00:00:00:00:00")/IP(src="1.2.3.4",dst="1.1.1.1")/("X"*%d)])' %
> payload_size)
> - self.tester.scapy_append(
> - 'wrpcap("/tmp/test1.pcap",
> [Ether(src="52:00:00:00:00:00")/IP(src="2.2.3.4",dst="1.1.1.1")/("X"*%d)])' %
> payload_size)
> - self.tester.scapy_execute()
> -
> - stream_ids = []
> - for i in range(self.nb_ports):
> - if i % 2 == 0:
> - txport = self.tester.get_local_port(self.dut.get_ports()[i])
> - rxport = self.tester.get_local_port(
> - self.dut.get_ports()[i + 1])
> -
> - # fortville requires 2 streams for 2 queues at least, and
> - # this's fine for other NIC too.
> - for k in range(2):
> - # txport -> rxport
> - stream_id = self.tester.pktgen.add_stream(
> - txport, rxport, '/tmp/test{}.pcap'.format(k))
> - self.tester.pktgen.config_stream(stream_id, options)
> - stream_ids.append(stream_id)
> - # rxport -> txport
> - stream_id = self.tester.pktgen.add_stream(
> - rxport, txport, '/tmp/test{}.pcap'.format(k))
> - self.tester.pktgen.config_stream(stream_id, options)
> - stream_ids.append(stream_id)
> -
> - return stream_ids
> -
> def save_result(self, data):
> '''
> Saves the test results as a separated file named with @@ -298,9 +324,9
> @@ class TestNicSingleCorePerf(TestCase):
> row_dict = dict()
> row_dict['parameters'] = dict()
> row_dict['parameters']['frame_size'] = dict(
> - value = row_in['Frame Size'], unit = 'bytes')
> + value=row_in['Frame Size'], unit='bytes')
> row_dict['parameters']['txd/rxd'] = dict(
> - value = row_in['TXD/RXD'], unit = 'descriptors')
> + value=row_in['TXD/RXD'], unit='descriptors')
> delta = (float(row_in['Throughput'].split()[0]) -
> float(row_in['Expected Throughput'].split()[0]))
> if delta >= -self.gap:
> @@ -308,14 +334,21 @@ class TestNicSingleCorePerf(TestCase):
> else:
> result = 'FAIL'
> row_dict['throughput'] = dict(
> - delta = delta, unit = row_in['Throughput'].split()[1],
> - result = result)
> + delta=delta, unit=row_in['Throughput'].split()[1],
> + result=result)
> json_obj['results'].append(row_dict)
> with open(os.path.join(rst.path2Result,
> '{0:s}_single_core_perf.json'.format(
> self.nic)), 'w') as fp:
> json.dump(json_obj, fp)
>
> + def set_fields(self):
> + """
> + set ip protocol field behavior
> + """
> + fields_config = {'ip': {'src': {'action': 'random'}, }, }
> + return fields_config
> +
> def tear_down(self):
> """
> Run after each test case.
> --
> 2.17.1
prev parent reply other threads:[~2019-09-18 5:06 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-09-04 15:44 hanyingya
2019-09-18 5:06 ` Tu, Lijuan [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=8CE3E05A3F976642AAB0F4675D0AD20E0BB23A61@SHSMSX101.ccr.corp.intel.com \
--to=lijuan.tu@intel.com \
--cc=dts@dpdk.org \
--cc=yingyax.han@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).