From c1bdb7115f12e7d4ec586ec0673fd19dce3a2414 Mon Sep 17 00:00:00 2001 From: pmikus Date: Thu, 7 Apr 2016 16:36:31 +0200 Subject: Multicore VPP setup for performance testing - add multithread TAGS documentation - add methods to VppConfigGenerator for RSS configuration - create KW for multithread setup - create sample test case using multithread vpp setup - add Documentation into TCs Change-Id: Id40862490d49380dc76d1d3ce39314603f983fd3 Signed-off-by: pmikus --- resources/libraries/python/VppConfigGenerator.py | 47 +++++++++++++++++++-- resources/libraries/robot/default.robot | 54 ++++++++++++++++++++++++ 2 files changed, 98 insertions(+), 3 deletions(-) (limited to 'resources') diff --git a/resources/libraries/python/VppConfigGenerator.py b/resources/libraries/python/VppConfigGenerator.py index 14be90cd14..6085882e8e 100644 --- a/resources/libraries/python/VppConfigGenerator.py +++ b/resources/libraries/python/VppConfigGenerator.py @@ -45,14 +45,15 @@ unix {{ api-trace {{ on }} -{{heapsizeconfig}} +{heapsizeconfig} cpu {{ {cpuconfig} }} dpdk {{ - socket-mem {{socketmemconfig}} + socket-mem {socketmemconfig} {pciconfig} +{rssconfig} }} """ # End VPP configuration template. @@ -160,6 +161,26 @@ class VppConfigGenerator(object): logger.debug('Setting hostname {} Heap Size config to {}'.\ format(hostname, heapsize_config)) + def add_rss_config(self, node, rss_config): + """Add RSS configuration for node. + + :param node: DUT node + :param rss_config: RSS configuration, as a string + :type node: dict + :type rss_config: string + :return: nothing + """ + if node['type'] != NodeType.DUT: + raise ValueError('Node type is not a DUT') + hostname = Topology.get_node_hostname(node) + if not hostname in self._nodeconfig: + self._nodeconfig[hostname] = {} + if not 'rss_config' in self._nodeconfig[hostname]: + self._nodeconfig[hostname]['rss_config'] = [] + self._nodeconfig[hostname]['rss_config'].append(rss_config) + logger.debug('Setting hostname {} RSS config to {}'.\ + format(hostname, rss_config)) + def remove_all_pci_devices(self, node): """Remove PCI device configuration from node. @@ -220,6 +241,21 @@ class VppConfigGenerator(object): logger.debug('Clearing Heap Size config for hostname {}.'.\ format(hostname)) + def remove_rss_config(self, node): + """Remove RSS configuration from node. + + :param node: DUT node + :type: node: dict + :return: nothing + """ + if node['type'] != NodeType.DUT: + raise ValueError('Node type is not a DUT') + hostname = Topology.get_node_hostname(node) + if hostname in self._nodeconfig: + self._nodeconfig[hostname]['rss_config'] = [] + logger.debug('Clearing RSS config for hostname {}.'.\ + format(hostname)) + def apply_config(self, node, waittime=5, retries=12): """Generate and apply VPP configuration for node. @@ -242,6 +278,7 @@ class VppConfigGenerator(object): pciconfig = "" socketmemconfig = DEFAULT_SOCKETMEM_CONFIG heapsizeconfig = "" + rssconfig = "" if hostname in self._nodeconfig: cfg = self._nodeconfig[hostname] @@ -258,10 +295,14 @@ class VppConfigGenerator(object): heapsizeconfig = "\nheapsize {}\n".\ format(cfg['heapsize_config']) + if 'rss_config' in cfg: + rssconfig = " " + "\n ".join(cfg['rss_config']) + vppconfig = VPP_CONFIG_TEMPLATE.format(cpuconfig=cpuconfig, pciconfig=pciconfig, socketmemconfig=socketmemconfig, - heapsizeconfig=heapsizeconfig) + heapsizeconfig=heapsizeconfig, + rssconfig=rssconfig) logger.debug('Writing VPP config to host {}: "{}"'.format(hostname,\ vppconfig)) diff --git a/resources/libraries/robot/default.robot b/resources/libraries/robot/default.robot index dae515423b..51cafdff96 100644 --- a/resources/libraries/robot/default.robot +++ b/resources/libraries/robot/default.robot @@ -16,6 +16,7 @@ | Library | resources.libraries.python.topology.Topology | Library | resources.libraries.python.DUTSetup | Library | resources.libraries.python.TGSetup +| Library | resources/libraries/python/VppConfigGenerator.py | Library | Collections *** Keywords *** @@ -33,3 +34,56 @@ | | ${duts}= | Get Matches | ${nodes} | DUT* | | :FOR | ${dut} | IN | @{duts} | | | Vpp show stats | ${nodes['${dut}']} + +| Setup '${m}' worker threads and rss '${n}' without HTT on all DUTs +| | [Documentation] | Setup M worker threads without HTT and rss N in startup +| | ... | configuration of VPP on all DUTs +| | ${cpu}= | Catenate | main-core | 0 | corelist-workers +| | ${cpu}= | Run Keyword If | '${m}' == '1' | Catenate | ${cpu} | 1 +| | ... | ELSE IF | '${m}' == '2' | Catenate | ${cpu} | 1-2 +| | ... | ELSE IF | '${m}' == '4' | Catenate | ${cpu} | 1-4 +| | ... | ELSE IF | '${m}' == '6' | Catenate | ${cpu} | 1-6 +| | ... | ELSE | Fail | Not supported combination +| | ${rss}= | Catenate | rss | ${n} +| | Setup worker threads and rss on all DUTs | ${cpu} | ${rss} + +| Setup '${m}' worker threads and rss '${n}' with HTT on all DUTs +| | [Documentation] | Setup M worker threads with HTT and rss N in startup +| | ... | configuration of VPP on all DUTs +| | ${cpu}= | Catenate | main-core | 0 | corelist-workers +| | ${cpu}= | Run Keyword If | '${m}' == '2' | Catenate | ${cpu} | 1,10 +| | ... | ELSE IF | '${m}' == '4' | Catenate | ${cpu} | 1-2,10-11 +| | ... | ELSE IF | '${m}' == '6' | Catenate | ${cpu} | 1-3,10-12 +| | ... | ELSE IF | '${m}' == '8' | Catenate | ${cpu} | 1-4,10-13 +| | ... | ELSE | Fail | Not supported combination +| | ${rss}= | Catenate | rss | ${n} +| | Setup worker threads and rss on all DUTs | ${cpu} | ${rss} + +| Setup worker threads and rss on all DUTs +| | [Documentation] | Setup worker threads and rss in startup configuration of +| | ... | VPP on all DUTs +| | [Arguments] | ${cpu} | ${rss} +| | ${duts}= | Get Matches | ${nodes} | DUT* +| | :FOR | ${dut} | IN | @{duts} +| | | Add CPU config | ${nodes['${dut}']} +| | | ... | ${cpu} +| | | Add PCI device | ${nodes['${dut}']} +| | | Add RSS config | ${nodes['${dut}']} +| | | ... | ${rss} +| | | Apply config | ${nodes['${dut}']} + +| Reset startup configuration of VPP on all DUTs +| | [Documentation] | Reset startup configuration of VPP on all DUTs +| | ${cpu}= | Catenate | main-core | 1 +| | ${duts}= | Get Matches | ${nodes} | DUT* +| | :FOR | ${dut} | IN | @{duts} +| | | Remove All PCI Devices | ${nodes['${dut}']} +| | | Remove All CPU Config | ${nodes['${dut}']} +| | | Remove Socketmem Config | ${nodes['${dut}']} +| | | Remove Heapsize Config | ${nodes['${dut}']} +| | | Remove RSS Config | ${nodes['${dut}']} +| | | Add CPU Config | ${nodes['${dut}']} +| | | ... | ${cpu} +| | | Add PCI Device | ${nodes['${dut}']} +| | | Apply Config | ${nodes['${dut}']} + -- cgit 1.2.3-korg