NFVBENCH-32 Check nan result values before integer casting 13/42713/4
authorKerim Gokarslan <kgokarsl@cisco.com>
Thu, 21 Sep 2017 22:30:43 +0000 (15:30 -0700)
committerKerim Gokarslan <kgokarsl@cisco.com>
Fri, 22 Sep 2017 00:19:35 +0000 (17:19 -0700)
Change-Id: Ia675672b40f93d7503ebe5a355896a084e3d0cbf
Signed-off-by: Kerim Gokarslan <kgokarsl@cisco.com>
docs/testing/user/userguide/examples.rst
nfvbench/traffic_client.py
nfvbench/traffic_gen/traffic_utils.py
nfvbench/traffic_gen/trex.py
nfvbench/utils.py

index 4fc68b7..cd1f886 100644 (file)
@@ -4,6 +4,127 @@
 
 Example of Results
 ******************
+Example run for fixed rate
 
+.. code-block:: bash
+    nfvbench -c /nfvbench/nfvbenchconfig.json --rate 1%
 
+.. code-block:: bash
+    ========== NFVBench Summary ==========
+    Date: 2017-09-21 23:57:44
+    NFVBench version 1.0.9
+    Openstack Neutron:
+      vSwitch: BASIC
+      Encapsulation: BASIC
+    Benchmarks:
+    > Networks:
+      > Components:
+        > TOR:
+            Type: None
+        > Traffic Generator:
+            Profile: trex-local
+            Tool: TRex
+        > Versions:
+          > TOR:
+          > Traffic Generator:
+              build_date: Aug 30 2017
+              version: v2.29
+              built_by: hhaim
+              build_time: 16:43:55
+      > Service chain:
+        > PVP:
+          > Traffic:
+              Profile: traffic_profile_64B
+              Bidirectional: True
+              Flow count: 10000
+              Service chains count: 1
+              Compute nodes: []
 
