sudo sysctl -p 的主要作用是重新加载 /etc/sysctl.conf 或 /etc/sysctl.d/*.conf 中的内核参数并立即应用到运行中的内核,使修改的网络、内存等参数(如 net.core.somaxconn、net.ipv4.tcp_tw_reuse)实时生效,而非仅静态保存。

要让 worker_connections 真正跑出高并发能力,光改 Nginx 配置远远不够。内核必须“接得住”——sysctl -p 就是把底层网络参数从配置文件刷进内存的关键一步,否则再大的 worker_connections 也会卡在连接队列、半开握手或端口耗尽上。
哪些内核参数必须用 sysctl -p 生效
以下参数需写入 /etc/sysctl.conf,再执行 sysctl -p 才能真正起作用:
-
net.core.somaxconn = 65535:监听 socket 的全连接队列长度,直接影响accept()能否及时取走已建立的连接;若小于worker_connections,Nginx 即便配置了 10 万连接,也会因队列溢出丢连接 -
net.ipv4.tcp_max_syn_backlog = 65535:SYN 半连接队列大小,应对突发 TCP 握手请求;不匹配somaxconn容易出现类似 SYN Flood 的连接失败 -
net.ipv4.tcp_tw_reuse = 1:允许 TIME-WAIT 状态套接字快速复用于新连接,缓解高并发下端口枯竭 -
net.ipv4.ip_local_port_range = 1024 65535:扩大客户端可用临时端口范围,避免connect()失败
为什么不能只改配置文件而不执行 sysctl -p
/etc/sysctl.conf 只是静态定义,系统启动时才自动加载一次。运行中修改后必须显式执行 sysctl -p,否则内核仍沿用旧值。常见误操作是改完文件就 reload Nginx,结果连接数上不去、日志里反复出现 accept() failed (24: Too many open files) 或 Connection refused。
验证是否真正生效
别依赖“我写了就等于起了”。执行完 sysctl -p 后,务必逐项确认:
- 查当前值:
sysctl net.core.somaxconn、sysctl net.ipv4.tcp_max_syn_backlog - 检查是否与
/etc/sysctl.conf中一致 - 观察 Nginx error log 是否还有 “
accept() failed (11: Resource temporarily unavailable)”,该错误常指向somaxconn不足
配套动作缺一不可
sysctl -p 是内核侧关键一环,但必须和其它配置对齐才能闭环:
-
worker_rlimit_nofile必须 ≥worker_connections,并建议留 20%~30% 余量(如设worker_rlimit_nofile 262144,则worker_connections最好 ≤ 200000) - 系统级 ulimit 必须同步提升:修改
/etc/security/limits.conf并确保nginx用户 soft/hard nofile ≥worker_rlimit_nofile;若用 systemd,还需加LimitNOFILE=到 service override - Nginx 必须重启(不是 reload):因为 fd 限制在进程启动时读取,reload 不重载
worker_rlimit_nofile

















