traffic_replay: use packets per second as primary scale
authorDouglas Bagnall <douglas.bagnall@catalyst.net.nz>
Wed, 7 Nov 2018 00:31:31 +0000 (13:31 +1300)
committerDouglas Bagnall <dbagnall@samba.org>
Tue, 8 Jan 2019 22:55:35 +0000 (23:55 +0100)
The old -S/--scale-traffic is relative to the original model, which made
its relationship to true traffic volumes quite opaque

Signed-off-by: Douglas Bagnall <douglas.bagnall@catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
python/samba/emulate/traffic.py
script/traffic_replay

index 76c39efba56b89fdf7d189b30c7ac5dfc40beb4f..036037598165c2399c99322f212bad9108ee7559 100644 (file)
@@ -1277,16 +1277,22 @@ class TrafficModel(object):
 
         return c
 
-    def generate_conversation_sequences(self, scale, duration, replay_speed=1,
+    def scale_to_packet_rate(self, scale):
+        rate_n, rate_t  = self.packet_rate
+        return scale * rate_n / rate_t
+
+    def packet_rate_to_scale(self, pps):
+        rate_n, rate_t  = self.packet_rate
+        return  pps * rate_t / rate_n
+
+    def generate_conversation_sequences(self, packet_rate, duration, replay_speed=1,
                                         persistence=0):
         """Generate a list of conversation descriptions from the model."""
 
         # We run the simulation for ten times as long as our desired
         # duration, and take the section at the end.
         lead_in = 9 * duration
-        rate_n, rate_t  = self.packet_rate
-        target_packets = int(duration * scale * rate_n / rate_t)
-
+        target_packets = int(packet_rate * duration)
         conversations = []
         n_packets = 0
 
@@ -1310,8 +1316,10 @@ class TrafficModel(object):
             conversations.append(c)
             n_packets += len(c)
 
-        print(("we have %d packets (target %d) in %d conversations at scale %f"
-               % (n_packets, target_packets, len(conversations), scale)),
+        scale = self.packet_rate_to_scale(packet_rate)
+        print(("we have %d packets (target %d) in %d conversations at %.1f/s "
+               "(scale %f)" % (n_packets, target_packets, len(conversations),
+                               packet_rate, scale)),
               file=sys.stderr)
         conversations.sort()  # sorts by first element == start time
         return conversations
index c864c540d1083edacad99c782d8d54c237784b54..7174d246d3b7f4c16cc2125e60788f29503ba5e9 100755 (executable)
@@ -79,8 +79,11 @@ def main():
                                        'These options alter the traffic '
                                        'generated by the model')
     model_group.add_option('-S', '--scale-traffic', type='float', default=1.0,
-                           help='Increase the number of conversations by '
-                           'this factor')
+                           help=('Increase the number of conversations by '
+                                 'this factor (or use -T)'))
+    parser.add_option('-T', '--packets-per-second', type=float,
+                      help=('attempt this many packets per second '
+                            '(alternative to -S)'))
     parser.add_option('--old-scale',
                       action="store_true",
                       help='emulate the old scale for traffic')
@@ -227,6 +230,11 @@ def main():
         logger.error("--group-memberships requires --number-of-groups")
         sys.exit(1)
 
+    if opts.scale_traffic is not None and opts.packets_per_second is not None:
+        logger.error("--scale-traffic and --packets-per-second "
+                     "are incompatible. Use one or the other.")
+        sys.exit(1)
+
     if opts.timing_data not in ('-', None):
         try:
             open(opts.timing_data, 'w').close()
@@ -272,9 +280,14 @@ def main():
         logger.info(("Using the specified model file to "
                      "generate conversations"))
 
+        if opts.scale_traffic:
+            packets_per_second = model.scale_to_packet_rate(opts.scale_traffic)
+        else:
+            packets_per_second =  opts.packets_per_second
+
         conversations = \
             model.generate_conversation_sequences(
-                opts.scale_traffic,
+                packets_per_second,
                 opts.duration,
                 opts.replay_rate,
                 opts.conversation_persistence)