epoll——I/O多路复用技术 Linux 下实现 I/O 多路复用的系统调用有 select、poll、epoll。其中 epoll 是性能最好、最适合高并发场景的。1.I/O多路复用要搞懂epoll就得先明白什么是多路复用技术。它的本质其实很简单用一个内核维护的监控集合如 epoll存储所有已连接的客户端 socket主线程阻塞在 epoll_wait 上没有时间时线程挂起不会占用cpu有事件时内核才会唤醒它。等待内核通知哪些 socket 真的有了 I/O 事件数据到达/可写/新连接然后主线程逐个串行一个一个处理这些就绪的 socket。在 Redis 中因为处理是内存操作且极快单个线程就能支撑 10 万 连接。关于这词分开解释I/O输入/输出这里特指网络 I/Osocket 的读和写。多路多个网络连接很多个 socket。复用复用同一个线程或进程来管理所有这些连接。合起来用一个线程通过一种机制如 epoll/select/poll来同时监控多个 socket只处理那些已经准备好可读/可写/异常的 socket。核心优势不需要为每个连接创建一个线程省内存、省切换开销。线程不会被空闲连接阻塞可以随时去处理就绪的连接。2.epoll本身是什么epoll 本身就是一个事件通知接口它允许用户态程序向内核注册一批 socket然后让内核帮忙监控这些 socket 上是否有 I/O 事件发生并在事件发生时通知程序。想象你是一个仓库管理员主线程你需要照看 1 万个货架客户端连接。select/poll你每次都要从头走到尾问每个货架“你有没有货要出”轮询。epoll 是更聪明的系统你给每个货架装一个呼叫按钮然后你坐在监控室epoll 实例里里面有一个登记本红黑树 记下所有货架的位置。当货架有货时按钮会点亮监控室的待办白板就绪链表 上就会自动写上货架号。你只需要看白板epoll_wait然后去处理白板上的货架。这个“监控室 登记本 白板”就是内核中 epoll 实例所做的事情。