Linux 怎么查看网络连接数?
答案:总量与状态用 ss -s 和 ss -ant | awk 分组统计;按端口/来源 IP 用 ss 过滤后 cut/sort/uniq -c。要分清三个不同上限:TCP 连接数、本地端口范围、文件描述符 ulimit,别把 TIME_WAIT 当成连接爆掉。
一、整体与分状态统计
ss -s # 汇总:estab/closed/orphaned/time-wait 等
ss -ant | awk 'NR>1{c[$1]++} END{for(s in c)print c[s],s}' | sort -rn
# 只数已建立
ss -ant state established | wc -l
ss -ant state time-wait | wc -l # TIME_WAIT 数量
ss -s最快拿到全局(TCP: ... (estab N, closed M, orphaned ...))。注意ss -ant里 TIME-WAIT 显示为TIME-WAIT,awk 分组时按这个字符串。老系统可用netstat -ant。
二、按端口、按来源 IP
ss -ant '( sport = :443 )' | wc -l # 本机 443 上的全部连接
ss -nt state established '( sport = :443 )' \
| awk 'NR>1{split($5,a,":");print a[1]}' \
| sort | uniq -c | sort -rn | head # 各客户端 IP 的连接数
ss -nt state established '( dport = :5432 )' | wc -l # 作为客户端连某 DB服务端看
sport(本地监听端口),本机作为客户端连外部看dport。某个 IP 连接数异常高,可能是单客户端打满、NAT 出口集中,或需要在应用层限流。
三、三个别混淆的瓶颈
| 瓶颈 | 现象 | 查看 | 调整 |
|---|---|---|---|
| 文件描述符 | accept: too many open files | ulimit -n、/proc/PID/limits | ulimit -n/systemd LimitNOFILE |
| 本地临时端口 | 作为客户端 Cannot assign requested address | ip_local_port_range | 扩范围、tcp_tw_reuse |
| conntrack 表 | nf_conntrack: table full 丢包 | nf_conntrack_count/max | 调 max、减少跟踪 |
1. 文件描述符(最常见的"连接数上不去")
ulimit -n # 当前 shell 上限(常默认 1024)
cat /proc/$(pidof nginx)/limits | grep "open files"
ls /proc/$(pidof nginx)/fd | wc -l # 进程当前用了多少 fd
# systemd 服务持久化:LimitNOFILE=65535每条 ESTABLISHED 连接占一个 fd,1024 对高并发服务远远不够。注意 systemd 服务不受
/etc/security/limits.conf控制,要用 unit 的LimitNOFILE=,这是常见踩坑。
2. 本地端口范围(作为客户端连别人)
cat /proc/sys/net/ipv4/ip_local_port_range # 默认可用临时端口段
ss -ant state time-wait | wc -l # 短连接下 TIME_WAIT 占着四元组
# 高并发出站可调:
# net.ipv4.ip_local_port_range = 1024 65535
# net.ipv4.tcp_tw_reuse = 13. conntrack 连接跟踪
cat /proc/sys/net/netfilter/nf_conntrack_count
cat /proc/sys/net/netfilter/nf_conntrack_max
dmesg | grep 'nf_conntrack: table full'四、TIME_WAIT 怎么看
- TIME_WAIT 是主动关闭方在四次挥手后保留约 60s(2MSL)的正常状态,用来收延迟报文、保证最后的 ACK 可重传。
- 它不占 fd、不是 ESTABLISHED 并发,高并发短连接服务器上成千上万很常见,不必清理也杀不掉。
- 真正受影响的是出站四元组/临时端口与 conntrack 表,按需用
tw_reuse、扩端口范围、调 conntrack,而不是想办法"删 TIME_WAIT"。原理见 TIME_WAIT 详解,连接内核参数见内核网络调优。
FAQ
Q: 怎么数 TCP 连接数? A: ss -s 看汇总,ss -ant state established | wc -l 数已建立,awk 分组看各状态。
Q: 按端口/IP 统计? A: ss -nt '( sport = :443 )',对端 IP 取第五列 cut 后 sort|uniq -c|sort -rn。
Q: TIME_WAIT 很多要紧吗? A: 短连接下正常,不占 fd/监听;只在出站端口或 conntrack 受限时调 tw_reuse/范围。
Q: too many open files? A: fd 到 ulimit -n 上限,看 /proc/PID/limits;systemd 服务用 LimitNOFILE,不是 limits.conf。
Q: conntrack 满? A: 看 nf_conntrack_count/max 与 dmesg,调大 max 或减少不必要的连接跟踪。
一句话总结:连接总量用 ss -s、分状态用 ss -ant+awk、按端口/IP 用 ss 过滤加 uniq -c;分清 fd 上限(ulimit -n/LimitNOFILE)、本地临时端口范围、conntrack 三个瓶颈;TIME_WAIT 是正常回收态不占并发,别误当连接爆掉。