Linux高并发Socket调优需同步调整系统级file-max与进程级ulimit:查限制用cat /proc/sys/fs/{file-max,file-nr}、lsof -p、ulimit;改系统限用sysctl,改进程限需systemd服务配LimitNOFILE或limits.conf;最后用cat /proc/PID/limits和ss -s验证生效。

Linux服务器在高并发场景下,Socket连接数受限于系统级和进程级的文件描述符(file descriptor)限制,而Socket句柄本质上就是文件描述符。要真正提升并发连接能力,需同时调整内核参数与用户进程限制,并确保配置持久化且正确生效。
查看当前Socket句柄使用与限制
快速定位瓶颈是调优前提:
- 查系统级最大文件描述符数:
cat /proc/sys/fs/file-max - 查当前已分配的文件描述符总数:
cat /proc/sys/fs/file-nr(输出三列:已分配、未使用、最大上限) - 查某进程(如nginx或java应用)的打开文件数:
lsof -p <PID> | wc -l或cat /proc/<PID>/limits | grep "Max open files" - 查登录用户的软/硬限制:
ulimit -Sn(软限)、ulimit -Hn(硬限)
修改系统级最大文件描述符数(file-max)
该值控制整个系统可分配的文件描述符总量,应根据内存和业务规模合理设置(一般建议设为总内存KB数的10%左右,或不低于655360):
- 临时生效:
sudo sysctl -w fs.file-max=1048576 - 永久生效:编辑
/etc/sysctl.conf,添加一行fs.file-max = 1048576,然后执行sudo sysctl -p
调整用户及服务进程的打开文件数限制
即使系统上限足够,单个进程仍受用户级 ulimit 限制。关键点在于:systemd服务需通过服务单元文件配置,普通用户需修改 shell 限制:
- 对 systemd 管理的服务(如 nginx、redis):编辑对应 service 文件(如
/etc/systemd/system/nginx.service),在[Service]段添加:LimitNOFILE=1048576
保存后执行sudo systemctl daemon-reload && sudo systemctl restart nginx - 对 root 或特定用户:编辑
/etc/security/limits.conf,添加(注意用户名或通配符):* soft nofile 1048576* hard nofile 1048576
并确认/etc/pam.d/common-session中有session required pam_limits.so - 注意:SSH 新建会话或新登录才读取 limits.conf;已有终端需重新登录,或手动执行
ulimit -n 1048576(仅当前会话有效)
验证配置是否真正生效
重启服务后必须验证,避免“改了但没完全生效”:
- 检查服务进程的 limits:
cat /proc/$(pgrep nginx)/limits | grep "Max open files",确认 soft/hard 均为预期值 - 观察实际连接数增长:用
ss -s查看 socket 统计(如total: 89120 (kernel 92135)),对比file-nr中第二列(已分配未使用)是否充足 - 压测验证:使用 wrk 或 ab 发起万级并发连接,确认无
Too many open files错误且连接稳定建立










