Kernel Bypass for Storage I/O with io_uring

  • Type:Bachelor Thesis
  • Date:20.04.2024
  • Supervisor:

    Prof. Dr. Frank Bellosa
    Yussuf Khalil

  • Graduand:Floy Schneider
  • Links:PDF
  • Abstract
    In recent years, the access latency of non-volatile storage devices has decreased, with an increase in bandwidth. This has led to the system call and kernel overhead becoming the bottleneck for storage I/O. The Linux kernel recently introduced the io_uring interface for I/O operations to address these and other shortcomings. This interface is based on two ring buffers shared between a userspace process and the kernel. One ring buffer is used to submit commands to the kernel, the other to receive the results.
    Alternatively, allowing applications direct access to storage device bypassing the kernel shows significant performance benefits for I/O-heavy applications. Previous approaches such as Intel SPDK rely on a custom interface for kernel bypass which requires explicit application support. Also, they commonly allow an application full access to the storage device with no isolation on a process or file system level.
    In this thesis, we present a library for transparently providing kernel bypass for storage I/O based on the io_uring interface. This means our approach is usable with a range of existing applications without modification. We chose an FPGA-based PCIe device equipped with Intel Optane Persistent Memory for our experiments. By utilizing this FPGA device to restrict access via kernel bypass to specific ranges of the persistent memory, we are able to provide similar isolation guarantees as the kernel for access to the storage device.
    We show compatibility of our library with existing applications and are able to demonstrate read latency speedups of up to 3.37× compared to kernel-based io_uring when reading files which are not in the page cache.
      author = {Floy Schneider},
      title = {Kernel Bypass for Storage I/O with io_uring},
      type = {Bachelor Thesis},
      year = 2024,
      month = april # "20",
      school = {Operating Systems Group, Karlsruhe Institute of Technology (KIT), Germany}