What is io_uring
io_uring is a Linux kernel interface for high-performance I/O that eliminates system call overhead by using shared memory rings between user space and kernel space. A single CPU core using io_uring can saturate a 200 Gbit network link.
How does it work?
Traditional I/O requires a system call for every operation — each read(), write(), or send() crosses the boundary between user space and kernel, which costs CPU cycles. At high packet rates, these transitions become the bottleneck.
io_uring replaces this with two ring buffers in shared memory:
- Submission Queue (SQ) — the application writes I/O requests here.
- Completion Queue (CQ) — the kernel writes results here.
Both the application and the kernel can read and write to these rings without making system calls. The application posts work to the SQ, and the kernel picks it up and posts results to the CQ. In the best case, there are zero syscalls per I/O operation.
How is it different from DPDK?
DPDK (Data Plane Development Kit) achieves high performance by bypassing the kernel entirely — the application takes direct control of the network card. This means you lose all kernel features: firewalls, routing, eBPF, and integration with the rest of the networking stack.
io_uring stays inside the kernel. It keeps the entire kernel networking stack intact — you still get TCP, UDP, firewall rules, and eBPF hooks. The performance improvement comes from eliminating the overhead of crossing the user/kernel boundary, not from bypassing the kernel itself.
Who uses it?
io_uring has been adopted by high-performance servers and databases. It's the foundation of several modern async runtimes and is increasingly used in networked storage systems where latency matters.
Why it matters
io_uring represents a middle ground between traditional syscall-based I/O (simple but slow at scale) and kernel-bypass approaches like DPDK (fast but loses kernel features). It lets applications achieve near-DPDK performance while keeping the full power of the Linux networking stack.