epoll在Linux 2.6.8+内核中默认可用,无需额外开启;需正确调用epoll_create1、epoll_ctl、epoll_wait三步,配合非阻塞fd及系统参数调优(如file-max、somaxconn等),并推荐使用ET模式以提升性能。

直接启用 epoll 不需要额外“开启”,它在 Linux 2.6+ 内核中默认可用。真正要做的,是让应用程序正确使用 epoll 接口,并配合内核与系统参数调优,才能发挥其最高效率。
一、确认内核支持并检查当前环境
epoll 自 Linux 2.6.8 起稳定可用,现代发行版(如 CentOS 7+/Ubuntu 16.04+)均默认启用:
- 运行 uname -r 确认内核版本 ≥ 2.6.8
- 检查头文件是否存在:ls /usr/include/sys/epoll.h
- 无需加载模块或修改内核配置——epoll 是内核原生功能,不是可选驱动
二、应用层正确调用 epoll 三步法
核心是三个系统调用配合非阻塞 fd,缺一不可:
-
epoll_create1(EPOLL_CLOEXEC):创建 epoll 实例,推荐用
epoll_create1(0)或带EPOLL_CLOEXEC标志,避免子进程继承 fd -
epoll_ctl(epfd, EPOLL_CTL_ADD, fd, &ev):注册监听事件;
ev.events至少含EPOLLIN,强烈建议加EPOLLET(边缘触发) - epoll_wait(epfd, events, maxevents, timeout):阻塞等待就绪事件;返回的是已就绪的 fd 列表,不是全量扫描
关键前提:所有被 epoll 监控的 fd 必须设为非阻塞模式(fcntl(fd, F_SETFL, O_NONBLOCK)),否则 ET 模式下可能阻塞,LT 模式下易漏事件。
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
三、必须配套的系统级调优
epoll 高效的前提是系统资源跟得上并发规模:
-
扩大文件描述符上限:
echo 6553500 > /proc/sys/fs/file-max
ulimit -n 100000(写入/etc/security/limits.conf持久生效) -
调大连接队列:
sysctl -w net.core.somaxconn=65535
sysctl -w net.ipv4.tcp_max_syn_backlog=65535 -
启用 TIME_WAIT 复用(仅服务端):
sysctl -w net.ipv4.tcp_tw_reuse=1
四、LT 与 ET 模式选择建议
两者都属 epoll,但行为差异极大:
-
水平触发(LT,默认):只要 fd 处于就绪态(如 recv 缓冲区有数据),每次
epoll_wait都会返回它。开发简单,但容易重复通知,轻微性能损耗 -
边缘触发(ET,加
EPOLLET):仅在状态变化瞬间通知一次(如从无数据→有数据)。必须一次性读/写到EAGAIN/EWOULDBLOCK,否则可能丢事件。性能更高,是 Nginx/Redis 的标配
生产环境推荐 ET 模式,但务必搭配非阻塞 IO 和完整读写循环(例如循环 recv(..., MSG_DONTWAIT) 直到返回 -1 并检查 errno)。










