引言
高并发网络编程中,I/O模型决定系统性能。从阻塞IO到io_uring,Linux内核持续演进。
网络IO本质
数据包从网卡经DMA写入内核缓冲区,用户进程读取即拷贝到用户空间。进程可能阻塞等待(阻塞IO)或立即返回(非阻塞IO+事件通知)。
五种经典IO模型
1. 阻塞IO:recvfrom阻塞直到数据就绪。2. 非阻塞IO:立即返回EAGAIN。3. IO多路复用:select/poll监控多个fd。4. 信号驱动IO:SIGIO通知。5. 异步IO:AIO真正异步但限制多。
select局限
位图结构,1024 fd限制,每次重置fd_set,O(n)遍历。
poll使用链表解除数量限制,但仍O(n)遍历。
epoll原理
内核使用红黑树管理fd,就绪链表存放就绪事件。O(1)添加删除,O(k)通知就绪事件。
LT(水平触发):持续通知直到条件不满足。ET(边缘触发):仅状态变化时通知一次,减少通知次数。
多线程epoll采用Leader-Follower模式,EPOLLEXCLUSIVE避免惊群。
io_uring革新
共享环形缓冲区(SQ/CQ)在无syscall下提交/收割IO请求。支持链式SQE、固定缓冲区、SQPOLL内核线程轮询。适合高频IO场景。
选型指南
HTTP短连接用epoll;WebSocket用epoll LT;文件存储/数据库用io_uring。Nginx 1.21+实验性支持io_uring用于文件IO。
总结
从阻塞到io_uring,Linux网络IO持续演进追求更高吞吐更低延迟。无银弹,因地制宜。

发表评论 取消回复