+                Run Summary:
+
+                  +-----------------+-------------+----------------------+----------------------+----------------------+
+                  |   L2 Frame Size |  Drop Rate  |   Avg Latency (usec) |   Min Latency (usec) |   Max Latency (usec) |
+                  +=================+=============+======================+======================+======================+
+                  |              64 |   0.0000%   |                   53 |                   20 |                  211 |
+                  +-----------------+-------------+----------------------+----------------------+----------------------+
+
+
+                L2 frame size: 64
+                Chain analysis duration: 60.076 seconds
+
+                Run Config:
+
+                  +-------------+---------------------------+------------------------+-----------------+---------------------------+------------------------+-----------------+
+                  |  Direction  |  Requested TX Rate (bps)  |  Actual TX Rate (bps)  |  RX Rate (bps)  |  Requested TX Rate (pps)  |  Actual TX Rate (pps)  |  RX Rate (pps)  |
+                  +=============+===========================+========================+=================+===========================+========================+=================+
+                  |   Forward   |       100.0000 Mbps       |      95.4546 Mbps      |  95.4546 Mbps   |        148,809 pps        |      142,045 pps       |   142,045 pps   |
+                  +-------------+---------------------------+------------------------+-----------------+---------------------------+------------------------+-----------------+
+                  |   Reverse   |       100.0000 Mbps       |      95.4546 Mbps      |  95.4546 Mbps   |        148,809 pps        |      142,045 pps       |   142,045 pps   |
+                  +-------------+---------------------------+------------------------+-----------------+---------------------------+------------------------+-----------------+
+                  |    Total    |       200.0000 Mbps       |     190.9091 Mbps      |  190.9091 Mbps  |        297,618 pps        |      284,090 pps       |   284,090 pps   |
+                  +-------------+---------------------------+------------------------+-----------------+---------------------------+------------------------+-----------------+
+
+                Chain Analysis:
+
+                  +-------------------+----------+-----------------+---------------+---------------+-----------------+---------------+---------------+
+                  |     Interface     |  Device  |  Packets (fwd)  |   Drops (fwd) |  Drop% (fwd)  |  Packets (rev)  |   Drops (rev) |  Drop% (rev)  |
+                  +===================+==========+=================+===============+===============+=================+===============+===============+
+                  | traffic-generator |   trex   |    8,522,729    |               |               |    8,522,729    |             0 |    0.0000%    |
+                  +-------------------+----------+-----------------+---------------+---------------+-----------------+---------------+---------------+
+                  | traffic-generator |   trex   |    8,522,729    |             0 |    0.0000%    |    8,522,729    |               |               |
+                  +-------------------+----------+-----------------+---------------+---------------+-----------------+---------------+---------------+
+
+Example run for NDR/PDR with package size 1518B
+
+.. code-block:: bash
+    nfvbench -c /nfvbench/nfvbenchconfig.json -fs 1518
+
+.. code-block:: bash
+    ========== NFVBench Summary ==========
+    Date: 2017-09-22 00:02:07
+    NFVBench version 1.0.9
+    Openstack Neutron:
+      vSwitch: BASIC
+      Encapsulation: BASIC
+    Benchmarks:
+    > Networks:
+      > Components:
+        > TOR:
+            Type: None
+        > Traffic Generator:
+            Profile: trex-local
+            Tool: TRex
+        > Versions:
+          > TOR:
+          > Traffic Generator:
+              build_date: Aug 30 2017
+              version: v2.29
+              built_by: hhaim
+              build_time: 16:43:55
+      > Measurement Parameters:
+          NDR: 0.001
+          PDR: 0.1
+      > Service chain:
+        > PVP:
+          > Traffic:
+              Profile: custom_traffic_profile
+              Bidirectional: True
+              Flow count: 10000
+              Service chains count: 1
+              Compute nodes: []
+
+                Run Summary:
+
+                  +-----+-----------------+------------------+------------------+-----------------+----------------------+----------------------+----------------------+
+                  |  -  |   L2 Frame Size |  Rate (fwd+rev)  |  Rate (fwd+rev)  |  Avg Drop Rate  |   Avg Latency (usec) |   Min Latency (usec) |  Max Latency (usec)  |
+                  +=====+=================+==================+==================+=================+======================+======================+======================+
+                  | NDR |            1518 |   19.9805 Gbps   |  1,623,900 pps   |     0.0001%     |                  342 |                   30 |         704          |
+                  +-----+-----------------+------------------+------------------+-----------------+----------------------+----------------------+----------------------+
+                  | PDR |            1518 |   20.0000 Gbps   |  1,625,486 pps   |     0.0022%     |                  469 |                   40 |        1,266         |
+                  +-----+-----------------+------------------+------------------+-----------------+----------------------+----------------------+----------------------+
+
+
+                L2 frame size: 1518
+                Chain analysis duration: 660.442 seconds
+                NDR search duration: 660 seconds
+                PDR search duration: 0 seconds
index 7542d0b..ec63944 100644 (file)
@@ -25,6 +25,7 @@ from stats_collector import IterationCollector
 import struct
 import time
 import traffic_gen.traffic_utils as utils
+from utils import cast_integer
 
 
 class TrafficClientException(Exception):
@@ -538,9 +539,12 @@ class TrafficClient(object):
                     retDict[port]['rx'][key] = int(stats[port]['rx'][key])
                 except ValueError:
                     retDict[port]['rx'][key] = 0
-            retDict[port]['rx']['avg_delay_usec'] = int(stats[port]['rx']['avg_delay_usec'])
-            retDict[port]['rx']['min_delay_usec'] = int(stats[port]['rx']['min_delay_usec'])
-            retDict[port]['rx']['max_delay_usec'] = int(stats[port]['rx']['max_delay_usec'])
+            retDict[port]['rx']['avg_delay_usec'] = cast_integer(
+                stats[port]['rx']['avg_delay_usec'])
+            retDict[port]['rx']['min_delay_usec'] = cast_integer(
+                stats[port]['rx']['min_delay_usec'])
+            retDict[port]['rx']['max_delay_usec'] = cast_integer(
+                stats[port]['rx']['max_delay_usec'])
             retDict[port]['drop_rate_percent'] = self.__get_dropped_rate(retDict[port])
 
         ports = sorted(retDict.keys())
