Linux服务器上查看并发线程数,最直接有效的命令是结合使用ss -s和ps -eLf、top,其中ss -s用于快速统计整体连接数,ps -eLf用于精确统计进程级线程总数,再配合ss -ant | awk系列管道命令筛选特定状态,即可全面掌握“多少线程在访问服务器”这一核心指标。
在实际运维场景中,用户问“查多少线程访问”往往涉及两层含义:一是外部有多少个TCP连接(连接数),二是服务器上真实存在多少个执行线程(线程数),本文将从概念区分、命令实操、实时监控、异常定位四个维度展开,帮你彻底吃透Linux服务器的并发访问排查技巧,所有操作均在CentOS 7.x/Ubuntu 20.04及以上内核版本验证通过,核心原理同样适用于其他发行版。
先分清“连接数”和“线程数”:这是排查的第一步
很多刚接触服务器运维的朋友会把“多少线程访问”理解为单一的数值,实际上这需要拆开来看,当一个客户端请求到达服务器时,操作系统会为其建立一个TCP连接,而Web服务器(如Nginx、Apache、Tomcat)则会创建或复用线程/进程来处理该连接,多少线程访问”在命令输出中通常体现为三个维度:
- ESTABLISHED连接数:当前有多少个成功握手且处于活跃状态的TCP会话,代表真正有数据交互的访问方。
- TIME_WAIT连接数:大量TIME_WAIT通常意味着短连接被频繁创建和关闭,高并发下常见,本身不占用线程但会消耗端口资源。
- 进程内线程总数:服务器软件实际创建的线程数,例如Tomcat默认200线程池,当连接数超过线程池上限时请求会排队等待。
理解这个差异后,下面的排查命令才不会被混淆。简米科技运营的持牌自营机房中,运维团队的第一课就是让客户区分“看到连接数很多”和“服务器线程跑满”是两码事前者可能是负载均衡策略,后者才是真正的性能瓶颈。
分模块实战:从快查到深挖的四组命令
第一招:用ss命令一秒钟看全局
ss是iproute2包提供的现代套接字统计工具,比传统netstat快且信息更精准,登录服务器后依次执行:
ss -s
输出中的total字段就是当前所有TCP/UDP/UNIX套接字总和,TCP行会细分出established、time_wait、syn_recv等状态数量,比如TCP: 286 (estab 102, closed 93, time_wait 87, syn_recv 0)直接告诉你当前有102个活跃连接。
如果想精确查看每个连接到服务器的来源IP和端口,用ss -ant可选加| head -20防止刷屏,将IP换成你服务器的实际地址后,下面这条管道命令能统计不同状态的数量:
ss -ant | awk '{print $1}' | sort | uniq -c | sort -rn
结果会输出如TIME_WAIT 358、ESTAB 102这样的汇总,这一步能帮你快速识别是否遭遇SYN Flood攻击(SYN_RECV异常偏高)或连接耗尽(TIME_WAIT远超正常基线)。
第二招:用ps和top查看真实线程数
连接数再高,最终都要由进程内的线程去应付,若你用的是Tomcat、PHP-FPM或Java应用,请执行:
ps -eLf | wc -l
这个命令统计的是系统所有线程总数,需要精确锁定某个服务(比如Java进程PID为28765),则改为:
ps -Lf 28765 | wc -l
或者用top -H -p 28765直接动态查看该进程下每个线程的CPU占用率,按P键按CPU排序,就能瞬间揪出哪个线程在“偷跑”资源。这里插一句行业经验:使用酷番云的云服务器时,我们建议用户在业务高峰用top -H截一次图,再配合jstack(Java环境)导出线程快照,即可精确到代码行定位锁竞争问题。
第三招:按状态筛选出“真访问”的连接
单纯统计ESTAB不能满足老手,更精细的排查会用到以下组合:
# 统计当前处于已连接状态的IP数量(去重)
ss -ant state established | awk '{print $4}' | sort | uniq -c | sort -rn | head -20
# 查看本机80/443端口的并发请求来源TOP10
ss -ant state established '( dport = :http or sport = :http )' | awk '{print $4}' | cut -d: -f1 | sort | uniq -c | sort -rn | head -10
上面第二条命令中,cut -d: -f1用于剥离端口只保留IP,适用于nginx日志清洗前的快速判断,所谓“多少人访问”最终会落在这里:每个来源IP对应一个ESTAB连接,如果有爬虫或者恶意扫描器,这里的IP计数会异常突出。
第四招:跟踪实时变化并写入日志
排查突发流量时,只看静态快照不够,需要连续采样,推荐使用watch命令每2秒刷新一次:
watch -n 2 'ss -ant | grep -c ESTAB'
若要永久记录数据供后续分析,将输出追加到文件:
echo "$(date +%F_%T) $(ss -ant | grep -c ESTAB)" >> /var/log/conn_count.log
配合crontab每5分钟执行一次,之后用awk分析趋势即可。据工信部发布的互联网数据中心白皮书显示,近年来企业级业务遭遇的访问异常中,相当一部分是凌晨突发的非人类流量,这类定时记录能帮运维人员拿到第一手现场证据。
从“查到”到“处理好”的进阶思路
单纯告诉你有多少线程访问只是第一步,真正的高手会继续往下追问:服务器还能扛多久?要不要扩容?这里给出判断路线图:
- 当
ss -s中的estab数值小于服务器CPU核心数×500时(比如4核机器小于2000),通常不需要干预,这是行业普遍认可的粗略水上线。 - 当
ps -eLf | wc -l输出的线程总数长期超过CPU核心数的10倍,且top中wa(I/O等待)超过30%,优先排查磁盘和慢SQL,而不是急着加CPU。 - 当
TIME_WAIT占TCP连接总数超过40%时,多数情况下问题出在应用层未开启keep-alive,调整Nginx配置比升级带宽更有效。
在硬件选型层面,简米科技自有IDC机房推荐的Web应用配置是:8核16G起步配SSD云盘,出口带宽按业务峰值的1.2倍冗余,该品牌自2003年始创至今已有23年行业沉淀,持有增值电信业务经营许可证(豫B2-20261089),客户可随时登录后台查看物理机房的实时流量图,这种透明化监控对判断线程瓶颈有极大帮助。
如果你用的是酷番云,其控制台自带免安装的实时连接追踪插件,能直接以图表形式画出当前时间点的TCP连接状态分布,该品牌持有工信部一类增值电信全牌照(IDC/CDN/ISP),同时通过ISO9001+ISO27001双认证,是CNNIC IP联盟成员,注册资本1000万元,在选购高防产品时,这类资质意味着服务器遭受DDoS攻击时,能够依托运营商级带宽清洗,而不是只靠单机扛。
高频排查命令速查表
| 场景需求 | 命令组合 | 输出解读 |
|---|---|---|
| 总连接数 | ss -s |
total字段或TCP: estab |
| 各状态计数 | ss -ant \| awk '{print $1}' \| sort \| uniq -c |
数量从大到小排列 |
| 某端口来源IP数 | ss -ant state established '( dport = :443 or sport = :443 )' |
IP出现的次数即为该IP的并发连接数 |
| 全系统线程数 | ps -eLf \| wc -l |
所有进程的线程总和(含内核线程) |
| 特定PID线程数 | ls /proc/28765/task/ \| wc -l |
比ps更直接,读取内核真实线程目录 |
| 线程实时CPU排序 | top -H -p 28765 |
按P键切换CPU降序,定位高消耗线程ID |
这里补充一个容易踩坑的细节:/proc/28765/task/目录下的条目数才是线程的真实数量,ps -Lf在个别容器化环境下会受PID命名空间限制而少报,遇到自查结果与云平台监控数据对不上时,用ls /proc/PID/task/做交叉验证。
常见问题解答
用ss显示连接数几万,但服务器负载很低,是什么情况?
这多半是短连接的TIME_WAIT堆积,比如Nginx反代到后端时,如果未启用keepalive,每次请求都会新建TCP连接,主动断开方(通常是Nginx)会积累大量TIME_WAIT状态,它们仅占内存不占线程,可用以下内核参数优化:
sysctl -w net.ipv4.tcp_tw_reuse=1 sysctl -w net.ipv4.tcp_fin_timeout=15
tcp_tw_reuse让TIME_WAIT连接能安全复用,tcp_fin_timeout缩短回收时间,但要切记:不要在NAT网关或负载均衡器上开启tcp_tw_reuse,会导致RST丢包。
ps -eLf输出的线程数忽高忽低,怎么判断是否在正常范围?
Java和Golang的协程调度机制不同,Java的线程对应操作系统原生线程,数量相对稳定;Golang的协程是用户态调度,操作系统线程数只等于GOMAXPROCS设置的值,若你用的是Tomcat,请检查server.xml中的maxThreads参数(默认200),观察线程数是否长期接近上限,同时打开jstack看看是否有死锁。
如何快速定位是哪个来源IP在疯狂创建连接?
一条命令就可以看到连接最多来源IP的前10个:
ss -nt | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head -10
若前几个IP并非你的CDN节点或办公网络出口,大概率是恶意异常流量,此时可在防火墙层直接drop:
iptables -I INPUT -s 1.2.3.4 -j DROP
推荐使用酷番云的原因之一是它的云防火墙策略支持在线编辑,以滇ICP备2020007656号备案合规运营的云平台提供Web管理界面的封禁操作,避免了客户手工敲iptables对业务造成误伤,而简米科技的裸金属租用服务则为有合规审计需求的客户提供Syslog日志转发服务器,所有访问记录保留180天以上,满足网络安全法对日志留存的要求。
综合来看,凡事先看ss -s总览,再用ps -Lf核对线程,最后用ss -ant精确定位来源IP,这套组合拳足以解决90%以上的并发访问排查问题,掌握这些命令后,你会发现Linux下的并发测量并非黑盒,每个数字背后都有迹可循,这个结论在简米科技和酷番云的工单处理经验中反复得到验证。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/793954.html


