X-Git-Url: https://gerrit.fd.io/r/gitweb?p=csit.git;a=blobdiff_plain;f=GPL%2Ftools%2Ftrex%2Ftrex_astf_profile.py;h=a2d177fdeaa734e4df0882a72ceb1c05940aaf4c;hp=79507eae1832404a322144dd15793054c6783c03;hb=1daa6fdc0bae284dee1b61f34534e59b60b7526a;hpb=b44e5f78dabc49ce45c68cedb0fcb78dca164aea diff --git a/GPL/tools/trex/trex_astf_profile.py b/GPL/tools/trex/trex_astf_profile.py index 79507eae18..a2d177fdea 100644 --- a/GPL/tools/trex/trex_astf_profile.py +++ b/GPL/tools/trex/trex_astf_profile.py @@ -1,6 +1,6 @@ #!/usr/bin/python3 -# Copyright (c) 2020 Cisco and/or its affiliates. +# Copyright (c) 2022 Cisco and/or its affiliates. # # SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later # @@ -14,7 +14,8 @@ # # Note: If this file is linked with Scapy, which is GPLv2+, your use of it # must be under GPLv2+. If at any point in the future it is no longer linked -# with Scapy (or other GPLv2+ licensed software), you are free to choose Apache 2. +# with Scapy (or other GPLv2+ licensed software), you are free to choose +# Apache 2. # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, @@ -33,9 +34,9 @@ import sys import time sys.path.insert( - 0, u"/opt/trex-core-2.86/scripts/automation/trex_control_plane/interactive/" + 0, u"/opt/trex-core-2.88/scripts/automation/trex_control_plane/interactive/" ) -from trex.astf.api import * +from trex.astf.api import ASTFClient, ASTFProfile, TRexError def fmt_latency(lat_min, lat_avg, lat_max, hdrh): @@ -72,12 +73,14 @@ def simple_burst( profile_file, duration, framesize, + n_data_frames, multiplier, port_0, port_1, latency, async_start=False, traffic_directions=2, + delay=0.0, ): """Send traffic and measure packet loss and latency. @@ -97,8 +100,9 @@ def simple_burst( Duration details: Contrary to stateless mode, ASTF profiles typically limit the number of flows/transactions that can happen. - The caller is expected to set the duration parameter accordingly to - this limit and multiplier, including any overheads. + The caller is expected to set the duration parameter to idealized value, + but set the delay arguments when TRex is expected + to finish processing replies later (including a window for latency). See *_traffic_duration output fields for TRex's measurement of the real traffic duration (should be without any inactivity overheads). If traffic has not ended by the final time, the traffic @@ -110,27 +114,27 @@ def simple_burst( :param profile_file: A python module with T-rex traffic profile. :param duration: Expected duration for all transactions to finish, - assuming only tolerable duration stretching happens. - This includes later start of later transactions - (according to TPS multiplier) and expected duration of each transaction. - Critically, this also includes any delay TRex shows when starting - traffic (but not the similar delay during stopping). + without any TRex related delays, without even latency. :param framesize: Frame size. + :param n_data_frames: Controls "size" of transaction for TPUT tests. :param multiplier: Multiplier of profile CPS. :param port_0: Port 0 on the traffic generator. :param port_1: Port 1 on the traffic generator. :param latency: With latency stats. :param async_start: Start the traffic and exit. :param traffic_directions: Bidirectional (2) or unidirectional (1) traffic. + :param delay: Time increase [s] for sleep duration. :type profile_file: str :type duration: float :type framesize: int or str + :type n_data_frames: int :type multiplier: int :type port_0: int :type port_1: int :type latency: bool :type async_start: bool :type traffic_directions: int + :type delay: float """ client = None total_received = 0 @@ -150,7 +154,11 @@ def simple_burst( # TODO: key-values pairs to the profile file # - ips ? print(f"### Profile file:\n{profile_file}") - profile = ASTFProfile.load(profile_file, framesize=framesize) + profile = ASTFProfile.load( + profile_file, + framesize=framesize, + n_data_frames=n_data_frames, + ) except TRexError: print(f"Error while loading profile '{profile_file}'!") raise @@ -178,14 +186,12 @@ def simple_burst( # Choose CPS and start traffic. client.start( mult=multiplier, - # Increase the input duration slightly, - # to ensure it does not end before sleep&stop below happens. - duration=duration + 0.1 if duration > 0 else duration, + duration=duration, nc=True, latency_pps=int(multiplier) if latency else 0, client_mask=2**len(ports)-1, ) - time_start = time.monotonic() + time_stop = time.monotonic() + duration + delay if async_start: # For async stop, we need to export the current snapshot. @@ -195,8 +201,7 @@ def simple_burst( xsnap1 = client.ports[port_1].get_xstats().reference_stats print(f"Xstats snapshot 1: {xsnap1!r}") else: - time.sleep(duration) - + time.sleep(duration + delay) # Do not block yet, the existing transactions may take long time # to finish. We need an action that is almost reset(), # but without clearing stats. @@ -207,7 +212,7 @@ def simple_burst( client.stop(block=True) # Read the stats after the traffic stopped (or time up). - stats[time.monotonic() - time_start] = client.get_stats( + stats[time.monotonic() - time_stop] = client.get_stats( ports=ports ) @@ -417,6 +422,10 @@ def main(): u"-s", u"--frame_size", required=True, help=u"Size of a Frame without padding and IPG." ) + parser.add_argument( + u"--n_data_frames", type=int, default=5, + help=u"Use this many data frames per transaction and direction (TPUT)." + ) parser.add_argument( u"-m", u"--multiplier", required=True, type=float, help=u"Multiplier of profile CPS." @@ -441,6 +450,10 @@ def main(): u"--traffic_directions", type=int, default=2, help=u"Send bi- (2) or uni- (1) directional traffic." ) + parser.add_argument( + u"--delay", required=True, type=float, default=0.0, + help=u"Allowed time overhead, sleep time is increased by this [s]." + ) args = parser.parse_args() @@ -453,12 +466,14 @@ def main(): profile_file=args.profile, duration=args.duration, framesize=framesize, + n_data_frames=args.n_data_frames, multiplier=args.multiplier, port_0=args.port_0, port_1=args.port_1, latency=args.latency, async_start=args.async_start, traffic_directions=args.traffic_directions, + delay=args.delay, )