ARTICLE · 1196381
Linux 6.12 源码深度剖析: ep_poll
Linux 6.12 源码深度剖析: ep_poll
某金融交易系统一到业务高峰就抽风,CPU 直接飙升,交易延迟跟着抖动。查了一圈才发现,病根出在 epoll 机制上。
这系统用的是默认的 EPOLLLT 模式。问题就在这:只要 socket 里还有数据没读完,下一次 epoll_wait 就会立刻再次报告就绪。结果一个客户端发了 1MB 数据,应用每次只读 4KB,硬生生被唤醒了 256 次。频繁抢锁、疯狂上下文切换,CPU 不爆才怪。
后来干脆切到了 EPOLLET 边缘触发模式。这下只在状态变化时通知一次,应用收到后必须循环读写直到 EAGAIN。配合把缓冲区调大,CPU 终于降下来了。
不过真要切 ET 模式,有几条铁律得守好:
必须配非阻塞 IO:不然读到一半卡死,整个服务都得陪葬。
必须一次性处理完:没读完的数据,内核不会再提醒你第二遍。
多线程慎用 EPOLLONESHOT:用完后记得重新武装,不然连接直接失联。
原文Linux 6.12 源码深度剖析: ep_poll
作者提示: 个人观点,仅供参考
四川,1小时前,















































































