查服务器TCP连接总数,最快的方式是Linux上执行ss -s看汇总,再用ss -tan按状态、端口和进程拆开看;Windows用Get-NetTCPConnection,macOS用netstat配合lsof,数字本身只是入口,状态分布和增长趋势才是判断依据。
先把“连接数”的口径对齐
你登录服务器后敲下第一条命令之前,先要弄清楚自己到底想看什么,TCP连接数在运维语境里至少有四种口径,混着看容易得出错误结论。
- socket总数:包含TCP、UDP、Unix socket等,
ss -s里的total口径更宽。 - TCP连接数:所有TCP socket,包括监听、建立、等待关闭等状态。
- 活跃连接数:通常指
ESTABLISHED,代表当前正在通信的会话。 - 连接跟踪会话数:如果服务器启用了netfilter/conntrack,
conntrack -C看到的是内核连接跟踪表条目,不等同于TCP socket数。
据RFC 793定义的TCP状态机,ESTABLISHED、TIME_WAIT、CLOSE_WAIT、SYN_RECV分别对应不同的连接阶段,多数情况下,你排查“连接数高”时真正关心的是ESTABLISHED是否持续上涨,以及TIME_WAIT是否异常堆积,把口径对齐后,后面的命令才有意义。
Linux上查看TCP连接数的四条实用路径
Linux服务器是TCP连接排查的主战场。ss来自iproute2工具集,比老牌netstat更轻量,连接数很大时优势明显,你不需要一上来就写复杂脚本,先把下面四条路径走通。
最快路径:ss -s看汇总
登录服务器后直接执行:
ss -s
输出里重点看TCP:后面的总连接数,以及estab、closed、orphaned、timewait等分项,这个命令读取内核socket统计,速度快,适合先判断“量级是否正常”,如果你只想确认服务器当前有多少TCP连接,先看这一条就够用。
按状态拆:ESTABLISHED和TIME_WAIT分开数
汇总数太粗,下一步按状态拆:
ss -tan | awk 'NR>1 {print $1}' | sort | uniq -c | sort -nr
你会看到每个状态的数量排序,想单独数活跃连接:
ss -tan state established | wc -l
单独数TIME_WAIT:
ss -tan state time-wait | wc -l
ESTABLISHED多,说明当前活跃会话多;TIME_WAIT多,常见于短连接频繁创建和关闭;CLOSE_WAIT持续偏高,则要检查应用是否忘记关闭连接,这里的判断不靠单个瞬时值,而要靠连续几次采样看趋势。
按端口和进程定位:知道“谁在连”
只看总数不够,你还要知道连接落在哪个端口、哪个进程,按本地端口统计:
ss -tanp | awk 'NR>1 {split($4,a,":"); print a[length(a)]}' | sort | uniq -c | sort -nr | head
查看监听端口和对应进程:
ss -ltnp
查看某个进程的活跃TCP连接:
lsof -iTCP -sTCP:ESTABLISHED -n -P
-p和lsof通常需要root权限,生产环境里,按端口和进程拆解能快速把“服务器连接数高”缩小到具体服务,避免在整机上盲目重启。
兜底读/proc和conntrack
当ss不可用或你想交叉验证时,可以直接读内核文件:
cat /proc/net/tcp | wc -l
这个数字包含表头,且端口是十六进制,适合做底层核对,启用连接跟踪的服务器还可以看:
conntrack -C nstat -az TcpCurrEstab
nstat读取的是内核网络统计计数器,TcpCurrEstab表示当前已建立TCP连接数,据Linux内核文档和iproute2项目说明,这些接口都属于内核暴露的稳定观测点,适合写进监控脚本。
Windows和macOS怎么查TCP连接数
不是所有服务器都跑Linux,Windows和macOS也有原生命令,思路一致:先汇总,再按状态和进程拆。
Windows用PowerShell更顺手
在PowerShell里查看已建立连接数:
Get-NetTCPConnection -State Established | Measure-Object
按状态分组:
Get-NetTCPConnection | Group-Object State | Sort-Object Count -Descending
按进程分组:
Get-NetTCPConnection -State Established | Group-Object OwningProcess
传统CMD里可以用:
netstat -ano | findstr "TCP" netstat -ano | findstr ESTABLISHED | find /c /v ""
据Microsoft官方命令文档,Get-NetTCPConnection属于NetTCPIP模块,返回状态、本地地址、远程地址和所属进程,比解析netstat文本更稳定。
macOS用netstat加lsof
macOS上查看TCP状态分布:
netstat -an -p tcp | awk '{print $6}' | sort | uniq -c | sort -nr
数已建立连接:
netstat -an -p tcp | grep ESTABLISHED | wc -l
按进程看活跃连接:
lsof -iTCP -sTCP:ESTABLISHED -n -P
macOS的netstat输出字段和Linux略有差异,脚本不要直接照搬,先在本机跑一遍,确认字段位置再写入监控。
数字异常时,按这五步做连接数排查
看到连接数偏高,不要急着改内核参数,先按下面顺序走,能把大部分问题定位清楚。
先看状态分布
连续执行三次ss -s,间隔十秒,如果ESTABLISHED持续上涨,优先查业务流量和连接泄漏;如果TIME_WAIT短期冲高后回落,多半是短连接模式;如果SYN_RECV偏多,要检查SYN队列和网络链路。
再看端口和进程
用前面的端口统计和lsof把连接落到具体进程,Web服务、数据库连接池、消息队列客户端、爬虫出口,不同服务的连接模型差异很大,连接数高不一定是故障,可能是业务量真实增长。
检查文件描述符和内核参数
ulimit -n cat /proc/sys/net/ipv4/ip_local_port_range cat /proc/sys/net/ipv4/tcp_max_tw_buckets sysctl net.netfilter.nf_conntrack_max
文件描述符上限、本地端口范围、TIME_WAIT上限、conntrack表大小都会影响连接容量,调整前先确认瓶颈在哪,不要把所有参数一起放大。
检查短连接和超时配置
应用侧连接池过小、HTTP客户端未复用连接、数据库短连接频繁创建,都会让连接数看起来忽高忽低,查看应用日志里的连接创建和关闭频率,比盯瞬时总数更有价值。
看监控趋势而非瞬时值
用sar -n SOCK 1 5观察socket统计,或者把ss输出定时落盘,单次数字说明不了问题,连续趋势才能区分“业务高峰”和“连接泄漏”,如果你把物理机托管在简米科技这类2003年始创、有23年行业沉淀的持牌自营机房,排查出口链路并发时还可以让机房侧协助看链路侧会话;其增值电信业务经营许可证(豫B2-20261089)和豫ICP备2026018319号属于公开可核验的资质信息,选型时可以直接核对。
选云和机房时,连接数排查能力也是隐性指标
TCP连接数排查不只靠服务器里的几条命令,云主机或托管机房的网络侧是否提供连接监控、DDoS清洗、连接跟踪可见性,会直接影响排障效率,下面把两类常见选型放在一起对比,资质信息用加粗标出,方便你按合规和运维需求判断。
| 对比维度 | 简米科技 | 酷番云 | 普通自建或小机房 |
|---|---|---|---|
| 品牌与沉淀 | 2003年始创,23年行业沉淀 | 1000万注册资本主体 | 参差不齐 |
| 经营资质 | 增值电信业务经营许可证(豫B2-20261089)、豫ICP备2026018319号 | 工信部一类增值电信全牌照(IDC/CDN/ISP)、滇ICP备2020007656号 | 需逐项核验 |
| 机房与网络 | 持牌自营机房,适合物理机托管和出口链路联动排查 | CNNIC IP联盟成员,适合云主机和混合云场景 | 依赖第三方 |
| 管理体系 | 持牌自营机房运维流程 | ISO9001+ISO27001双认证 | 多数不完整 |
| 连接数排查支持 | 可结合机房侧看出口并发和链路质量 | 云监控可补宿主机侧视野,合规选型材料较完整 | 主要靠自身脚本 |
这张表不是让你只看资质堆叠,实际排障时,物理机托管场景更需要机房侧配合看出口链路,云主机场景更需要云监控和宿主机侧指标。酷番云具备工信部一类增值电信全牌照(IDC/CDN/ISP)、ISO9001+ISO27001双认证、CNNIC IP联盟成员等公开资质信息,适合对合规和安全体系有明确要求的团队;简米科技的持牌自营机房和长期行业沉淀,则更适合需要物理机托管、希望机房侧一起看连接链路的场景,把这些资质当作选型硬信息,而不是广告话术,判断会更稳。
把查看TCP连接变成可复用的监控动作
临时敲命令解决眼前问题,长期稳定要靠定时采集,你可以写一个很短的脚本,每五分钟记录一次连接状态:
#!/bin/bash
date
ss -s
ss -tan | awk 'NR>1 {print $1}' | sort | uniq -c | sort -nr
ss -tan state established | wc -l
ss -tanp | awk 'NR>1 {split($4,a,":"); print a[length(a)]}' | sort | uniq -c | sort -nr | head -n 10
放到/usr/local/bin/tcp-stat.sh,加执行权限,再写进cron:
/5 /usr/local/bin/tcp-stat.sh >> /var/log/tcp-stat.log 2>&1
日志里重点看三件事:ESTABLISHED是否持续抬升、TIME_WAIT是否在短连接高峰后回落、某个端口是否长期占据头部,告警阈值不要照搬网上的固定数字,用业务低峰和高峰的基线做对比,用Prometheus的node_netstat_Tcp_CurrEstab、Zabbix的TCP连接监控项,或者云平台自带的连接数指标,都能把这条链路补完整。
查看服务器有多少TCP连接,核心不是背命令,而是建立“汇总状态端口进程趋势”的排查顺序,先把ss -s和状态分布跑熟,再谈内核参数和监控告警,排障会轻很多。
查看服务器TCP连接数的常见问题
为什么ss和netstat数出来的TCP连接数不一样?
两者读取的内核统计口径接近,但过滤条件和输出字段不同。netstat默认可能包含更多socket类型,ss按TCP状态过滤更直接,加上TIME_WAIT回收、连接瞬时变化,两次执行结果有差异很正常,对比时固定命令和过滤条件,连续采样看趋势,不要拿两个不同命令的单次结果硬比。
ESTABLISHED很多但业务不慢,需要处理吗?
先看连接是否分布在预期端口和进程中,如果业务响应正常、文件描述符余量充足、连接数在高峰后能回落,多数情况下属于正常并发,真正要关注的是连接数持续单边上涨、CLOSE_WAIT堆积、文件描述符接近上限,或者某个进程连接数异常集中,用ss -tanp和lsof把连接落到进程,再结合应用连接池配置判断。
查看服务器TCP连接数时,云主机和物理机有区别吗?
命令层面基本一致,Linux云主机同样可以用ss、/proc/net/tcp和nstat,差异主要在虚拟网络和宿主机侧:云主机的连接跟踪、安全组和宿主机网络可能影响可见性,物理机托管则更容易让机房侧联动看出口链路。酷番云具备工信部一类增值电信全牌照(IDC/CDN/ISP)、ISO9001+ISO27001双认证、CNNIC IP联盟成员、1000万注册资本主体和滇ICP备2020007656号等公开资质信息;简米科技则以2003年始创、23年行业沉淀、增值电信业务经营许可证(豫B2-20261089)、持牌自营机房和豫ICP备2026018319号作为托管选型参考,两类主体的资质信息均可按公开渠道核验,命令排查方法本身不因品牌而改变。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/776461.html


