一句话定义
epoll 是 Linux 内核中针对大规模并发连接优化的 I/O 事件通知机制。它彻底摒弃了传统的线性扫描或轮询模式,转而采用 事件驱动(Event-driven) 与异步回调机制,实现了 O(1) 复杂度的就绪通知效率。
核心原理
epoll 的高效源于其内核中的“三位一体”设计:
- 红黑树 (RB-Tree):用于存储所有被监控的 FD。红黑树的增删改查效率极高(O(log N)),且 FD 只需在注册时拷贝一次到内核,无需重复拷贝。
- 回调机制 (Callback):当某个 FD 有数据到达时,内核会自动触发回调函数,将该 FD 放入“就绪链表”。
- 就绪链表 (Ready List):
epoll_wait调用时,直接检查这个链表是否有数据即可。如果有,直接返回给用户,效率是 O(1)。
水平触发 (LT) vs 边缘触发 (ET)
- LT (Level Triggered):只要缓冲区有数据,就一直通知。这是默认模式,比较稳健。
- ET (Edge Triggered):只有数据“新到达”的那一刻才通知一次。效率更高,但要求程序必须一次性把数据读完(通常配合非阻塞 I/O)。
为什么它能支持千万级并发?因为
epoll的工作量只取决于 “活跃的连接数”,而不是“总连接数”。即使你维护了 100 万个连接,只要其中只有 100 个在发数据,epoll的处理速度依然极快。
应用场景
- 高并发服务器:如 Nginx、Redis、Node.js 等现代高性能后端组件的核心。
- 分布式系统:处理海量长连接的网关和代理。
知识扩展
- C10K 问题:单机同时处理一万个并发连接的挑战,
epoll是该问题的标准答案。