查看Linux服务器网络连接数,最简洁的做法是执行ss -s查看整体统计,或者用ss -tan配合文本处理命令统计各类状态的数量。 这篇文章从具体命令讲起,覆盖实时监控和异常排查,帮你快速掌握连接数分析的方法。
Linux服务器怎么看网络连接数:核心命令
Linux里查看网络连接数,常用工具是ss和netstat,两者输出类似,但ss的性能更好,尤其在连接数比较多的时候,所以我建议优先熟悉ss,即使不装额外软件,系统自带的ss已经足够撑起日常排查。
直接统计当前连接总数
一条命令看全局:
ss -s
这会输出TCP、UDP、RAW等协议的汇总信息,TCP连接数”一栏会按established、time_wait等状态拆分,适合快速判断系统当前负载。ss -s给的是一个总量概览,不会展示具体连接条目。
如果想看更详细的每一条连接,用:
ss -tan
-t表示TCP,-a表示所有状态,-n表示用数字显示IP和端口,要数出连接总数,可以管道给wc -l:
ss -tan | wc -l
注意这个数字包含表头一行,想更精确,可以这样:
ss -tan | tail -n +2 | wc -l
tail -n +2跳过第一行表头,这个命令得到的数值,就是当前TCP连接的实际条数。
按状态分类统计连接数
连接数不是只有一个总数,按状态拆开看才有意义,常见的TCP状态包括ESTABLISHED、TIME_WAIT、CLOSE_WAIT、SYN_SENT等,执行:
ss -tan | tail -n +2 | awk '{print $1}' | sort | uniq -c
输出会像这样:
5 CLOSE_WAIT 120 ESTABLISHED 38 TIME_WAIT
awk '{print $1}'取第一列,也就是状态名称,然后sort | uniq -c完成计数,这个方法适合快速定位状态异常的连接,比如ESTABLISHED数量远低于SYN_RECV,说明可能有半连接攻击。
如果只需要某个状态的数量,比如ESTABLISHED:
ss -tan | grep ESTABLISHED | wc -l
TIME_WAIT同理:
ss -tan | grep TIME_WAIT | wc -l
netstat的写法也类似:
netstat -ant | tail -n +2 | awk '{print $1}' | sort | uniq -c
查看进程对应的连接数
连接数异常时,需要知道是哪个进程在占用连接,加上-p参数可以显示进程信息:
ss -tanp | grep CLOSE_WAIT | head -10
输出末尾会带users:(("nginx",pid=1234,fd=35)),拿着PID就能对齐日志,如果想统计每个进程的连接数,用下面的命令逐步处理:
ss -tanp | awk '{print $6}' | grep 'pid=' | sort | uniq -c | sort -nr
这条命令会列出占连接数最多的几个PID,不过不同系统上字段位置略有差异,建议先看原始输出再调整参数。
Linux服务器查看网络连接数用什么命令最合适
这个问题没有标准答案,要根据场景选,老系统可能没有ss,这时候只能退回netstat,再就是有些同学习惯从/proc/net/tcp读取,然后自己写脚本,下面先对比一下两种主流命令。
ss与netstat命令对比
| 对比项 | ss | netstat |
|---|---|---|
| 所属工具包 | iproute2 | net-tools |
| 性能 | 快,连接数大时优势明显 | 慢,连接数多时可能有延迟 |
| 输出格式 | 字段紧凑,适合脚本处理 | 传统格式,容易阅读 |
| 查看进程 | 需要-p参数 |
也是-p参数 |
| 兼容性 | 现代Linux默认自带 | 部分精简系统需要额外安装 |
按场景选择连接数监控工具
- 快速查看整体连接数量级,用
ss -s。 - 需要逐条检查远端IP和端口,用
ss -tan配合awk过滤。 - 服务器环境较老,或者你习惯使用
netstat,影响不大,结果一样可信。 - 需要监控某个进程的连接数,比如Nginx或Java进程,用
ss -tanp加grep定位PID。 - 写脚本采集数据,建议用
ss,因为输出稳定,执行速度更快。
怎么确认命令是否可用
直接在终端输入ss或netstat,如果提示“command not found”,再用包管理器安装。ss属于iproute2,一般系统自带;netstat属于net-tools,有些环境需要额外安装才提供,你可以在部署监控脚本之前先跑一下command -v ss确认路径。
实时监控Linux服务器网络连接数变化
单次查看只是静态快照,定位问题往往需要观察变化趋势,一个简单办法是用watch命令定期刷新。
watch -n 2 'ss -s'
每2秒刷新一次连接数统计,这个命令能直观看到established和time_wait的波动。
如果想紧盯某个状态值,可以这样:
watch -n 2 "ss -tan | grep TIME_WAIT | wc -l"
注意外层用双引号,保证管道在watch里正常执行。
用sar查看历史连接数
系统装了sysstat的话,可以用sar回看历史网络统计:
sar -n TCP,ETCP 1 3
这个命令每秒取样一次,共取3次,输出TCP连接、主动连接、被动连接等数据。sar的好处是能看到一段时间内的变化,配合watch实时查看,排查思路更完整。
监控连接数使用的脚本思路
实际环境里,单靠肉眼看命令输出不够,可以写一个简单脚本,每5秒记录一次ESTABLISHED数量和当前时间,输出到文件,脚本核心逻辑就是:
while true; do echo "$(date +%H:%M:%S) $(ss -tan | grep ESTABLISHED | wc -l)" sleep 5 done
这个脚本跑几分钟后,通过sort或绘图工具就能看出连接数爬升的曲线,你需要判断的是连接数是线性上涨还是到达峰值后回落,这对应完全不同的故障类型。
Linux服务器查看网络连接数超时怎么办
当TIME_WAIT或SYN_RECV连接堆到很多时,会带来端口占用、响应变慢的问题,排查思路需要从状态本身出发。
TIME_WAIT连接过多排查
TIME_WAIT是主动关闭连接的一方处理完数据后等待的状态,在短连接高并发场景下,大量TIME_WAIT属于正常现象,业内专家指出,真正需要关心的是TIME_WAIT占用大量本地端口,导致新连接无法建立。
检查方法:
ss -tan state time-wait | wc -l
如果几千个连接都堆积在这一状态,可以临时调整内核参数,比如缩小net.ipv4.tcp_fin_timeout,但不要轻易开启tcp_tw_reuse,因为不同内核版本行为有差异,这个调整需要结合业务类型评估,先确认业务是否大量使用短连接。
CLOSE_WAIT连接过多排查
CLOSE_WAIT意味着服务器被动关闭连接,但应用程序迟迟没有调用close()关闭socket,出现大量CLOSE_WAIT时,更多是应用层代码问题,而不是系统参数问题。
查看进程:
ss -tanp | grep CLOSE_WAIT | head -10
输出中会带PID和进程名,拿着PID去查应用日志,重点看网络请求处理完毕后是否释放连接,行业共识认为,CLOSE_WAIT堆积成百上千,多半是连接池泄漏或超时设置不合理。
SYN_RECV连接过多排查
SYN_RECV状态表示服务器已经收到客户端SYN请求,正在等待三次握手完成,如果这个状态的数量很大,可能是客户端发起连接但迟迟没有响应,也可能是外部访问者在试探端口,观察命令:
ss -tan state syn-recv | wc -l
配合ss -tan | grep SYN_RECV查看被触发连接的源IP,能判断是正常业务短时间集中请求,还是有针对性的扫描,如果来源比较分散,大概率是网络波动;来源集中在少数IP,就需要考虑匹配连接层限制。
端口范围不足的连接数隐患
连接数高本身不是问题,真正受影响的是本地端口耗尽,假设服务器IP是2.3.4,对端是6.7.8,所有TCP连接都会占用本地的临时端口,查看当前可用端口范围:
cat /proc/sys/net/ipv4/ip_local_port_range
默认范围通常是32768 60999,大约2.8万个端口,当连接数接近这个值时,新的连接无法建立,如果业务需要更大的连接规模,可以适当扩大端口范围,比如改为10240 65535,但依然存在上限,此外还需要同步调整文件句柄限制,否则连接数还没到端口上限,进程先报Too many open files。
关于Linux服务器查看网络连接数的常见问题Q&A
为什么用ss查看连接数,结果和netstat对不上?
因为两个命令读取的数据来源稍有不同,ss直接解析内核socket信息,netstat则基于/proc/net/tcp,多数情况下数值基本一致,差异较大时检查是否用了相同参数,比如没有加-n时端口可能解析成服务名,导致行列错位,持久差异等于统计口径不同,建议统一用ss。
连接数统计里包含UDP吗?
只看TCP连接数时,用ss -tan或netstat -ant,其中的-t就限制了TCP,如果只写ss -a或netstat -a,会把UDP、UNIX socket也统计进去,数字会大很多,UDP没有连接状态,只有ESTABLISHED概念,需要单独用ss -uan查看。
怎么看某个IP建立的连接数?
用grep加上IP地址过滤即可,比如查看与0.0.5的所有连接数:
ss -tan | grep 10.0.0.5 | wc -l
想按照对端IP聚合排序,用awk提取远端IP,再统计:
ss -tan | tail -n +2 | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr
输出中第一列是连接数,第二列是远端IP,这个命令能一次看到连接数最多的几个远程地址,方便排查是否存在异常访问。
连接数管理是Linux服务器运维的基础功夫,先把ss -s和按状态统计这两条命令用熟,再进阶到实时监控和参数调优,遇到异常时,先分状态,再找进程,最后调整内核,按这个路数排查就不会乱。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/711078.html





