Internships/ProjectIdeas/IOUring: Difference between revisions
(One intermediate revision by the same user not shown) | |||
Line 1: | Line 1: | ||
=== io_uring AIO engine === | === io_uring AIO engine === | ||
'''Status:''' Aarushi Mehta is working on the project for Outreachy. Project status is [[Features/IOUring|here]]. | |||
'''Summary:''' Add io_uring support to QEMU for high-performance disk I/O on Linux | '''Summary:''' Add io_uring support to QEMU for high-performance disk I/O on Linux | ||
Line 17: | Line 18: | ||
* Stretch goal: Adding polling mode support for submissions | * Stretch goal: Adding polling mode support for submissions | ||
* Stretch goal: Adding a fast path when QEMU block layer features are not in use | * Stretch goal: Adding a fast path when QEMU block layer features are not in use | ||
* Stretch goal: Use IORING_OP_POLL_ADD so unify QEMU's polling and blocking event loop code paths | |||
'''Links:''' | '''Links:''' |
Latest revision as of 15:12, 17 May 2019
io_uring AIO engine
Status: Aarushi Mehta is working on the project for Outreachy. Project status is here.
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
- Stretch goal: Use IORING_OP_POLL_ADD so unify QEMU's polling and blocking event loop code paths
Links:
Details:
- Skill level: intermediate
- Language: C
- Mentor: Julia Suvorova <jusual@mail.ru> ("jusual" on IRC), Stefan Hajnoczi <stefanha@redhat.com> ("stefanha" on IRC)