{"id":24370087,"url":"https://github.com/unikraft/eurosys21-artifacts","last_synced_at":"2025-04-10T17:36:42.344Z","repository":{"id":48899712,"uuid":"341874951","full_name":"unikraft/eurosys21-artifacts","owner":"unikraft","description":"Artifacts, including experiments and graphs, for the paper: \"Unikraft: Fast, Specialized Unikernels the Easy Way\" (EuroSys'21 - Best Paper Award).","archived":false,"fork":false,"pushed_at":"2021-07-06T13:07:23.000Z","size":68565,"stargazers_count":27,"open_issues_count":0,"forks_count":11,"subscribers_count":9,"default_branch":"master","last_synced_at":"2025-03-24T15:11:20.909Z","etag":null,"topics":["debian","dpdk","eurosys","eurosys21","linux","mirageos","nginx","osv","paper","papers-with-code","redis","rumprun","sqlite","unikernels","unikraft"],"latest_commit_sha":null,"homepage":"","language":"Assembly","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/unikraft.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-02-24T11:16:03.000Z","updated_at":"2025-03-19T01:47:08.000Z","dependencies_parsed_at":"2022-09-23T23:33:53.870Z","dependency_job_id":null,"html_url":"https://github.com/unikraft/eurosys21-artifacts","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/unikraft%2Feurosys21-artifacts","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/unikraft%2Feurosys21-artifacts/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/unikraft%2Feurosys21-artifacts/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/unikraft%2Feurosys21-artifacts/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/unikraft","download_url":"https://codeload.github.com/unikraft/eurosys21-artifacts/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248262043,"owners_count":21074235,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["debian","dpdk","eurosys","eurosys21","linux","mirageos","nginx","osv","paper","papers-with-code","redis","rumprun","sqlite","unikernels","unikraft"],"created_at":"2025-01-19T04:12:35.408Z","updated_at":"2025-04-10T17:36:42.325Z","avatar_url":"https://github.com/unikraft.png","language":"Assembly","readme":"\u003cimg width=\"35%\" src=\"https://user-images.githubusercontent.com/905927/113136804-14c70f80-9224-11eb-8d44-f910166660dd.png\" align=\"right\" /\u003e\n\n# Unikraft EuroSys'21 Artifacts\n\n[![](https://img.shields.io/badge/arXiv-paper-red)](https://arxiv.org/pdf/2104.12721.pdf)\n[![](https://img.shields.io/badge/EuroSys'21-slides-blue)](https://unikraft.org/assets/files/eurosys2021-slides.pdf)\n[![](https://img.shields.io/badge/EuroSys'21-Best%20Paper%20Award%20%F0%9F%8F%86-yellow)](https://2021.eurosys.org/eurosys-awards.html#awards)\n\n[![](https://user-images.githubusercontent.com/905927/116413020-2275b200-a82f-11eb-93c7-9a6914b93529.png)](https://www.youtube.com/watch?v=74EXqOCt_Sw)\n\n\n\nThis repository contains the artifacts, including experiments and graphs, for\nthe paper:\n\n### Unikraft: Fast, Specialized Unikernels the Easy Way\n\n \u003e **Abstract**:  Unikernels are famous for providing excellent performance in\n \u003e terms of boot times, throughput and memory consumption, to name a few\n \u003e metrics.  However, they are infamous for making it hard and extremely time\n \u003e consuming to extract such performance, and for needing significant\n \u003e engineering effort in order to port applications to them.  We introduce\n \u003e Unikraft, a novel micro-library OS that (1) fully modularizes OS primitives\n \u003e so that it is easy to customize the unikernel and include only relevant\n \u003e components and (2) exposes a set of composable, performance-oriented APIs in\n \u003e order to make it easy for developers to obtain high performance.\n \u003e \n \u003e Our evaluation using off-the-shelf popular applications such as NGINX,\n \u003e SQLite, and Redis shows that running such applications on Unikraft results in\n \u003e a 1.7x-2.7x performance improvement compared to Linux guests.  In addition,\n \u003e Unikraft images for these apps are around 1MB, require less than 10MB of RAM\n \u003e to run, and boot in around 1ms on top of the VMM time (total boot time\n \u003e 3ms-40ms). Unikraft is a Linux Foundation open source project and can be\n \u003e found at www.unikraft.org.\n\n[Unikraft](http://unikraft.org) is a Linux Foundation open source project and\nXen Incubator Project.  Most of the code used for this paper is upstream, or is\nin the process of being upstreamed.\n\n```\n@inproceedings{Kuenzer2021,\n  title     = {Unikraft: Fast, Specialized Unikernels the Easy Way},\n  author    = {Kuenzer, Simon     and Bădoiu, Vlad-Andrei and Lefeuvre, Hugo     and\n               Santhanam, Sharan  and Jung, Alexander     and Gain, Gaulthier    and\n\t       Soldani, Cyril     and Lupu, Costin        and Teodorescu, Ștefan and\n\t       Răducanu, Costi    and Banu, Cristian      and Mathy, Laurent     and\n               Deaconescu, Răzvan and Raiciu, Costin      and Huici, Felipe},\n  journal   = {Sixteenth European Conference on Computer Systems},\n  year      = {2021},\n  series    = {EuroSys'21},\n  publisher = {ACM},\n  address   = {New York, NY, USA},\n  doi       = {10.1145/3447786.3456248},\n  isbn      = {978-1-4503-8334-9/21/04}\n}\n```\n\n\nIf at all possible, please read through this entire document before installing\nor running experiments.\n\n## Contents of this Document\n\n  1. [Experiments](#1-experiments): List of all experiments in the paper. \n  2. [Repository structure](#2-repository-structure): Details the organization\n     of this repository.\n  3. [Prerequisites](#3-prerequisites): Explains how host machines were set up\n     for the experiments.  \n      3.1. [Hardware](#31-hardware): Details of hardware setup in the paper and\n           general recommendations.  \n      3.2. [Kernel](#32-kernel-and-parameters): Details on kernel requirements for the\n           experiments which must be addressed manually.\n  4. [Getting Started](#4-getting-started): Information on how to use this\n     repository to fully recreate the experiments.  \n     4.1. [`run.sh` Usage](#41-runsh-usage): Provides the help page for the\n          `run.sh` wrapper program.\n  5. [Notes](#5-notes): Additional notes.\n  6. [Beyond the Paper](#6-beyond-the-paper): Run Unikraft in production!\n\n## 1. Experiments\n\nThe paper comes with 22 figures, 4 tables and 2 in-line text worth of\nexperiments (although not all of them have experimental results, e.g., Figure 4\nis an architecture diagram). Each experiment and the relevant scripts to\ngenerate the data and subsequent plots are included in this repository.  We\nexpect the results generated from this artifact to match one-to-one with the\nresults in the paper, given that we used this artifact/scripts to actually\ngenerate all figures in the paper.\n\nEach figure, table and corresponding experiment are listed below:\n\n| Figure                                                     |                                                                      | Description                                                                                                                                                                                                                   | Est. runtime |\n|------------------------------------------------------------|----------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------|\n| [`fig_01`](/experiments/fig_01_linux-deps/)                | \u003cimg src=\"plots/fig_01_linux-deps.svg\" width=\"200\" /\u003e                | Linux kernel dependency graph.                                                                                                                                                                                                | 0h 50m       |\n| [`fig_02`](/experiments/fig_02_unikraft-nginx-deps/)       | \u003cimg src=\"plots/fig_02_unikraft-nginx-deps.svg\" width=\"200\" /\u003e       | NGINX Unikraft dependency graph.                                                                                                                                                                                              | 0h 5m        |\n| [`fig_03`](/experiments/fig_03_unikraft-helloworld-deps/)  | \u003cimg src=\"plots/fig_03_unikraft-helloworld-deps.svg\" width=\"200\" /\u003e  | \"Hello World\" Unikraft dependency graph.                                                                                                                                                                                      | 0h 1m        |\n| [`fig_05`](/experiments/fig_05_syscall-heatmap/)           | \u003cimg src=\"plots/fig_05_syscall-heatmap.svg\" width=\"200\" /\u003e           | Syscalls required by a set of [30 popular server applications](https://popcon.debian.org/) versus syscalls currently supported by Unikraft.                                                                                   | 0h 45m       |\n| [`fig_07`](/experiments/fig_07_syscall-support/)           | \u003cimg src=\"plots/fig_07_syscall-support.svg\" width=\"200\" /\u003e           | Syscall support for [top 30 server apps](https://popcon.debian.org/). All apps are close to being supported, and several already work even if some syscalls are stubbed (SQLite, NGINX).                                      | 0h 45m       |\n| [`fig_08`](/experiments/fig_08_unikraft-image-size/)       | \u003cimg src=\"plots/fig_08_unikraft-image-size.svg\" width=\"200\" /\u003e       | Image sizes of Unikraft applications.  We include  permutations with and without LTO and DCE.                                                                                                                                 | 0h 1m        |\n| [`fig_09`](/experiments/fig_09_compare-image-size/)        | \u003cimg src=\"plots/fig_09_compare-image-size.svg\" width=\"200\" /\u003e        | Image sizes for representative applications with Unikraft and other OSes, stripped, without LTO and DCE.                                                                                                                      | 0h 5m        |\n| [`fig_10`](/experiments/fig_10_unikraft-boot/)             | \u003cimg src=\"plots/fig_10_unikraft-boot.svg\" width=\"200\" /\u003e             | Boot time for Unikraft images with different virtual machine monitors.                                                                                                                                                        | 0h 9m        |\n| [`fig_11`](/experiments/fig_11_compare-min-mem/)           | \u003cimg src=\"plots/fig_11_compare-min-mem.svg\" width=\"200\" /\u003e           | Minimum memory needed to run different applications using different OSes, including Unikraft.                                                                                                                                 | 0h 50m       |\n| [`fig_12`](/experiments/fig_12_redis-perf/)                | \u003cimg src=\"plots/fig_12_redis-perf.svg\" width=\"200\" /\u003e                | Redis performance tested with the [`redis-benchmark`](https://github.com/redis/redis/blob/2.2/src/redis-benchmark.c), (30 connections, 100k requests, pipelining level of 16).                                                | 0h 9m        |\n| [`fig_13`](/experiments/fig_13_nginx-perf/)                | \u003cimg src=\"plots/fig_13_nginx-perf.svg\" width=\"200\" /\u003e                | NGINX (and Mirage HTTP-reply) performance tested with [`wrk`](https://github.com/wg/wrk) (1 minute, 14 threads, 30 conns, static 612B HTML page).                                                                             | 0h 50m       |\n| [`fig_14`](/experiments/fig_14_unikraft-nginx-alloc-boot/) | \u003cimg src=\"plots/fig_14_unikraft-nginx-alloc-boot.svg\" width=\"200\" /\u003e | Unikraft Boot time for NGINX with different memory allocators.                                                                                                                                                                | 0h 8m        |\n| [`fig_15`](/experiments/fig_15_unikraft-nginx-throughput/) | \u003cimg src=\"plots/fig_15_unikraft-nginx-throughput.svg\" width=\"200\" /\u003e | NGINX throughput with different memory allocators.                                                                                                                                                                            | 0h 30m       |\n| [`fig_16`](/experiments/fig_16_unikraft-sqlite-alloc/)     | \u003cimg src=\"plots/fig_16_unikraft-sqlite-alloc.svg\" width=\"200\" /\u003e     | Execution speedup in SQLite Unikraft, relative to [mimalloc](https://github.com/microsoft/mimalloc).                                                                                                                          | 0h 21m       |\n| [`fig_17`](/experiments/fig_17_unikraft-sqlite-libc/)      | \u003cimg src=\"plots/fig_17_unikraft-sqlite-libc.svg\" width=\"200\" /\u003e      | Time for 60k SQLite insertions with native Linux, [newlib](https://sourceware.org/newlib/) and [musl](https://www.musl-libc.org/) on Unikraft (marked as native) and SQLite ported automatically to Unikraft (musl external). | 0h 6m        |\n| [`fig_18`](/experiments/fig_18_unikraft-redis-alloc/)      | \u003cimg src=\"plots/fig_18_unikraft-redis-alloc.svg\" width=\"200\" /\u003e      | Throughput for Redis Unikraft, with varying memory allocators and request type (`redis-benchmark`, 30 concurrent conns, 100k requests, and a pipelining level of 16.)                                                         | 0h 5m        |\n| [`fig_19`](/experiments/fig_19_compare-dpdk/)              | \u003cimg src=\"plots/fig_19_compare-dpdk.svg\" width=\"200\" /\u003e              | TX throughput comparison of Unikraft versus [DPDK](https://www.dpdk.org/) in a Linux VM.                                                                                                                                      | 0h 30        |\n| [`fig_20`](/experiments/fig_20_compare-9pfs/)              | \u003cimg src=\"plots/fig_20_compare-9pfs.svg\" width=\"200\" /\u003e              | [9pfs](https://xenbits.xen.org/docs/unstable/misc/9pfs.html) latency for read and write operations, compared to Linux.                                                                                                        | 2h 0m        |\n| [`fig_21`](/experiments/fig_21_unikraft-boot-pages/)       | \u003cimg src=\"plots/fig_21_unikraft-boot-pages.svg\" width=\"200\" /\u003e       | Unikraft boot times with static and dynamic initialization of page tables.                                                                                                                                                    | 0h 3m        |\n| [`fig_22`](/experiments/fig_22_compare-vfs/)               | \u003cimg src=\"plots/fig_22_compare-vfs.svg\" width=\"200\" /\u003e               | Filesystem specialization and removal of the vfs layer yields important performance gains for a web cache when performing a look up and file open operation.                                                                  | 0h 5m        |\n\n| Table                                               |                                                               | Experiment                                                                                                                                                                                                                           | Est. runtime |\n|-----------------------------------------------------|---------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------|\n| [`tab_01`](/experiments/tab_01_bincompat-syscalls/) | \u003cimg src=\"plots/tab_01_bincompat-syscalls.svg\" width=\"200\" /\u003e | Cost of binary compatibility/syscalls with and without security mitigations.                                                                                                                                                         | 0h 25m       |\n| [`tab_02`](/experiments/tab_02_abi/)                | \u003cimg src=\"plots/tab_02_abi.svg\" width=\"200\" /\u003e                | Results from automated porting based on externally-built archives when linked against Unikraft using musl and newlib. We show whether the port succeeded with the glibc compatibility layer (\"compat layer\") and without it (\"std\"). | 2h 0m        |\n| [`tab_04`](/experiments/tab_04_kvs_compare/)        | \u003cimg src=\"plots/tab_04_kvs_compare.svg\" width=\"200\" /\u003e        | Performance of a specialized UDP-based in-memory key-value store on Unikraft vs. Linux.                                                                                                                                              | 1h 20m             |\n\n| Text                                                  | Experiment                        | Est. runtime |\n|-------------------------------------------------------|-----------------------------------|--------------|\n| [`txt_01`](/experiments/txt_01_unikernel-boot-times/) | Unikernel boot time baseline.     | 0h 21m       |\n| [`txt_02`](/experiments/txt_02_9pfs-boot-times/)      | Measures 9pfs boot time overhead. | 0h 5m        |\n\n## 2. Repository structure\n\nWe have organised this repository as follows:\n\n * `experiments/` - All experiments are listed in this directory.  Each\n   sub-directory is named with the figure number along with a short description\n   of the experiment (e.g., `fig_01_linux-deps`).  In addition, each experiment\n   sub-directory has a corresponding `README.md` which explains in more detail\n   how the experiment works and how to run it.  Along with this, each\n   sub-directory also comes with a `Makefile` with the following targets:\n    - `prepare`: prepares the experiment, by usually downloading and building\n      relevant images, tools, and auxiliary services necessary for running the\n      experiment.\n    - `run`: runs the experiment.\n    - `plot`: produces the figure or table.  All plots are automatically saved\n      into the [`plots/`](/plots) directory.\n    - `clean`: removes intermediate build files.\n\n * `build/` - Intermediate build artifacts necessary for experiments to run.  \n   This will be populated by the experiment's preparation (`prepare`) step.\n * `support/` - contains definitions of container images, `Dockerfile`s,\n   which are used by multiple experiments.\n * `tools/` - contain programs which are used by multiple experiments.\n * `run.sh` - A tool that wraps all experiments and can be used to run them all\n   or individually.  More details on this utility script are detailed below.\n\n## 3. Prerequisites\n\n### 3.1. Hardware\n\nBefore you can run these experiments, you will need to prepare 3 physical host\nenvironments.  **Physical hosts as opposed to virtual machines are recommended\nas they provide better performance.**  In the paper, we used three different\nsetups:\n\n 1. A Linux host (Debian Buster) with KVM enabled and Linux kernel 4.19. This\n\thost is used for most experiments. We use the 4.19 kernel because HermiTux\n\twill not run with newer versions, as noted\n\t[here](https://github.com/ssrg-vt/hermitux/issues/12).\n 2. A Linux host (Debian Buster) with Linux kernel 4.19 that has an 10gbit/s\n\tEthernet cable connected to the first host. We use it for the DPDK network\n\texperiment [`fig_19`](/experiments/fig_19_compare-dpdk/) and experiments\n\twhere we need to specifically setup the CPU frequency.\n\tSee 3.2 for further details.\n 3. A Xen host (Debian Buster) used for Xen 9pfs experiments\n\t([`txt_02`](/experiments/txt_02_9pfs-boot-times/)).\n\nA single server can be used for almost all experiments, though it would require\ndifferent Linux kernel parameters, or the Xen hypervisor and rebooting to switch\nfrom one set up to another.  The exception is the DPDK experiment, which\nrequires two servers connected to each other via a 10Gb link.\n\nAll of our results were run on inexpensive (roughly EUR 800)\n[Shuttle SH370R6](http://global.shuttle.com/products/productsDetail?productId=2265)\nboxes with an Intel i7 9700K 3.6 GHz (4.9 Ghz with Turbo Boost, 8 cores) and\n32GB of RAM. For the DPDK experiment we used [Intel X520-T2](https://ark.intel.com/content/www/de/de/ark/products/69655/intel-ethernet-converged-network-adapter-x520-t2.html)\ncards with the 82599EB chipset.\n\n\n### 3.2. Kernel and Parameters\n\nAll experiments were run on a physical host with Debian Buster and Linux 4.19\ninstalled. All install and preparation scripts in this repository target this\ndistribution and kernel version.\n\nFor all set ups, we disabled Hyper-Threading (`noht`), isolated 4 CPU cores\n(e.g. `isocpus=2-6`), switched off the IOMMU (`intel_iommu=off`), and disabled\nIPv6 (`ipv6.disable=1`). This can be done by setting kernel boot parameters with\nyour bootloader, for instance with Grub (`/etc/default/grub`):\n\n``` bash\nGRUB_CMDLINE_LINUX_DEFAULT=\"isolcpus=2-4 noht intel_iommu=off ipv6.disable=1\"\n```\n\nor with syslinux/pxelinux:\n\n``` text\n...\nLABEL item_kernel0\n  MENU LABEL Linux\n  MENU DEFAULT\n  KERNEL vmlinuz-4.19.0\n  APPEND isolcpus=2-6 noht intel_iommu=off ipv6.disable=1\n  ...\n```\n\nOn Xen we use the following parameters (please adjust the amount of pinned\nmemory for Dom0 according to your available RAM, we gave the half of 32GB RAM to\nDom0; We also pinned 4 CPU cores to Dom0):\nGrub (`/etc/default/grub`):\n\n``` bash\nGRUB_CMDLINE_LINUX_XEN_REPLACE_DEFAULT=\"\"\nGRUB_CMDLINE_LINUX_XEN_REPLACE=\"earlyprintk=xen console=hvc0 ipv6.disable=1\"\n\n# Xen boot parameters for all Xen boots\nGRUB_CMDLINE_XEN=\"\"\n# Xen boot parameters for non-recovery Xen boots (in addition to GRUB_CMDLINE_XEN)\nGRUB_CMDLINE_XEN_DEFAULT=\"dom0_vcpus_pin dom0_max_vcpus=4 smt=0 dom0_mem=15360M,max:16384M cpufreq=xen gnttab_max_frames=256\"\n```\n\nPlease note that the following experiments require additional kernel parameters\ne.g., to enable specific CPU frequency scaling governors:\n- [`tab_01`](/experiments/tab_01_bincompat-syscalls/)\n- [`tab_04`](/experiments/tab_04_kvs_compare/)\n- [`fig_19`](/experiments/fig_22_compare-dpdk/)\n- [`fig_22`](/experiments/fig_22_compare-vfs/)\n\nWe documented this within the experiment folder.\n\n## 4. Getting Started\n\n1. Before running any of these experiments, prepare your host with the\n   recommendations detailed above in [prerequisites](#3-prerequisites);\n\n2. Many of the experiments use Docker as an intermediate tool for creating build\n   and test environments (along with testing Docker itself).  Please\n   [install Docker](https://docs.docker.com/get-docker/) on your system to\n   continue;\n\n3. Once Docker is installed, clone this repository\n   ```bash\n   git clone https://github.com/unikraft/eurosys21-artifacts.git\n   ```\n\n4. All experiments should be `prepare`d first, which installs necessary tools\n   and downloads additional resources, before they can run.  This can be done by\n   calling `run.sh fig_XX prepare` ([more details below](#41-runsh-usage)) for a\n   single experiment or `run.sh prepare` for all experiments.  (Note: The\n   preparation step for all experiments usually exceeds several hours.)\n\n5. Once prepared, simply call the relevant experiment you wish to re-create\n   using the `run.sh` script.\n\n### 4.1. `run.sh` Usage\n\nWe have wrapped all the individual experiments with the `run.sh` tool.  This\nscript will install the necessary dependencies for all experiments (excluding\nDocker) only for Debian Buster.  Please see [prerequisites](#3-prerequisites)\nand [getting started](#4-getting-started) guide above.\n\n```\n./run.sh - Run all or a specific experiment.\n\nUsage:\n  ./run.sh [OPTIONS] [FIGURE_ID|TEST_NAME] [ACTION]\n\nIf no figure ID or test name is provided, the action is run for all\nexperiments.  If no action is provided, all actions are performed.\n\nExamples:\n  ./run.sh fig_01      Runs prepare, run and plot for fig_01.\n  ./run.sh prepare     Prepares all experiments.\n\nActions:\n  prepare              Prepares the host and/or builds dependent tools\n                         and images before the test is run.\n  run                  Runs the given experiment and saves the results.\n  plot                 Uses the data from the experiment to generate\n                         the plot.\n  clean                Clean intermediate build files from an experiment.\n\nOptions:\n     --no-deps         Do not try to install dependencies.\n     --no-docker-plot  Do not use Docker for plotting.\n  -l --list            List all tests and exit.\n  -v --verbose         Be verbose.\n  -h --help            Show this help menu.\n\nInfluential Environmental Variables\n  EXPERIMENTS_DIR      Directory of all the experiments\n                         (default: ./experiments).\n  DOCKER_FORCE_BUILD   Force build of Docker containers\n                         (default: y).\n  DOCKER_IMAGE_PLOT    Docker environment for generating plots\n                         (default: unikraft/eurosys21-artifacts-plot:latest).\n  PLOT_FORMAT          File format for the plot\n                         (default: svg).\n```\n\nEach experiment, and more specifically its sub-directory in `experiments/`, is\npopulated with a `README.md` which includes more detail about the individual\nexperiment.\n\n## 5. Notes\n\n * All experiments should be run as the `root` user on the host as it will\n   require modifications to the host and running commands with elevated\n   privileges, e.g. creating and destroying VMs, setting limits in `/proc`, etc.\n\n * We use intermediate Docker containers for building images and accessing\n   pre-built binaries for many of the experiments.  In addition to this, this\n   repository clones the Linux kernel to make changes for testing.  As a result,\n   expected disk storage utilized to conduct all experiments is ~50GB.\n\n * The preparation step for all experiments usually exceeds several hours.\n\n * Experiments cannot be run in parallel due to overlapping CPU core affinities,\n   which will affect measurements.\n\n * While each experiment has its own sub-directory and a `Makefile` script\n   within it, we strongly suggest to use the main `run.sh` script that wraps all\n   experiments (more on this in Section 4.1 above).\n\n * Some experiments (e.g., [`fig_22`](/experiments/fig_22_compare-vfs/)) produce\n   some error messages but still finish and correctly produce the plot; if this\n   is the case, this is documented in an experiment's sub-directory, in its own\n   `README.md` file.\n\n * All plots are saved into the global [`plots/`](/plots) directory when run via\n   `run.sh`.  When using the individual experiment's `Makefile`, it is saved to\n   the experiment's folder.\n\n## 6. Beyond the Paper\n\nThis repository only contains the performance evaluation of Unikraft.\nIn addition to this README, the Unikraft project provides [extensive\ndocumentation](http://docs.unikraft.org/) on how to use Unikraft in\nreal-world environments. In addition, interested researchers are\nwelcome to join the community via the Xen project [mailing\nlist](https://lists.xenproject.org/cgi-bin/mailman/listinfo/minios-devel)\nand [GitHub](https://github.com/unikraft).\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Funikraft%2Feurosys21-artifacts","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Funikraft%2Feurosys21-artifacts","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Funikraft%2Feurosys21-artifacts/lists"}