Io uring: Difference between revisions
No edit summary |
Sohom Datta (talk | contribs) No edit summary |
||
Line 3: | Line 3: | ||
'''io_uring''' (previously known as '''aioring''') is a [[Linux kernel]] [[system call]] interface for storage device [[asynchronous I/O]] operations supposed to address performance issues with similar interfaces provided by functions like {{Code|read()}}/{{Code|write()}} or {{Code|aio_read()}}/{{Code|aio_write()}} etc. for [[File operation|operation]]<nowiki/>s on data accessed by [[file descriptor]]<nowiki/>s.<ref name="Axboe2019" /><ref>{{Cite web|last=Axboe|first=Jens|date=October 15, 2019|title=Efficient IO with io_uring|url=https://kernel.dk/io_uring.pdf|url-status=live}}</ref>{{Rp|page=2}} It has been primarily developed by [[Jens Axboe]] at Facebook.<ref name="Axboe2019" /> |
'''io_uring''' (previously known as '''aioring''') is a [[Linux kernel]] [[system call]] interface for storage device [[asynchronous I/O]] operations supposed to address performance issues with similar interfaces provided by functions like {{Code|read()}}/{{Code|write()}} or {{Code|aio_read()}}/{{Code|aio_write()}} etc. for [[File operation|operation]]<nowiki/>s on data accessed by [[file descriptor]]<nowiki/>s.<ref name="Axboe2019" /><ref>{{Cite web|last=Axboe|first=Jens|date=October 15, 2019|title=Efficient IO with io_uring|url=https://kernel.dk/io_uring.pdf|url-status=live}}</ref>{{Rp|page=2}} It has been primarily developed by [[Jens Axboe]] at Facebook.<ref name="Axboe2019" /> |
||
Internally it works by creating two buffers dubbed as "queue rings" ([[circular buffer]]<nowiki/>s) for storage of submission and completion of I/O requests (for storage devices, submission queue (SQ) and completion queue (CQ) respectively).<ref name=":1">{{Cite web|title=Getting Hands-on with io_uring using Go|url=https://developers.mattermost.com/blog/hands-on-iouring-go/|access-date=2021-11-20|website=developers.mattermost.com|language=en-us}}</ref> Most importantly, keeping these buffers shared between the kernel and application helps to boost the [[IOPS|I/O performance]] by eliminating the need to issue extra and expensive system calls to copy these buffers between the two.<ref name="Axboe2019">{{Cite web|title=Linux Kernel Getting io_uring To Deliver Fast & Efficient I/O - Phoronix|url=https://www.phoronix.com/scan.php?page=news_item&px=Linux-io_uring-Fast-Efficient|url-status=live|access-date=2021-03-14|website=[[Phoronix]]}}</ref><ref name=":0">{{Cite web|title=The rapid growth of io_uring [LWN.net]|url=https://lwn.net/Articles/810414/|access-date=2021-11-20|website=lwn.net}}</ref><ref name=":1" /> According to the |
Internally it works by creating two buffers dubbed as "queue rings" ([[circular buffer]]<nowiki/>s) for storage of submission and completion of I/O requests (for storage devices, submission queue (SQ) and completion queue (CQ) respectively).<ref name=":1">{{Cite web|title=Getting Hands-on with io_uring using Go|url=https://developers.mattermost.com/blog/hands-on-iouring-go/|access-date=2021-11-20|website=developers.mattermost.com|language=en-us}}</ref> Most importantly, keeping these buffers shared between the kernel and application helps to boost the [[IOPS|I/O performance]] by eliminating the need to issue extra and expensive system calls to copy these buffers between the two.<ref name="Axboe2019">{{Cite web|title=Linux Kernel Getting io_uring To Deliver Fast & Efficient I/O - Phoronix|url=https://www.phoronix.com/scan.php?page=news_item&px=Linux-io_uring-Fast-Efficient|url-status=live|access-date=2021-03-14|website=[[Phoronix]]}}</ref><ref name=":0">{{Cite web|title=The rapid growth of io_uring [LWN.net]|url=https://lwn.net/Articles/810414/|access-date=2021-11-20|website=lwn.net}}</ref><ref name=":1" /> According to the io_uring design paper, the SQ buffer is writable only by consumer application, and CQ - by kernel.{{R|name=Axboe2019|page=3}} |
||
The API provided by {{Code|liburing}} library for userspace (applications) can be used to interact with the kernel interface more easily.<ref name="Axboe2019" />{{R|name=Axboe2019|page=12}} |
The API provided by {{Code|liburing}} library for userspace (applications) can be used to interact with the kernel interface more easily.<ref name="Axboe2019" />{{R|name=Axboe2019|page=12}} |
Revision as of 10:21, 23 November 2021
io_uring (previously known as aioring) is a Linux kernel system call interface for storage device asynchronous I/O operations supposed to address 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 has been primarily developed by Jens Axboe at Facebook.[1]
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] Most importantly, 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 CQ - by 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 adapted in Linux 5.1 kernel version.[1][4][5]
History
The Linux kernel had asynchronous I/O since version 2.5, but it was seen as difficult to use and inefficient.[6]
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)
External links
- Efficient I/O with io_uring, in-depth description of motivation behind io_uring, interface (data structures etc.), and performance assessment