102 lines
3.1 KiB
Python
102 lines
3.1 KiB
Python
|
# python3
|
||
|
# Copyright 2019 Google LLC
|
||
|
#
|
||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
# you may not use this file except in compliance with the License.
|
||
|
# You may obtain a copy of the License at
|
||
|
#
|
||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||
|
# Unless required by applicable law or agreed to in writing, software
|
||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
# See the License for the specific language governing permissions and
|
||
|
# limitations under the License.
|
||
|
"""Network microbenchmarks."""
|
||
|
|
||
|
from typing import Dict
|
||
|
|
||
|
from benchmarks import suites
|
||
|
from benchmarks.harness import machine
|
||
|
from benchmarks.suites import helpers
|
||
|
from benchmarks.workloads import iperf
|
||
|
|
||
|
|
||
|
def run_iperf(client: machine.Machine,
|
||
|
server: machine.Machine,
|
||
|
client_kwargs: Dict[str, str] = None,
|
||
|
server_kwargs: Dict[str, str] = None) -> str:
|
||
|
"""Measure iperf performance.
|
||
|
|
||
|
Args:
|
||
|
client: A machine object.
|
||
|
server: A machine object.
|
||
|
client_kwargs: Additional client container options.
|
||
|
server_kwargs: Additional server container options.
|
||
|
|
||
|
Returns:
|
||
|
The output of iperf.
|
||
|
"""
|
||
|
if not client_kwargs:
|
||
|
client_kwargs = dict()
|
||
|
if not server_kwargs:
|
||
|
server_kwargs = dict()
|
||
|
|
||
|
# Pull images.
|
||
|
netcat = client.pull("netcat")
|
||
|
iperf_client_image = client.pull("iperf")
|
||
|
iperf_server_image = server.pull("iperf")
|
||
|
|
||
|
# Set this due to a bug in the kernel that resets connections.
|
||
|
client.run("sudo /sbin/sysctl -w net.netfilter.nf_conntrack_tcp_be_liberal=1")
|
||
|
server.run("sudo /sbin/sysctl -w net.netfilter.nf_conntrack_tcp_be_liberal=1")
|
||
|
|
||
|
with server.container(
|
||
|
iperf_server_image, port=5001, **server_kwargs).detach() as iperf_server:
|
||
|
(host, port) = iperf_server.address()
|
||
|
# Wait until the service is available.
|
||
|
client.container(netcat).run(host=host, port=port)
|
||
|
# Run a warm-up run.
|
||
|
client.container(
|
||
|
iperf_client_image, stderr=True, **client_kwargs).run(
|
||
|
host=host, port=port)
|
||
|
# Run the client with relevant arguments.
|
||
|
res = client.container(iperf_client_image, stderr=True, **client_kwargs)\
|
||
|
.run(host=host, port=port)
|
||
|
helpers.drop_caches(client)
|
||
|
return res
|
||
|
|
||
|
|
||
|
@suites.benchmark(metrics=[iperf.bandwidth], machines=2)
|
||
|
def upload(client: machine.Machine, server: machine.Machine, **kwargs) -> str:
|
||
|
"""Measure upload performance.
|
||
|
|
||
|
Args:
|
||
|
client: A machine object.
|
||
|
server: A machine object.
|
||
|
**kwargs: Client container options.
|
||
|
|
||
|
Returns:
|
||
|
The output of iperf.
|
||
|
"""
|
||
|
if kwargs["runtime"] == "runc":
|
||
|
kwargs["network_mode"] = "host"
|
||
|
return run_iperf(client, server, client_kwargs=kwargs)
|
||
|
|
||
|
|
||
|
@suites.benchmark(metrics=[iperf.bandwidth], machines=2)
|
||
|
def download(client: machine.Machine, server: machine.Machine, **kwargs) -> str:
|
||
|
"""Measure download performance.
|
||
|
|
||
|
Args:
|
||
|
client: A machine object.
|
||
|
server: A machine object.
|
||
|
**kwargs: Server container options.
|
||
|
|
||
|
Returns:
|
||
|
The output of iperf.
|
||
|
"""
|
||
|
|
||
|
client_kwargs = {"network_mode": "host"}
|
||
|
return run_iperf(
|
||
|
client, server, client_kwargs=client_kwargs, server_kwargs=kwargs)
|