#浅析开源项目之io_uring

Linux内核5.1支持了新的异步IO框架iouring,由Block IO大神也即Fio作者Jens Axboe开发,意在提供一套公用的网络和磁盘异步IO,不过io_uring目前在磁盘方面要比网络方面更加成熟。

目录 背景简介 io_uring 系统API liburing 高级特性 编程示例 性能对比 模式对比 线上应用 背景简介 熟悉Linux系统编程的同学都清楚,Linux并没有提供完善的异步IO(网络IO、磁盘IO)机制。

在网络编程中,我们通常使用epoll IO多路复用来处理网络IO,然而epoll也并不是异步网络IO,仅仅是内核提供了IO复用机制,epoll回调通知的是数据可以读取或者写入了,具体的读写操作仍然需要用户去做,而不是内核代替完成。

在存储IO栈中,做存储的同学大都使用过libaio,然而那是一个巨难用啊Linux AIO这个奇葩。首先只能在DIO下使用,用不了pagecache;其次用户的数据地址空间起始地址和大小必须页大小对齐;然后在submit_io时仍然可能因为文件系统、pagecache、sync发生阻塞,除此之外,我们在使用libaio的时候会设置io_depth的大小,还可能因为内核的/sys/block/sda/queue/nr_requests(128)设置的过小而发生阻塞;而且libaio提供的sync命令关键还不起作用,想要sync数据还得依赖fsync/fdatasync,真的是心塞塞,libaio想说爱你不容易啊。

所以Linux迫切需要一个完善的异步机制。同时在Linux平台上跑的大多数程序都是专用程序,并不需要内核的大多数功能,而且这几年也流行kernel bypass,intel也发起的用户态IO DPDK、SPDK。但是这些用户态IO API不统一,使用成本过高,所以内核便推出了io_uring来统一网络和磁盘的异步IO,提供一套统一完善的异步API,也支持异步、轮询、无锁、zero copy。真的是姗姗来迟啊,不过也算是在高性能IO方面也算是是扳回了一城。

io_uring io_uring的设计目标是提供一个统一、易用、可扩展、功能丰富、高效的网络和磁盘系统接口。其高性能依赖于以下几个方面:

用户态和内核态共享提交队列(submission queue)和完成队列(completion queue)。 用户态支持Polling模式,不依赖硬件的中断,通过调用IORING_ENTER_GETEVENTS不断轮询收割完成事件。 内核态支持Polling模式,IO 提交和收割可以 offload 给 Kernel,且提交和完成不需要经过系统调用(system call)。 在DirectIO下可以提前注册用户态内存地址,减小地址映射的开销。

后续原文: https://zhuanlan.zhihu.com/p/361955546


#评论

#评论 1 · 2023-03-10T07:49:54.391000Z

https://zhuanlan.zhihu.com/p/413523052