Skip to content

Latest commit

 

History

History
125 lines (76 loc) · 4.74 KB

调研报告.md

File metadata and controls

125 lines (76 loc) · 4.74 KB

io_uring 调研报告

[TOC]

横向对比 

pwritev select epoll AIO io_uring
I/O模型 同步 - 阻塞 同步 - 多路复用 同步 - 多路复用 异步 - 非阻塞 异步 - 非阻塞
发布
时间
Linux 2.6.30 4.2BSD Linux 2.5.66 glibc 2.1 (1999) Linux 5.1
主要
优点
多线程的
分散读和集中写
内核去遍历fd 使用系统中断来代替遍历 非阻塞 支持文件或网络
高效
主要缺点 同步,并发量低 需要遍历,导致并发量不够高 不支持文件 效率一般
不支持网络
较少应用

网络 I/O 领域对比

鉴于目前在 Linux 系统上,应用最多且性能较好的 API 是 epoll,所以此部分主要将 io_uring 与 epoll 进行对比。

优势

相比起基于 I/O 多路复用模型的epoll,io_uring 才是真正的异步非阻塞。拿快递来举例的话,同步模型就是你从在电商平台下单前,就在你家楼下一直等,直到快递公司把货送到楼下,你再把东西带上楼。epoll 类似于你下单,快递公司送到楼下,通知你可以去楼下取货了,这时你下楼把东西带上来。虽然不需要在楼下等了,但你仍需要下楼,而io_uring则是直接送到家门口,是完全的非阻塞。

劣势

处于起步阶段,大部分功能还在开发中。缺少可靠的应用案例,可能有坑。

使用场景

主要用于异步对套接字进行读写操作,通过减少同步阻塞时间和减少内存复制次数来提高并发性能。

应用情况与评价

libuv

已经有人提了PR,但还没开发完成,未被marge。

libuv/libuv#1947

libevent

有人提了issue,作者考虑在2.2版本中加入支持。

libevent/libevent#1019

nginx

通过补丁的方式来使用liburing优化Nginx,PR已被marge。

hakasenyang/openssl-patch#22

压测对比

测试机器为单核cpu的虚拟机,系统为 Linux 5.7.8-1.el7

HTTP Server

源代码以及压测程序以开源在 https://github.com/chen622/uring-server

压测时使用 Jmeter 进行,每次使用100个线程来模拟100个用户在10秒内访问网站,单次共持续30秒,测试结果如下表所示:

测试结果 epoll uring
样本数 22544 23168
平均响应时间 118 113
中位数 18 18
90% 19 20
95% 20 21
99% 2123 2120
最大响应时间 24304 21307
异常 0.15% 0.16%
标准偏差 1035.81 989.72
吞吐量 592.8/sec 615/sec
峰值吞吐量 740/sec 730/sec

为与go语言提供的net包进行对比,又对代码进行了修改,不再去文件中载入HTML内容,改为直接使用静态值。同时给客户端设定了5000ms连接超时,3000ms处理超时的配置。

测试结果 epoll uring golang
样本数 22825 23168 56296
平均响应时间 111 112 44
中位数 18 18 42
90% 20 20 55
95% 315 313 60
99% 3004 3016 105
最大响应时间 6002 6003 130
异常 1.15% 1.16% 0.00%
标准偏差 534 537 13.1
吞吐量 717.7/sec 713.7/sec 1878.5/sec

go语言在Linux中使用了epoll来进行io复用,对比后可确定epoll和uring的测试瓶颈不在于网络等其他因素。

Nginx

通过打补丁使nginx支持io_uring,测试其性能是否有提升。测试内容为载入一个300KB+的HTML文件,使用jmeter模拟300个用户在5秒内访问,并持续30s。

平均 标准差 异常 吞吐量
sendfile 788 177.63 0% 346
uring 843 330.93 0% 322
aio 890 993 2.73% 294
aio+theadpool 844 619.19 0% 321
none 881 0% 310

参考资料

https://linux.die.net/man/2/pwritev

https://linux.die.net/man/2/select

https://linux.die.net/man/7/epoll

https://linux.die.net/man/7/aio

https://www.mankier.com/2/io_uring_enter

原生的 Linux 异步文件操作,io_uring 尝鲜体验 https://www.jqhtml.com/44513.html

https://unixism.net/loti/async_intro.html