Epoll 的两种触发模式
在高性能网络编程中,Epoll 是 Linux 内核提供的 I/O 多路复用机制。理解它的两种触发模式——水平触发(Level Triggered, LT)和边缘触发(Edge Triggered, ET),是掌握高并发架构的关键。
水平触发(LT)
LT 模式的行为类似于传统的 select 和 poll。只要被监控的文件描述符(FD)处于就绪状态(例如有数据可读或缓冲区可写),epoll_wait() 就会持续通知应用程序。
这意味着,如果你在一次调用中没有将缓冲区的数据全部读完,下一次调用 epoll_wait() 时,它依然会报告该 FD 就绪。这种模式容错率高,但如果在高并发场景下存在大量未处理完毕的 FD,可能会导致频繁的系统调用,降低效率。
边缘触发(ET)
ET 模式则是'通知一次'机制。只有当 FD 的状态发生变化时(例如从不可读变为可读),epoll_wait() 才会通知你。
一旦通知了,即使你只读取了一部分数据,只要 FD 仍处于就绪状态,epoll_wait() 也不会再次通知,直到该 FD 再次发生状态变化(例如又有新数据到达)。因此,使用 ET 模式时,通常要求将 FD 设置为非阻塞模式,并循环读写直到返回 EAGAIN 错误,确保数据被彻底处理。
性能对比
在实际应用中,LT 模式下如果系统中有大量不需要的就绪 FD,它们每次都会返回,增加了筛选成本。而 ET 模式避免了这种冗余通知,显著减少了系统调用的次数。对于追求极致性能的服务器端应用,ET 模式往往更具优势,但实现复杂度也相应提高。

