Linux下高性能非阻塞网络模型的核心是epoll结合非阻塞socket,通过fcntl设置socket为O_NONBLOCK避免读写阻塞,使用epoll_create创建实例、epoll_ctl注册事件、epoll_wait监听就绪事件,推荐采用边缘触发(EPOLLET)模式以提升效率,服务器主循环中监听socket接收新连接并加入epoll,普通socket读取数据直至EAGAIN,处理完后根据需要注册写事件,关闭时移除fd并释放资源,该机制高效支持海量并发连接。

Linux 下实现高性能的非阻塞网络模型,核心在于使用 epoll 结合非阻塞 socket。这种组合能支持成千上万并发连接,是构建高并发服务器(如 Web 服务器、即时通讯系统)的基础。
非阻塞 IO 与 epoll 的基本原理
传统阻塞 IO 在调用 read/write 时会挂起进程,直到数据就绪。在大量并发连接场景下,每个连接占用一个线程或进程,资源消耗大。非阻塞 IO 配合事件驱动机制(如 epoll)可在一个线程内高效管理多个连接。
epoll 是 Linux 特有的多路复用机制,相比 select/poll 更高效,支持边缘触发(ET)和水平触发(LT)模式,尤其适合处理大量空闲连接中少数活跃的情况。
设置非阻塞 socket
要使用 epoll,必须将 socket 设置为非阻塞模式,避免在读写时阻塞整个程序。
- 创建 socket 后,通过 fcntl 或 socket 选项将其设为非阻塞:
- fcntl(sockfd, F_SETFL, O_NONBLOCK);
- accept 接收的新连接也需立即设为非阻塞。
- 任何 read/write 操作都应循环处理 EAGAIN/EWOULDBLOCK 错误,表示当前无数据可读/缓冲区满。
使用 epoll 的关键步骤
epoll 提供三个主要接口:epoll_create、epoll_ctl、epoll_wait。
- epoll_create:创建一个 epoll 实例,返回 epoll 文件描述符。
- epoll_ctl:注册、修改或删除监控的文件描述符及其事件(如 EPOLLIN、EPOLLOUT)。
- epoll_wait:等待事件发生,返回就绪的事件列表,可指定超时时间。
- 推荐使用边缘触发(EPOLLET),减少重复通知,提升性能,但需一次性读完数据(循环 read 直到 EAGAIN)。
简单服务端流程示例
一个典型的 epoll 服务器主循环如下:
- 创建监听 socket,绑定地址,开始监听(listen)。
- 将监听 socket 设为非阻塞,加入 epoll 监控(关注 EPOLLIN)。
- 循环调用 epoll_wait 获取就绪事件。
- 若监听 socket 就绪,accept 新连接并加入 epoll。
- 若普通 socket 就绪且为读事件,read 数据并处理;若需要响应,注册 EPOLLOUT 事件等待发送。
- 连接关闭时从 epoll 删除并关闭 fd。
基本上就这些。掌握非阻塞 IO 和 epoll 的配合使用,是写出高性能 Linux 网络服务的关键。细节上注意错误处理、资源释放和事件触发模式的选择,避免漏事件或忙轮询。










