centos 7 海量连接需同步调大 net.core.somaxconn、net.ipv4.tcp_max_syn_backlog、fs.file-max、ulimit -n 及 systemd limitnofile,否则仍会 connection refused 或 emfile 错误。

CentOS 7 默认内核参数对海量连接(如 >65536)支持不足,直接改 /etc/sysctl.conf 里的 net.core.somaxconn 和 net.ipv4.ip_local_port_range 不够,必须同步调大 fs.file-max、net.core.netdev_max_backlog,并确保应用层没用 ulimit -n 硬限制卡死。
为什么改了 net.core.somaxconn 还是连不上?
常见现象:应用日志报 Connection refused 或 Cannot assign requested address,但 ss -ltn 显示端口已监听。根本原因是内核允许的半连接队列(SYN queue)和全连接队列(accept queue)被填满,而默认值通常只有 128。
-
net.core.somaxconn控制 accept queue 最大长度,CentOS 7 默认是 128,建议设为65536或更高(需同时调大应用 listen() 的backlog参数) -
net.ipv4.tcp_max_syn_backlog控制 SYN queue 长度,建议与somaxconn同值 - 修改后必须执行
sysctl -p生效,且重启服务(如 nginx、redis)才能让新 backlog 生效
文件描述符不够导致新建连接失败
当并发连接数超过 1024,socket() 会直接返回 EMFILE 错误——这不是网络问题,是进程级资源耗尽。CentOS 7 默认 ulimit -n 是 1024,fs.file-max 是 790000 左右,但两者都得调。
CentOS Linux 7.9.2009是传统CentOS Linux 7的最后主要版本,也是很多企业历史服务器中仍可能遇到的系统版本。它以稳定、兼容RHEL 7生态、文档丰富和软件支持广泛著称,曾长期用于Web服务、数据库、虚拟化节点和企业内部业务系统。不过CentOS Linux 7已于2024年6月30日停止维护,现在继续使用会面临安全补丁缺失风险。该版本更适合旧业务迁移、历史环境恢复或离线兼容性测试。
- 全局上限:在
/etc/sysctl.conf加fs.file-max = 2097152(200 万),运行sysctl -p - 用户级限制:编辑
/etc/security/limits.conf,追加两行:* soft nofile 1048576* hard nofile 1048576
注意:该配置对 systemd 服务不生效,需额外在 service 文件里加LimitNOFILE=1048576 - 验证:用
cat /proc/$(pgrep nginx)/limits | grep "Max open files"看实际生效值
端口耗尽(Cannot assign requested address)怎么解?
短连接高频场景(如 HTTP client),客户端快速释放后进入 TIME_WAIT,端口被占住无法复用。CentOS 7 默认 net.ipv4.ip_local_port_range 是 32768 65535(仅 32768 个可用端口),远不够。
- 扩大端口范围:在
/etc/sysctl.conf改成net.ipv4.ip_local_port_range = 1024 65535 - 谨慎开启
net.ipv4.tcp_tw_reuse = 1:仅对 client 场景安全,server 端开启可能引发 TIME_WAIT 混乱 - 避免滥用
net.ipv4.tcp_fin_timeout:从 60 改到 30 并不能显著提升,反而增加连接状态管理负担
systemd 服务没读取 ulimit 怎么办?
CentOS 7 使用 systemd 后,/etc/security/limits.conf 对通过 systemctl start 启动的服务无效——这是最常被忽略的一环。
- 找到对应 unit 文件,例如
/usr/lib/systemd/system/nginx.service - 在
[Service]下添加:LimitNOFILE=1048576LimitNPROC=1048576 - 重载配置:
systemctl daemon-reload,再systemctl restart nginx - 检查是否生效:
systemctl show nginx | grep LimitNOFILE
真正卡住海量连接的,往往不是单个参数,而是 ulimit、sysctl、systemd unit 三处限制叠加;改完别只看 sysctl 值,一定要用 cat /proc/PID/limits 和 ss -s 实时验证进程实际能力。










