Io uring: Difference between revisions
→External links: add links to liburing and io_uring source repos |
m →External links: fix link |
||
Line 20: | Line 20: | ||
== External links == |
== External links == |
||
* [https://kernel.dk/io_uring.pdf Efficient I/O with io_uring], in-depth description of motivation behind io_uring, interface (data structures etc.), and performance assessment |
* [https://kernel.dk/io_uring.pdf Efficient I/O with io_uring], in-depth description of motivation behind io_uring, interface (data structures etc.), and performance assessment |
||
* [https://git.kernel.dk/cgit/liburing/ {{Code|liburing}} source repository] |
* [https://git.kernel.dk/cgit/liburing/tree/ {{Code|liburing}} source repository] |
||
* [https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/io_uring {{Code|io_uring}} source directory in the Linux kernel repository] |
* [https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/io_uring {{Code|io_uring}} source directory in the Linux kernel repository] |
||
Revision as of 06:29, 4 November 2022
io_uring (previously known as aioring) is a Linux kernel system call interface for storage device asynchronous I/O operations addressing performance issues with similar interfaces provided by functions like read()
/write()
or aio_read()
/aio_write()
etc. for operations on data accessed by file descriptors.[1][2]: 2
It was primarily developed by Jens Axboe at Facebook.[1]
Interface
Internally it works by creating two buffers dubbed as "queue rings" (circular buffers) for storage of submission and completion of I/O requests (for storage devices, submission queue (SQ) and completion queue (CQ) respectively).[3] Keeping these buffers shared between the kernel and application helps to boost the I/O performance by eliminating the need to issue extra and expensive system calls to copy these buffers between the two.[1][4][3] According to the io_uring design paper, the SQ buffer is writable only by consumer application, and the CQ buffer only by the kernel.[1]: 3
The API provided by liburing
library for userspace (applications) can be used to interact with the kernel interface more easily.[1][1]: 12
Both kernel interface and library were adopted in Linux 5.1 kernel version.[1][4][5]
The Linux kernel has had asynchronous I/O since version 2.5, but it was seen as difficult to use and inefficient.[6] The old API only supported certain niche use cases.[7]
References
- ^ a b c d e f g "Linux Kernel Getting io_uring To Deliver Fast & Efficient I/O - Phoronix". Phoronix. Retrieved 2021-03-14.
{{cite web}}
: CS1 maint: url-status (link) - ^ Axboe, Jens (October 15, 2019). "Efficient IO with io_uring" (PDF).
{{cite web}}
: CS1 maint: url-status (link) - ^ a b "Getting Hands-on with io_uring using Go". developers.mattermost.com. Retrieved 2021-11-20.
- ^ a b "The rapid growth of io_uring [LWN.net]". lwn.net. Retrieved 2021-11-20.
- ^ "Faster IO through io_uring | Kernel Recipes 2019". Retrieved 2021-03-14.
- ^ Corbet, Jonathan. "Ringing in a new asynchronous I/O API". LWN.net. Retrieved 2021-03-14.
{{cite web}}
: CS1 maint: url-status (link) - ^ "What's new with io_uring" (PDF). Retrieved 2022-06-01.
External links
- Efficient I/O with io_uring, in-depth description of motivation behind io_uring, interface (data structures etc.), and performance assessment
liburing
source repositoryio_uring
source directory in the Linux kernel repository