about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--archive/2025/README.md1
-rw-r--r--archive/2025/summer/msc_kreutzer/README.md48
-rw-r--r--archive/2025/summer/msc_kreutzer/iperf/process.py101
3 files changed, 150 insertions, 0 deletions
diff --git a/archive/2025/README.md b/archive/2025/README.md
index 943c20438..20de5ee6d 100644
--- a/archive/2025/README.md
+++ b/archive/2025/README.md
@@ -6,6 +6,7 @@
 | --------------------------------- | ----------------------------------------------------------------------------------------- | ---- | ---------------------------------------- | ------------------------------------------------------------- |
 | Berkay Eren Ürün                  | LLM-OS: Orchestrating Edge Inference with Priority Scheduling and Adaptive KV Cache Management | MA | Teofil Bodea                          | [Source](/archive/2025/summer/msc_berkay_eren_ueruen)
 | Anders Choi                  | Airlift: A Binary Lifter Based on a Machine-Readable Architecture Specification | MA | Martin Fink                          | [Source](/archive/2025/summer/msc_choi)
+| Dominik Kreutzer                  | vDPDK: A Para-Virtualized DPDK Device Model for vMux                                      | MA   | Peter Okelmann, Masanori Misono          | [Source](/archive/2025/summer/msc_kreutzer)                   |
 
 ## Winter semester
 
diff --git a/archive/2025/summer/msc_kreutzer/README.md b/archive/2025/summer/msc_kreutzer/README.md
new file mode 100644
index 000000000..7ea51aeef
--- /dev/null
+++ b/archive/2025/summer/msc_kreutzer/README.md
@@ -0,0 +1,48 @@
+# vDPDK: A Para-Virtualized DPDK Device Model for vMux
+
+## vMux Code
+
+https://github.com/vmuxIO/vmuxIO/tree/159c33acdf3617e214a9f118a2d64a30db279854
+
+Main code can be found in `src/devices/vdpdk*`.
+
+Code for DPDK-TAP forwarding used for non-DPDK benchmarks is in `subprojects/dpdk-tap-fwd`.
+
+Measurement scripts can be found in `test/src`. The sections in my thesis
+correspond to the following scripts:
+
+* DPDK benchmarks
+
+  * Throughput and latency
+
+    `test/autotest test-load-lat-file -t test/conf/tests_multihost.cfg`
+
+  * Packet classification
+
+    `test/src/measure_mediation.py`
+
+* Non-DPDK benchmarks
+
+  * TCP throughput
+
+    `test/src/measure_iperf.py`
+
+  * Cloud serving benchmark
+
+    `test/src/measure_ycsb.py`
+
+  * Microservice benchmark
+
+    `test/src/measure_hotel.py`
+
+## DPDK Code
+
+https://github.com/vmuxIO/dpdk/tree/89837a1ce08227dbc3ccadaa203ae5f72300295a
+
+All code can be found in `drivers/net/vdpdk`.
+
+## Plots
+
+Iperf plots were generated with the script found in the `iperf` subdirectory.
+
+All remaining plots were generated with scripts from the https://github.com/vmuxIO/plots repository.
diff --git a/archive/2025/summer/msc_kreutzer/iperf/process.py b/archive/2025/summer/msc_kreutzer/iperf/process.py
new file mode 100644
index 000000000..0557c5b14
--- /dev/null
+++ b/archive/2025/summer/msc_kreutzer/iperf/process.py
@@ -0,0 +1,101 @@
+import math
+import json
+import sys
+
+REPS = 5
+
+def percentile(datapoints, p):
+    i = p * (len(datapoints) - 1)
+    i1 = math.floor(i)
+    i2 = math.ceil(i)
+    return 0.5 * (datapoints[i1] + datapoints[i2])
+
+def upper_whisker(datapoints, up_quart, iqr):
+    limit = up_quart + 1.5 * iqr
+    for n in reversed(datapoints):
+        if n < limit:
+            return n
+
+def lower_whisker(datapoints, low_quart, iqr):
+    limit = low_quart - 1.5 * iqr
+    for n in datapoints:
+        if n > limit:
+            return n
+
+def process(mode, direction):
+    datapoints = []
+    for rep in range(REPS):
+        path = f"outputs_iperf2/iperf3VMs_iperf3_1vms_{mode}_{direction}_tcp_-1B_rep{rep}/vm1.json"
+        with open(path, 'r') as f:
+            data = json.load(f)
+        for timepoint in data["intervals"]:
+            bps = timepoint["sum"]["bits_per_second"]
+            if "sum_bidir_reverse" in data:
+                bps += timepoint["sum_bidir_reverse"]["bits_per_second"]
+            bps /= 1000000000
+            datapoints.append(bps)
+    datapoints.sort()
+    median = percentile(datapoints, 0.5)
+    low_quart = percentile(datapoints, 0.25)
+    up_quart = percentile(datapoints, 0.75)
+    iqr = up_quart - low_quart
+    low_whisk = lower_whisker(datapoints, low_quart, iqr)
+    up_whisk = upper_whisker(datapoints, up_quart, iqr)
+    outliers = []
+    for n in datapoints:
+        if n < low_whisk or n > up_whisk:
+            outliers.append(str(n))
+    outliers_str = "\\\\\n".join(outliers)
+    outliers_str += "\\\\"
+    print(f"""\\addplot+ [boxplot prepared={{
+    lower whisker={low_whisk},
+    lower quartile={low_quart},
+    median={median},
+    upper quartile={up_quart},
+    upper whisker={up_whisk},
+}}] table [row sep=\\\\,y index=0,header=false] {{
+{outliers_str}
+}};""")
+
+interfaces = [
+    "vfio",
+    "bridge",
+    "bridge-vhost",
+    "vmux-emu",
+    "vmux-dpdk-e810",
+    "vmux-med",
+    "vmux-vdpdk"
+]
+interface_names = [
+    "Qemu-pt",
+    "Qemu-VirtIO",
+    "Qemu-vhost",
+    "vMux-emu-e1000",
+    "vMux-emu-e810",
+    "vMux-med-e810",
+    "vMux-vDPDK"
+]
+
+print(r"""
+\begin{tikzpicture}
+\begin{axis}[
+	boxplot/draw direction=y,
+	width=.7\textwidth,
+	ylabel={TCP throughput (Gbit/s)},
+	xtick=\empty,
+	name=axis,
+	cycle list={deep1,deep2,deep3,deep4,deep5,deep6,deep7,deep8,deep9},
+	legend style={draw=none,at={(1.03,0.5)},matrix anchor=west,cells={anchor=west},column sep=1ex},
+	legend image code/.code={
+\draw[fill] (0cm,-0.1cm) rectangle (0.6cm,0.1cm);
+},
+]
+""")
+for intf, name in zip(interfaces, interface_names):
+    process(intf, sys.argv[1])
+    print(f"\\addlegendentry{{{name}}}")
+
+print(r"""
+\end{axis}
+\end{tikzpicture}
+""")