select、poll、epoll 是 Linux 系统中用于实现 I/O 多路复用的机制,它们的主要区别如下:
数据结构与最大连接数
select使用固定长度的位掩码(bitmap)表示文件描述符(FD)集合,默认最大支持 1024 个 FD(由 FD_SETSIZE 限制)。 缺点:FD 数量受限,需手动管理位掩码,效率低。poll
使用 pollfd 数组存储 FD 信息,理论上无最大连接数限制(仅受系统资源限制)。 优点:突破了 select 的 FD 数量限制。epoll
使用内核事件表(红黑树)管理 FD,最大连接数取决于系统内存(如百万级)。 优点:数据结构更高效,适合处理大量连接。事件通知机制
select/poll采用轮询方式:每次调用需遍历所有 FD,检查是否有事件发生。 时间复杂度:O (n),连接数越多性能越差。epoll
采用事件驱动机制:内核直接通知哪些 FD 就绪,无需轮询。 时间复杂度:O (1),性能不随 FD 数量增加而下降。内存拷贝与内核开销
select/poll每次调用需将 FD 集合从用户空间拷贝到内核空间,开销较大。epoll
使用 epoll_ctl() 注册 FD 到内核事件表,仅需一次拷贝。后续只需在用户空间和内核空间之间传递 就绪事件列表,效率更高。应用场景
select适合连接数少且固定的场景(如早期 UNIX 系统)。poll
适合中等数量连接的场景(突破了 select 的限制)。epoll
适合大量连接且活跃连接较少的场景(如高性能服务器、Nginx、Redis 等)。
accept_mutex on:是 Nginx 配置中的一个关键指令,用于控制多个 worker 进程如何处理新连接的负载均衡。
负载均衡:当多个 Nginx worker 进程监听同一个端口时,accept_mutex 会使这些进程竞争一个全局锁(互斥锁)
每次仅允许一个 worker 进程接受新连接。
避免 “惊群效应”:若没有这个锁,当新连接到达时,所有 worker 进程都会被唤醒(即 “惊群”),但只有一个
进程能成功处理连接,其他进程会空转,浪费 CPU 资源。multi_accept on:是 Nginx 配置中的一个指令,用于控制 worker 进程如何处理新连接。
批量接受连接:当一个 worker 进程通过 accept() 系统调用获取到新连接时,若 multi_accept on启用,
该进程会一次性接受所有已就绪的连接,而不是只接受一个。
减少上下文切换:默认情况下(multi_accept off),Nginx 每个事件周期仅接受一个连接,可能导致频繁的
上下文切换。启用后可减少这种开销。
ab -c 1000 -n 10000 http://127.0.0.1/
-c 1000:并发数(Concurrency),即同时发起 1000 个请求。
-n 10000:总请求数(Number),即总共发送 10000 个请求。
worker_rlimit_nofile:
用于调整 worker 进程的最大文件描述符数量。在高并发场景下,合理设置该参数
可避免 “Too many open files” 错误,提升系统稳定性。
Linux 系统默认每个进程最多可打开 1024 个文件描述符(包括网络连接、文件等),高并发时可能不足。
通过 worker_rlimit_nofile 可直接为 Nginx worker 进程设置更高的限制,无需修改系统全局配置
(如 /etc/security/limits.conf)。
server_tokens off;取消在客户端显示具体的nginx版本号(作用在server空间内)
评论 (0)