Skip to content

Commit

Permalink
Show all tests in same plot
Browse files Browse the repository at this point in the history
Collect the results from all tests, and plot them using one barh() per
test. This shows all test in the same scale, making it easy to
understand the performance of the test configurations in all tests.

The socket_vmnet plot was separated to vz and qemu plots, since showing
6 configurations for 3 tests is too much. This makes it harder to
compare vz and qemu performance, but the main point of that plot is
how adding vms decrease the performance.
  • Loading branch information
nirs committed Feb 22, 2025
1 parent 2b2d846 commit 68cf69e
Show file tree
Hide file tree
Showing 7 changed files with 70 additions and 26 deletions.
66 changes: 47 additions & 19 deletions bench
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import sys
import time

import matplotlib.pyplot as plt
import numpy as np
import yaml

import vmnet
Expand Down Expand Up @@ -108,8 +109,20 @@ def do_plot(args):
os.makedirs(path, exist_ok=True)

for mode in config["operation-modes"]:
data = {"mode": mode, "tests": config["tests"], "results": []}

drivers = {}
for test in config["tests"]:
plot(mode, test, config, args)
for name, bitrate in load_results(mode, test, config, args):
drivers.setdefault(name, []).append(bitrate)

for name, bitrates in drivers.items():
# We must have the same shape for all results.
while len(bitrates) < len(config["tests"]):
bitrates.append(0)
data["results"].append({"name": name, "bitrates": bitrates})

plot(data, config, args)


def load_benchfile(filename):
Expand Down Expand Up @@ -313,9 +326,8 @@ def run_command(*cmd, output=None):
subprocess.run(cmd, check=True)


def plot(mode, test, config, args):
names = []
bitrate = []
def load_results(mode, test, config, args):
results = []

# For socket_vment we may have multiple files per test with different vm
# count. Example directory layout:
Expand All @@ -331,9 +343,9 @@ def plot(mode, test, config, args):
# host-to-vm.json
# shared-vz-3/
# host-to-vm.json
results = glob.glob(f"{args.output}/bench/*/{mode}-*/{test}.json")
files = glob.glob(f"{args.output}/bench/*/{mode}-*/{test}.json")

for filename in reversed(sorted(results)):
for filename in sorted(files):
_, network, mode_driver_vms, _ = filename.rsplit(os.sep, 3)
_, driver, vms = mode_driver_vms.split("-")
vms = int(vms)
Expand Down Expand Up @@ -361,23 +373,39 @@ def plot(mode, test, config, args):
if len(config.get("vms", [])) != 1:
name += f" #{vms}"

names.append(name)
bitrate.append(gbits_per_second)
results.append((name, gbits_per_second))

return results


def plot(data, config, args):
plt.style.use(["web.mplstyle"])

fig, ax = plt.subplots(layout="constrained")
ax.barh(names, bitrate, zorder=2)
for i in range(len(names)):
v = round(bitrate[i], 1)
label = f"{v:.1f} "
plt.text(bitrate[i], i, label, va="center", ha="right", color="white", zorder=2)

bar_width = 0.9 / len(data["results"])
offset = 0
y = np.arange(len(data["tests"]))

for result in data["results"]:
ax.barh(
y + offset,
result["bitrates"],
bar_width,
label=result["name"],
zorder=2,
)
offset += bar_width

ax.invert_yaxis()
fig.legend(loc="outside right center")
ax.grid(visible=True, axis="x", zorder=0)
ax.set(
xlabel="Bitrate Gbits/s",
ylabel="Configurations",
title=f"{mode} network - {test}",
)
path = os.path.join(args.output, "plot", config["name"], f"{mode}-{test}.png")
ax.set_xlabel("Bitrate Gbits/s")
ax.set_ylabel("Tests")
ax.set_yticks(y + bar_width / 2 * (len(data["results"]) - 1), data["tests"])
ax.set_title(f"{config['title']} - {data['mode']} network")

path = os.path.join(args.output, "plot", config["name"], f"{data['mode']}.png")
print(f"Plot {path}")
fig.savefig(path, bbox_inches="tight")

Expand Down
3 changes: 2 additions & 1 deletion plots/drivers.yaml
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
# SPDX-FileCopyrightText: The vmnethelper authors
# SPDX-License-Identifier: Apache-2.0

# Compare lima drivers with socket_vment
# Compare vmnet-helper drivers
---
name: drivers
title: vmnet-helper
networks: [vmnet-helper]
drivers: [vfkit, qemu, krunkit]
vms: [2]
Expand Down
3 changes: 2 additions & 1 deletion plots/offloading.yaml
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
# SPDX-FileCopyrightText: The vmnethelper authors
# SPDX-License-Identifier: Apache-2.0

# Compare lima drivers with socket_vment
# Compare vmnet-helper drivers with offloading
---
name: offloading
title: vmnet-helper offloading
networks: [vmnet-helper]
drivers: [vfkit, vfkit:offload, krunkit, krunkit:nooffload]
vms: [2]
Expand Down
12 changes: 12 additions & 0 deletions plots/socket_vmnet-vms-qemu.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# SPDX-FileCopyrightText: The vmnethelper authors
# SPDX-License-Identifier: Apache-2.0

# Compare socket_vmnet performance with different number of vms.
---
name: socket_vmnet-vms-qemu
title: socket_vmnet vms - qemu
networks: [socket_vmnet]
drivers: [qemu]
vms: [1, 2, 3]
operation-modes: [shared, bridged]
tests: [host-to-vm, vm-to-host, vm-to-vm]
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
# SPDX-FileCopyrightText: The vmnethelper authors
# SPDX-License-Identifier: Apache-2.0

# Compare lima drivers with socket_vment
# Compare socket_vmnet performance with different number of vms.
---
name: socket_vmnet-scale
name: socket_vmnet-vms-vz
title: socket_vmnet vms - vz
networks: [socket_vmnet]
drivers: [vz, qemu]
drivers: [vz]
vms: [1, 2, 3]
operation-modes: [shared, bridged]
tests: [host-to-vm, vm-to-host, vm-to-vm]
3 changes: 2 additions & 1 deletion plots/vmnet-helper-vs-socket_vmnet.yaml
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
# SPDX-FileCopyrightText: The vmnethelper authors
# SPDX-License-Identifier: Apache-2.0

# Compare lima drivers with socket_vment
# Compare vmnet-helper with socket_vmnet
---
name: vmnet-helper-vs-socket_vmnet
title: vmnet-helper vs socket_vmnet
networks: [socket_vmnet, vmnet-helper]
drivers: [vfkit, vz, qemu]
vms: [2]
Expand Down
2 changes: 1 addition & 1 deletion web.mplstyle
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ axes.linewidth: 0.8
axes.titlepad: 10
axes.titlesize: 9
figure.dpi: 120
figure.figsize: 5, 2.5
figure.figsize: 6, 3
font.family: sans
font.size: 8
grid.alpha: 0.5
Expand Down

0 comments on commit 68cf69e

Please sign in to comment.