Linux网络连接数达上限本质是连接未释放、端口不足或资源卡层,需三步排查:先用ss -s等确认是否真满;再查端口范围、文件描述符及TIME_WAIT/CLOSE_WAIT分布;最后用ss -tunlp和lsof定位高连接进程与异常客户端,并调优tcp_tw_reuse、somaxconn等内核参数。

Linux 中网络连接数达到上限,通常不是“连得太多”,而是连接没释放、端口不够用或系统资源卡在某一层。排查要分三步走:先确认是不是真满了,再看满在哪一层(端口?文件描述符?TIME_WAIT?),最后定位到具体进程或配置。
确认当前连接总数和状态分布
别用 netstat,直接运行:
- ss -s:快速查看全系统连接统计,包括 ESTABLISHED、TIME_WAIT、CLOSE_WAIT 等各状态数量
- ss -tn state established | wc -l:获取真实活跃连接数,这是最贴近业务压力的指标
- ss -tan | awk 'NR>1 {print $1}' | sort | uniq -c | sort -nr:按连接状态排序计数,重点盯 CLOSE_WAIT 和 TIME_WAIT
CLOSE_WAIT 多说明应用没调 close();TIME_WAIT 多通常是短连接太频繁;ESTABLISHED 持续高位且增长快,需进一步查来源。
检查端口与文件描述符是否真的耗尽
连接依赖两个关键资源:本地可用端口 + 每个连接占用的一个文件描述符。
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
- 端口范围:运行 cat /proc/sys/net/ipv4/ip_local_port_range,默认常为 32768 60999(仅约 28K 可用)。若活跃连接接近该范围上限,可临时扩为 echo "1024 65535" > /proc/sys/net/ipv4/ip_local_port_range
- 文件描述符:运行 ulimit -n 查当前会话限制;cat /proc/sys/fs/file-max 查系统级上限;再用 lsof -i | wc -l 或 lsof -p $(pgrep your_app) | wc -l 看具体进程用了多少
如果某个服务进程的 open files 接近 ulimit 值,就要调高它的 LimitNOFILE(systemd 服务)或 limits.conf(用户级)。
定位高连接数的进程和客户端来源
光知道总数没用,得知道谁在连、怎么连、连了多久。
- 查哪个进程占连接最多:运行 ss -tunlp | grep :端口号(如 :3306),输出含 PID 和程序名,比如 24567/java
- 查该进程打开的 socket 数量:运行 ls -l /proc/24567/fd/ | grep socket | wc -l,若远超其连接池配置(如 HikariCP maxPoolSize=20 却有 300+ socket),基本就是连接泄漏
- 查来源 IP 分布:运行 ss -tn state established | grep :端口号 | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr | head -10,识别异常高频访问的客户端
分析内核参数与连接回收效率
有些“满”其实是内核回收慢造成的假性拥塞。
- TIME_WAIT 回收:确认 net.ipv4.tcp_tw_reuse = 1(客户端可用),禁用已废弃的 tcp_tw_recycle
- 连接队列容量:增大 net.core.somaxconn(监听队列)和 net.core.netdev_max_backlog(网卡软中断队列)
- FIN 超时时间:适当缩短 net.ipv4.tcp_fin_timeout(默认 60 秒),加快 FIN_WAIT_2 状态释放
所有修改用 sysctl -w 参数=值 临时生效,写入 /etc/sysctl.conf 并 sysctl -p 永久保存。

















