Internships/ProjectIdeas/IOUring
io_uring AIO engine
Summary: Add io_uring support to QEMU for high-performance disk I/O on Linux
The io_uring interface supersedes the Linux AIO API for asynchronous I/O. The core functionality of asynchronous I/O APIs is I/O request submission (reads/writes/flushes) and completion processing at a later point in time. Unlike a blocking read(2)/write(2) syscall, this allows the application threads to perform other activity while one or more I/O requests are in flight.
QEMU currently supports two asynchronous I/O engines: aio=threads (a thread-pool that invokes preadv(2)/pwritev(2)/fdatasync(2)) and aio=native (Linux AIO). This project will add io_uring support, which should achieve better performance than Linux AIO. This is because io_uring offers several optimizations:
- Memory buffers can be registered (pinned) ahead of time to avoid pinning on each request
- File descriptors can be held long-term to avoid the need to acquire them on each request
- A single system call can both submit and complete I/O requests or polling mode can be used to avoid system calls altogether
This project consists of the following tasks:
- Understanding the io_uring userspace ABI
- Extending block/file-posix.c to use io_uring
- Benchmarking io_uring against Linux AIO and aio=threads
- Adding polling mode support for completions (similar to existing Linux AIO polling code in QEMU)
- Stretch goal: Adding polling mode support for submissions
- Stretch goal: Adding a fast path when QEMU block layer features are not in use
Links:
Details:
- Skill level: intermediate
- Language: C
- Mentor: Julia Suvorova <jusual@mail.ru> ("jusual" on IRC), Stefan Hajnoczi <stefanha@redhat.com> ("stefanha" on IRC)