aboutsummaryrefslogtreecommitdiffstats
path: root/yardstick
diff options
context:
space:
mode:
Diffstat (limited to 'yardstick')
-rw-r--r--yardstick/benchmark/contexts/standalone/model.py52
-rw-r--r--yardstick/benchmark/contexts/standalone/ovs_dpdk.py6
-rw-r--r--yardstick/benchmark/contexts/standalone/sriov.py5
-rw-r--r--yardstick/common/utils.py2
-rw-r--r--yardstick/network_services/helpers/iniparser.py (renamed from yardstick/network_services/vnf_generic/vnf/iniparser.py)0
-rw-r--r--yardstick/network_services/helpers/samplevnf_helper.py2
-rw-r--r--yardstick/network_services/traffic_profile/traffic_profile.py30
-rw-r--r--yardstick/network_services/vnf_generic/vnf/cgnapt_vnf.py54
-rw-r--r--yardstick/network_services/vnf_generic/vnf/prox_helpers.py11
-rw-r--r--yardstick/network_services/vnf_generic/vnf/prox_vnf.py2
-rw-r--r--yardstick/network_services/vnf_generic/vnf/sample_vnf.py7
11 files changed, 80 insertions, 91 deletions
diff --git a/yardstick/benchmark/contexts/standalone/model.py b/yardstick/benchmark/contexts/standalone/model.py
index 4491660e0..ffd8858d9 100644
--- a/yardstick/benchmark/contexts/standalone/model.py
+++ b/yardstick/benchmark/contexts/standalone/model.py
@@ -16,11 +16,9 @@ from __future__ import absolute_import
import os
import re
import time
-import glob
import uuid
import random
import logging
-import itertools
import errno
from netaddr import IPNetwork
@@ -30,6 +28,7 @@ from yardstick import ssh
from yardstick.common.constants import YARDSTICK_ROOT_PATH
from yardstick.common.yaml_loader import yaml_load
from yardstick.network_services.utils import PciAddress
+from yardstick.network_services.helpers.cpu import CpuSysCores
from yardstick.common.utils import write_file
LOG = logging.getLogger(__name__)
@@ -43,7 +42,7 @@ VM_TEMPLATE = """
<memoryBacking>
<hugepages />
</memoryBacking>
- <vcpu placement="static">{vcpu}</vcpu>
+ <vcpu cpuset='{cpuset}'>{vcpu}</vcpu>
<os>
<type arch="x86_64" machine="pc-i440fx-utopic">hvm</type>
<boot dev="hd" />
@@ -192,6 +191,8 @@ class Libvirt(object):
threads = extra_spec.get('hw:cpu_threads', '2')
vcpu = int(cpu) * int(threads)
numa_cpus = '0-%s' % (vcpu - 1)
+ hw_socket = flavor.get('hw_socket', '0')
+ cpuset = Libvirt.pin_vcpu_for_perf(connection, vm_name, vcpu, hw_socket)
mac = StandaloneContextHelper.get_mac_address(0x00)
image = cls.create_snapshot_qemu(connection, index,
@@ -203,51 +204,28 @@ class Libvirt(object):
memory=memory, vcpu=vcpu, cpu=cpu,
numa_cpus=numa_cpus,
socket=socket, threads=threads,
- vm_image=image)
+ vm_image=image, cpuset=cpuset)
write_file(cfg, vm_xml)
return [vcpu, mac]
@staticmethod
- def split_cpu_list(cpu_list):
- if not cpu_list:
- return []
-
- ranges = cpu_list.split(',')
- bounds = ([int(b) for b in r.split('-')] for r in ranges)
- range_objects = \
- (range(bound[0], bound[1] + 1 if len(bound) == 2
- else bound[0] + 1) for bound in bounds)
-
- return sorted(itertools.chain.from_iterable(range_objects))
-
- @classmethod
- def get_numa_nodes(cls):
- nodes_sysfs = glob.iglob("/sys/devices/system/node/node*")
- nodes = {}
- for node_sysfs in nodes_sysfs:
- num = os.path.basename(node_sysfs).replace("node", "")
- with open(os.path.join(node_sysfs, "cpulist")) as cpulist_file:
- cpulist = cpulist_file.read().strip()
- nodes[num] = cls.split_cpu_list(cpulist)
- LOG.info("nodes: {0}".format(nodes))
- return nodes
-
- @staticmethod
def update_interrupts_hugepages_perf(connection):
connection.execute("echo 1 > /sys/module/kvm/parameters/allow_unsafe_assigned_interrupts")
connection.execute("echo never > /sys/kernel/mm/transparent_hugepage/enabled")
@classmethod
- def pin_vcpu_for_perf(cls, connection, vm_name, cpu):
- nodes = cls.get_numa_nodes()
- num_nodes = len(nodes)
- vcpi_pin_template = "virsh vcpupin {0} {1} {2}"
- for i in range(0, int(cpu)):
- core = nodes[str(num_nodes - 1)][i % len(nodes[str(num_nodes - 1)])]
- connection.execute(vcpi_pin_template.format(vm_name, i, core))
- cls.update_interrupts_hugepages_perf(connection)
+ def pin_vcpu_for_perf(cls, connection, vm_name, cpu, socket="0"):
+ threads = ""
+ sys_obj = CpuSysCores(connection)
+ soc_cpu = sys_obj.get_core_socket()
+ sys_cpu = int(soc_cpu["cores_per_socket"])
+ cores = "%s-%s" % (soc_cpu[socket][0], soc_cpu[socket][sys_cpu - 1])
+ if int(soc_cpu["thread_per_core"]):
+ threads = "%s-%s" % (soc_cpu[socket][sys_cpu], soc_cpu[socket][-1])
+ cpuset = "%s,%s" % (cores, threads)
+ return cpuset
class StandaloneContextHelper(object):
diff --git a/yardstick/benchmark/contexts/standalone/ovs_dpdk.py b/yardstick/benchmark/contexts/standalone/ovs_dpdk.py
index 833c3fb80..e990e46f5 100644
--- a/yardstick/benchmark/contexts/standalone/ovs_dpdk.py
+++ b/yardstick/benchmark/contexts/standalone/ovs_dpdk.py
@@ -164,7 +164,7 @@ class OvsDpdkContext(Context):
cmd_dpdk_list = [
"ovs-vsctl del-br br0",
- "rm -rf /usr/local/var/run/openvswitch/dpdkvhostuser*",
+ "rm -rf {0}/var/run/openvswitch/dpdkvhostuser*".format(vpath),
"ovs-vsctl add-br br0 -- set bridge br0 datapath_type=netdev",
]
@@ -175,7 +175,7 @@ class OvsDpdkContext(Context):
dpdk_list.append(ovs_add_port.format(br='br0', port='dpdk%s' % vnf.get("port_num", 0),
type_='dpdk', dpdk_args=dpdk_args))
dpdk_list.append(ovs_add_queue.format(port='dpdk%s' % vnf.get("port_num", 0),
- queue=self.ovs_properties.get("queues", 4)))
+ queue=self.ovs_properties.get("queues", 1)))
# Sorting the array to make sure we execute dpdk0... in the order
list.sort(dpdk_list)
@@ -370,8 +370,6 @@ class OvsDpdkContext(Context):
LOG.info("virsh create ...")
Libvirt.virsh_create_vm(self.connection, cfg)
- # 5: Tunning for better performace
- Libvirt.pin_vcpu_for_perf(self.connection, vm_name, vcpu)
self.vm_names.append(vm_name)
# build vnf node details
diff --git a/yardstick/benchmark/contexts/standalone/sriov.py b/yardstick/benchmark/contexts/standalone/sriov.py
index 55d7057a9..69825fbbf 100644
--- a/yardstick/benchmark/contexts/standalone/sriov.py
+++ b/yardstick/benchmark/contexts/standalone/sriov.py
@@ -196,6 +196,8 @@ class SriovContext(Context):
LOG.info("Ports %s" % self.networks)
def _enable_interfaces(self, index, idx, vfs, cfg):
+ vf_spoofchk = "ip link set {0} vf 0 spoofchk off"
+
vf = self.networks[vfs[0]]
vpci = PciAddress.parse_address(vf['vpci'].strip(), multi_line=True)
# Generate the vpci for the interfaces
@@ -205,6 +207,7 @@ class SriovContext(Context):
Libvirt.add_sriov_interfaces(
vf['vpci'], vf['vf_pci']['vf_pci'], vf['mac'], str(cfg))
self.connection.execute("ifconfig %s up" % vf['interface'])
+ self.connection.execute(vf_spoofchk.format(vf['interface']))
def setup_sriov_context(self):
nodes = []
@@ -233,8 +236,6 @@ class SriovContext(Context):
LOG.info("virsh create ...")
Libvirt.virsh_create_vm(self.connection, cfg)
- # 5: Tunning for better performace
- Libvirt.pin_vcpu_for_perf(self.connection, vm_name, vcpu)
self.vm_names.append(vm_name)
# build vnf node details
diff --git a/yardstick/common/utils.py b/yardstick/common/utils.py
index 6ac99a5a9..51f6e1360 100644
--- a/yardstick/common/utils.py
+++ b/yardstick/common/utils.py
@@ -350,7 +350,7 @@ def config_to_dict(config):
def validate_non_string_sequence(value, default=None, raise_exc=None):
- if isinstance(value, collections.Sequence) and not isinstance(value, str):
+ if isinstance(value, collections.Sequence) and not isinstance(value, six.string_types):
return value
if raise_exc:
raise raise_exc
diff --git a/yardstick/network_services/vnf_generic/vnf/iniparser.py b/yardstick/network_services/helpers/iniparser.py
index 98256e08a..98256e08a 100644
--- a/yardstick/network_services/vnf_generic/vnf/iniparser.py
+++ b/yardstick/network_services/helpers/iniparser.py
diff --git a/yardstick/network_services/helpers/samplevnf_helper.py b/yardstick/network_services/helpers/samplevnf_helper.py
index 4718bbd59..0ab10d7b7 100644
--- a/yardstick/network_services/helpers/samplevnf_helper.py
+++ b/yardstick/network_services/helpers/samplevnf_helper.py
@@ -230,7 +230,7 @@ class MultiPortConfig(object):
self.tmp_file = os.path.join("/tmp", tmp_file)
self.pktq_out_os = []
self.socket = socket
- self.start_core = 0
+ self.start_core = 1
self.pipeline_counter = ""
self.txrx_pipeline = ""
self._port_pairs = None
diff --git a/yardstick/network_services/traffic_profile/traffic_profile.py b/yardstick/network_services/traffic_profile/traffic_profile.py
index 3feb92bb6..2f97945c0 100644
--- a/yardstick/network_services/traffic_profile/traffic_profile.py
+++ b/yardstick/network_services/traffic_profile/traffic_profile.py
@@ -19,6 +19,7 @@ import socket
import logging
from random import SystemRandom
import six
+import ipaddress
from yardstick.network_services.traffic_profile.base import TrafficProfile
from trex_stl_lib.trex_stl_client import STLStream
@@ -44,6 +45,8 @@ SRC_PORT = 'sport'
DST_PORT = 'dport'
TYPE_OF_SERVICE = 'tos'
+LOG = logging.getLogger(__name__)
+
class TrexProfile(TrafficProfile):
""" This class handles Trex Traffic profile generation and execution """
@@ -66,7 +69,7 @@ class TrexProfile(TrafficProfile):
return f
def _ethernet_range_action_partial(self, direction, _):
- def partial(min_value, max_value):
+ def partial(min_value, max_value, count):
stl_vm_flow_var = STLVmFlowVar(name="mac_{}".format(direction),
min_value=1,
max_value=30,
@@ -80,7 +83,15 @@ class TrexProfile(TrafficProfile):
return partial
def _ip_range_action_partial(self, direction, count=1):
- def partial(min_value, max_value):
+ def partial(min_value, max_value, count):
+ ip1 = int(ipaddress.IPv4Address(min_value))
+ ip2 = int(ipaddress.IPv4Address(max_value))
+ actual_count = (ip2 - ip1)
+ if not actual_count:
+ count = 1
+ elif actual_count < int(count):
+ count = actual_count
+
stl_vm_flow_var = STLVmFlowVarRepeatableRandom(name="ip4_{}".format(direction),
min_value=min_value,
max_value=max_value,
@@ -96,7 +107,7 @@ class TrexProfile(TrafficProfile):
return partial
def _ip6_range_action_partial(self, direction, _):
- def partial(min_value, max_value):
+ def partial(min_value, max_value, count):
min_value, max_value = self._get_start_end_ipv6(min_value, max_value)
stl_vm_flow_var = STLVmFlowVar(name="ip6_{}".format(direction),
min_value=min_value,
@@ -112,7 +123,7 @@ class TrexProfile(TrafficProfile):
return partial
def _dscp_range_action_partial(self, *_):
- def partial(min_value, max_value):
+ def partial(min_value, max_value, count):
stl_vm_flow_var = STLVmFlowVar(name="dscp",
min_value=min_value,
max_value=max_value,
@@ -125,7 +136,13 @@ class TrexProfile(TrafficProfile):
self.vm_flow_vars.append(stl_vm_wr_flow_var)
def _udp_range_action_partial(self, field, count=1):
- def partial(min_value, max_value):
+ def partial(min_value, max_value, count):
+ actual_count = int(max_value) - int(min_value)
+ if not actual_count:
+ count = 1
+ elif int(count) > actual_count:
+ count = actual_count
+
stl_vm_flow_var = STLVmFlowVarRepeatableRandom(name="port_{}".format(field),
min_value=min_value,
max_value=max_value,
@@ -205,13 +222,14 @@ class TrexProfile(TrafficProfile):
except StopIteration:
single_action(min_value)
else:
- range_action(min_value=min_value, max_value=max_value)
+ range_action(min_value=min_value, max_value=max_value, count=count)
def _set_proto_addr(self, protocol, field, address, count=1):
single_action, range_action, to_int = self._map_proto_actions[protocol]
self._call_on_range(address,
single_action(field),
range_action(field, count),
+ count=count,
to_int=to_int,
)
diff --git a/yardstick/network_services/vnf_generic/vnf/cgnapt_vnf.py b/yardstick/network_services/vnf_generic/vnf/cgnapt_vnf.py
index b5072c194..53f73b4d7 100644
--- a/yardstick/network_services/vnf_generic/vnf/cgnapt_vnf.py
+++ b/yardstick/network_services/vnf_generic/vnf/cgnapt_vnf.py
@@ -14,6 +14,7 @@
from __future__ import absolute_import
import logging
+import time
from yardstick.network_services.vnf_generic.vnf.sample_vnf import SampleVNF, DpdkVnfSetupEnvHelper
@@ -64,14 +65,12 @@ class CgnaptApproxSetupEnvHelper(DpdkVnfSetupEnvHelper):
def scale(self, flavor=""):
raise NotImplementedError
- def _get_cgnapt_config(self, interfaces=None):
- # TODO: static CGNAPT is broken, don't use it
- if interfaces is None:
- interfaces = self.vnfd_helper.interfaces
-
+ def _get_cgnapt_config(self):
# fixme: Get private port and gateway from port list
uplink_ports = self.vnfd_helper.port_pairs.uplink_ports
- return [self._get_ports_gateway(intf["name"]) for intf in uplink_ports]
+ return \
+ [self.vnfd_helper.find_interface(name=intf)["virtual-interface"]['dst_ip']
+ for intf in uplink_ports]
class CgnaptApproxVnf(SampleVNF):
@@ -98,23 +97,26 @@ class CgnaptApproxVnf(SampleVNF):
if self.scenario_helper.options.get('napt', 'static') != 'static':
return
- # ip_iter = self.setup_helper._generate_ip_from_pool("152.16.40.10")
- # gw_ips = self.setup_helper._get_cgnapt_config()
- # if self.scenario_helper.vnf_cfg.get("lb_config", "SW") == 'HW':
- # pipeline = self.setup_helper.HW_DEFAULT_CORE
- # offset = 3
- # else:
- # pipeline = self.setup_helper.SW_DEFAULT_CORE - 1
- # offset = 0
- #
- # worker_threads = int(self.scenario_helper.vnf_cfg["worker_threads"])
- # # p <pipeline id> entry addm <prv_ipv4/6> prvport> <pub_ip> <pub_port> <phy_port> <ttl>
- # # <no_of_entries> <end_prv_port> <end_pub_port>
- # cmd_template = "p {0} entry addm {1} 1 {2} 1 0 32 65535 65535 65535"
- # for gw, ip in zip(gw_ips, ip_iter):
- # cmd = cmd_template.format(pipeline, gw, ip)
- # pipeline += worker_threads
- # pipeline += offset
- # self.vnf_execute(cmd)
- #
- # time.sleep(WAIT_FOR_STATIC_NAPT)
+ flow = self.scenario_helper.all_options.get('flow', {})
+ public_ip = flow.get('public_ip', ['152.16.40.10']).pop()
+ ip_iter = self.setup_helper._generate_ip_from_pool(public_ip)
+ gw_ips = self.setup_helper._get_cgnapt_config()
+ if self.scenario_helper.vnf_cfg.get("lb_config", "SW") == 'HW':
+ pipeline = self.setup_helper.HW_DEFAULT_CORE
+ offset = 3
+ else:
+ pipeline = self.setup_helper.SW_DEFAULT_CORE - 1
+ offset = 0
+
+ worker_threads = int(self.scenario_helper.vnf_cfg["worker_threads"])
+ # p <pipeline id> entry addm <prv_ipv4/6> prvport> <pub_ip> <pub_port> <phy_port> <ttl>
+ # <no_of_entries> <end_prv_port> <end_pub_port>
+ cmd_template = "p {0} entry addm {1} 1 {2} 1 0 32 65535 65535 65535"
+ for gw, ip in zip(gw_ips, ip_iter):
+ cmd = cmd_template.format(pipeline, gw, ip)
+ pipeline += worker_threads
+ pipeline += offset
+ LOG.info(cmd)
+ self.vnf_execute(cmd)
+
+ time.sleep(WAIT_FOR_STATIC_NAPT)
diff --git a/yardstick/network_services/vnf_generic/vnf/prox_helpers.py b/yardstick/network_services/vnf_generic/vnf/prox_helpers.py
index 992b6d06e..ac5abfbcb 100644
--- a/yardstick/network_services/vnf_generic/vnf/prox_helpers.py
+++ b/yardstick/network_services/vnf_generic/vnf/prox_helpers.py
@@ -14,28 +14,27 @@
from __future__ import absolute_import
import array
-import operator
-import logging
import io
+import logging
+import operator
import os
import re
import select
import socket
-
-from collections import OrderedDict, namedtuple
import time
+from collections import OrderedDict, namedtuple
from contextlib import contextmanager
from itertools import repeat, chain
from multiprocessing import Queue
import six
-from six.moves import zip, StringIO
from six.moves import cStringIO
+from six.moves import zip, StringIO
from yardstick.benchmark.scenarios.networking.vnf_generic import find_relative_file
from yardstick.common import utils
from yardstick.common.utils import SocketTopology, join_non_strings, try_int
-from yardstick.network_services.vnf_generic.vnf.iniparser import ConfigParser
+from yardstick.network_services.helpers.iniparser import ConfigParser
from yardstick.network_services.vnf_generic.vnf.sample_vnf import ClientResourceHelper
from yardstick.network_services.vnf_generic.vnf.sample_vnf import DpdkVnfSetupEnvHelper
diff --git a/yardstick/network_services/vnf_generic/vnf/prox_vnf.py b/yardstick/network_services/vnf_generic/vnf/prox_vnf.py
index 3bfca19aa..24712dd27 100644
--- a/yardstick/network_services/vnf_generic/vnf/prox_vnf.py
+++ b/yardstick/network_services/vnf_generic/vnf/prox_vnf.py
@@ -90,7 +90,7 @@ class ProxApproxVnf(SampleVNF):
result = {
"packets_in": tx_total,
- "packets_dropped": (tx_total - rx_total),
+ "packets_dropped": abs(rx_total - tx_total),
"packets_fwd": rx_total,
# we share ProxResourceHelper with TG, but we want to collect
# collectd KPIs here and not TG KPIs, so use a different method name
diff --git a/yardstick/network_services/vnf_generic/vnf/sample_vnf.py b/yardstick/network_services/vnf_generic/vnf/sample_vnf.py
index 06f259685..b5cf03477 100644
--- a/yardstick/network_services/vnf_generic/vnf/sample_vnf.py
+++ b/yardstick/network_services/vnf_generic/vnf/sample_vnf.py
@@ -108,13 +108,6 @@ class SetupEnvHelper(object):
self.ssh_helper = ssh_helper
self.scenario_helper = scenario_helper
- def _get_ports_gateway(self, name):
- routing_table = self.vnfd_helper.vdu0.get('routing_table', [])
- for route in routing_table:
- if name == route['if']:
- return route['gateway']
- return None
-
def build_config(self):
raise NotImplementedError