diff --git a/perfkitbenchmarker/linux_benchmarks/netperf_benchmark.py b/perfkitbenchmarker/linux_benchmarks/netperf_benchmark.py index 08a0c119ae..389858d4ca 100644 --- a/perfkitbenchmarker/linux_benchmarks/netperf_benchmark.py +++ b/perfkitbenchmarker/linux_benchmarks/netperf_benchmark.py @@ -55,9 +55,8 @@ flags.DEFINE_integer( 'netperf_warmup_test_length', 60, - 'The duration of the warmup run in seconds. If --netperf_benchmarks' - ' contains TCP_RR, a warmup run of this duration will be performed before' - ' the benchmark runs. If 0, no warmup is done.', + 'The duration of the warmup run in seconds. If greater than 0, a warmup ' + 'run of this duration will be performed before each benchmark run.', lower_bound=0, ) flags.DEFINE_bool( @@ -241,13 +240,6 @@ def Prepare(benchmark_spec): ], 2, ) - if ( - TCP_RR in FLAGS.netperf_benchmarks - and FLAGS.netperf_warmup_test_length > 0 - ): - # If TCP_RR is requested, do a warmup run as 1st run performance could be - # low due to initial flow setup issue. - RunClientServerVMs(client_vm, server_vm, FLAGS.netperf_warmup_test_length) def PrepareClientVM(client_vm): @@ -526,12 +518,8 @@ def RunNetperf( 'netperf_test_length': test_length, 'sending_thread_count': num_streams, 'max_iter': FLAGS.netperf_max_iter or 1, + 'netperf_warmup_test_length': FLAGS.netperf_warmup_test_length, } - if ( - TCP_RR in FLAGS.netperf_benchmarks - and FLAGS.netperf_warmup_test_length > 0 - ): - metadata['netperf_warmup_test_length'] = FLAGS.netperf_warmup_test_length remote_cmd_list = [] assert server_ips, 'Server VM does not have an IP to use for netperf.' @@ -803,6 +791,20 @@ def RunClientServerVMs(client_vm, server_vm, test_length=None): for netperf_benchmark in FLAGS.netperf_benchmarks: if vm_util.ShouldRunOnExternalIpAddress(): + if FLAGS.netperf_warmup_test_length > 0: + logging.info( + 'Running warmup for %s for %d seconds', + netperf_benchmark, + FLAGS.netperf_warmup_test_length, + ) + RunNetperf( + client_vm, + netperf_benchmark, + server_vm.GetExternalIPs(), + num_streams, + [client_vm.GetInternalIPs()[0]], + FLAGS.netperf_warmup_test_length, + ) external_ip_results = RunNetperf( client_vm, netperf_benchmark, @@ -821,6 +823,20 @@ def RunClientServerVMs(client_vm, server_vm, test_length=None): results.extend(external_ip_results) if vm_util.ShouldRunOnInternalIpAddress(client_vm, server_vm): + if FLAGS.netperf_warmup_test_length > 0: + logging.info( + 'Running warmup for %s for %d seconds', + netperf_benchmark, + FLAGS.netperf_warmup_test_length, + ) + RunNetperf( + client_vm, + netperf_benchmark, + server_vm.GetInternalIPs(), + num_streams, + client_vm.GetInternalIPs(), + FLAGS.netperf_warmup_test_length, + ) internal_ip_results = RunNetperf( client_vm, netperf_benchmark, diff --git a/tests/linux_benchmarks/netperf_benchmark_test.py b/tests/linux_benchmarks/netperf_benchmark_test.py index 45be03d268..be803cc998 100644 --- a/tests/linux_benchmarks/netperf_benchmark_test.py +++ b/tests/linux_benchmarks/netperf_benchmark_test.py @@ -54,6 +54,7 @@ def setUp(self): self.should_run_internal = p.start() self.addCleanup(p.stop) FLAGS.netperf_enable_histograms = False + FLAGS.netperf_warmup_test_length = 0 def _ConfigureIpTypes(self, run_external=True, run_internal=True): self.should_run_external.return_value = run_external @@ -244,6 +245,25 @@ def testMultiStreams(self): [i[:3] for i in result], ) + @flagsaver.flagsaver(netperf_benchmarks=['TCP_STREAM']) + @flagsaver.flagsaver(netperf_num_streams=[1]) + @flagsaver.flagsaver(netperf_warmup_test_length=5) + def testWarmup(self): + self._ConfigureIpTypes(run_external=False, run_internal=True) + vm_spec = mock.MagicMock(spec=benchmark_spec.BenchmarkSpec) + vm_spec.vms = [mock.MagicMock(), mock.MagicMock()] + vm_spec.vms[0].RobustRemoteCommand.side_effect = [ + (self.expected_stdout[0], ''), # Warmup + (self.expected_stdout[0], ''), # Actual + ] + vm_spec.vms[1].GetInternalIPs.return_value = ['test_ip'] + vm_spec.vms[0].GetInternalIPs.return_value = ['test_ip'] + unused_run_result = netperf_benchmark.Run(vm_spec) + self.assertEqual(vm_spec.vms[0].RobustRemoteCommand.call_count, 2) + call_args_list = vm_spec.vms[0].RobustRemoteCommand.call_args_list + self.assertIn('-l 5', call_args_list[0][0][0]) + self.assertIn('-l 60', call_args_list[1][0][0]) + if __name__ == '__main__': unittest.main()