The experiments in this folder will evaluate the costs of a noop
system call and a function call on a Linux KVM VM and Unikraft KVM
VM. The same benchmark ELF binary (sources under src/
) is executed
on both kernels. Because we want to measure a baseline: the time
needed to enter and exit a system call handler, the kernels are
instrumented with a noop
system call (number 500) that only
returns a constant value. Under the folder linux/
you can find
the binary and build configuration of a patched vanilla Linux 5.11.0
kernel. You find also build instructions there.
Please note that these experiments do their measurement with the TSC.
You need to make sure that your machine does not dynamically scale
the CPU frequency while the experiment is running. This makes sure
that the TSC clock can be considered stable.
On recent Intel CPUs you can achieve pinning the CPU frequency by
adding intel_pstate=disable
to the Linux kernel arguments of
the host (on Debian see /etc/default/grub
). After a reboot, our
script /tools/tunecpumax
can help you enabling the userspace
frequency scaling governor on your host and setting up the maximum
non-turbo frequency permanently to your CPU.
./clone-deps.sh
- Clones needed repositories from GitHub to build a Unikraft unikernel that can execute the benchmark ELF binary./build-elfloader.sh
- Compile the Unikraft unikernel for this experiment./build-benchmark.sh
- Builds the benchmark binary withinsrc/
./build-fses.sh
- Creates an initramdisk that only contains the benchmark program as init process for the Linux experiments../run.sh
- Run the experiments, console outputs are stored undereval/parsed/
for later evaluation../parse.sh
- Parses the console outputs, intermediate data withineval/
./process.sh
- Computes the average, median, q1, and q3 over the data. It creates a table withinresults/
Alternatively, you can execute these steps with make all
.
All steps together take roughly 25 mins.
With ./clean.sh
you can delete all compilation units, cloned
repositories and intermediate measurement data. It keeps the final
overview table of the experiment within results/
.
While the experiments are running, you may notice kernel panics for the Linux experiments:
[ 1.317775] Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000000
[...]
This particular panic message (Attempted to kill init!
) is expected.
It happens because we do execute our benchmark program as system
initialization process instead of /sbin/init
. When our benchmark
completed, the process exits and returns 0
. As long as the
exitcode
is 0 (0x00000000
), our experiment executed successfully.