[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 | 使用系统中断来代替遍历 | 非阻塞 | 支持文件或网络 高效 |
主要缺点 | 同步,并发量低 | 需要遍历,导致并发量不够高 | 不支持文件 | 效率一般 不支持网络 |
较少应用 |
鉴于目前在 Linux 系统上,应用最多且性能较好的 API 是 epoll,所以此部分主要将 io_uring 与 epoll 进行对比。
相比起基于 I/O 多路复用模型的epoll,io_uring 才是真正的异步非阻塞。拿快递来举例的话,同步模型就是你从在电商平台下单前,就在你家楼下一直等,直到快递公司把货送到楼下,你再把东西带上楼。epoll 类似于你下单,快递公司送到楼下,通知你可以去楼下取货了,这时你下楼把东西带上来。虽然不需要在楼下等了,但你仍需要下楼,而io_uring则是直接送到家门口,是完全的非阻塞。
处于起步阶段,大部分功能还在开发中。缺少可靠的应用案例,可能有坑。
主要用于异步对套接字进行读写操作,通过减少同步阻塞时间和减少内存复制次数来提高并发性能。
已经有人提了PR,但还没开发完成,未被marge。
有人提了issue,作者考虑在2.2版本中加入支持。
通过补丁的方式来使用liburing优化Nginx,PR已被marge。
测试机器为单核cpu的虚拟机,系统为 Linux 5.7.8-1.el7
源代码以及压测程序以开源在 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支持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