diff options
| -rw-r--r-- | archive/2025/README.md | 1 | ||||
| -rw-r--r-- | archive/2025/summer/msc_kreutzer/README.md | 48 | ||||
| -rw-r--r-- | archive/2025/summer/msc_kreutzer/iperf/process.py | 101 |
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} +""") |