@@ -753,7 +757,7 @@ class TrafficClient(object):
         config['direction-total'] = dict(config['direction-forward'])
         config['direction-total'].update({
             'rate_percent': load_total,
-            'rate_pps': pps_total,
+            'rate_pps': cast_integer(pps_total),
             'rate_bps': bps_total
         })
 
index d3def42..7cf44a8 100644 (file)
@@ -17,6 +17,7 @@ import bitmath
 from traffic_base import AbstractTrafficGenerator
 
 
+
 def convert_rates(l2frame_size, rate, intf_speed):
     avg_packet_size = get_average_packet_size(l2frame_size)
     if 'rate_pps' in rate:
index a9effab..498ff50 100644 (file)
@@ -17,6 +17,7 @@ from itertools import count
 from nfvbench.log import LOG
 from nfvbench.specs import ChainType
 from nfvbench.traffic_server import TRexTrafficServer
+from nfvbench.utils import cast_integer
 from nfvbench.utils import timeout
 from nfvbench.utils import TimeoutError
 import os
@@ -73,30 +74,31 @@ class TRex(AbstractTrafficGenerator):
             stats = self.__combine_stats(in_stats, ph)
             result[ph] = {
                 'tx': {
-                    'total_pkts': int(stats['tx_pkts']['total']),
-                    'total_pkt_bytes': int(stats['tx_bytes']['total']),
-                    'pkt_rate': int(stats['tx_pps']['total']),
-                    'pkt_bit_rate': int(stats['tx_bps']['total'])
+                    'total_pkts': cast_integer(stats['tx_pkts']['total']),
+                    'total_pkt_bytes': cast_integer(stats['tx_bytes']['total']),
+                    'pkt_rate': cast_integer(stats['tx_pps']['total']),
+                    'pkt_bit_rate': cast_integer(stats['tx_bps']['total'])
                 },
                 'rx': {
-                    'total_pkts': int(stats['rx_pkts']['total']),
-                    'total_pkt_bytes': int(stats['rx_bytes']['total']),
-                    'pkt_rate': int(stats['rx_pps']['total']),
-                    'pkt_bit_rate': int(stats['rx_bps']['total']),
-                    'dropped_pkts': int(stats['tx_pkts']['total'] - stats['rx_pkts']['total'])
+                    'total_pkts': cast_integer(stats['rx_pkts']['total']),
+                    'total_pkt_bytes': cast_integer(stats['rx_bytes']['total']),
+                    'pkt_rate': cast_integer(stats['rx_pps']['total']),
+                    'pkt_bit_rate': cast_integer(stats['rx_bps']['total']),
+                    'dropped_pkts': cast_integer(
+                        stats['tx_pkts']['total'] - stats['rx_pkts']['total'])
                 }
             }
 
             lat = self.__combine_latencies(in_stats, ph)
-            result[ph]['rx']['max_delay_usec'] = int(
+            result[ph]['rx']['max_delay_usec'] = cast_integer(
                 lat['total_max']) if 'total_max' in lat else float('nan')
-            result[ph]['rx']['min_delay_usec'] = int(
+            result[ph]['rx']['min_delay_usec'] = cast_integer(
                 lat['total_min']) if 'total_min' in lat else float('nan')
-            result[ph]['rx']['avg_delay_usec'] = int(
+            result[ph]['rx']['avg_delay_usec'] = cast_integer(
                 lat['average']) if 'average' in lat else float(
                 'nan')
         total_tx_pkts = result[0]['tx']['total_pkts'] + result[1]['tx']['total_pkts']
-        result["total_tx_rate"] = int(total_tx_pkts / self.config.duration_sec)
+        result["total_tx_rate"] = cast_integer(total_tx_pkts / self.config.duration_sec)
         return result
 
     def __combine_stats(self, in_stats, port_handle):
index 4d9749c..fc72517 100644 (file)
@@ -17,6 +17,7 @@ import fcntl
 from functools import wraps
 import json
 from log import LOG
+from math import isnan
 import os
 import re
 import signal
@@ -141,6 +142,10 @@ def parse_flow_count(flow_count):
     return flow_count * multiplier
 
 
+def cast_integer(value):
+    return int(value) if not isnan(value) else value
+
+
 class RunLock(object):
     """
     Attempts to lock file and run current instance of NFVbench as the first,