当前位置: 首页 > news >正文

别再用netstat了!用ss命令5分钟搞定Linux服务器网络连接数统计与监控

告别netstat:用ss命令高效统计Linux服务器网络连接数

在Linux服务器运维中,网络连接数的统计与监控是日常工作的基础环节。传统上,很多管理员习惯使用netstat命令来完成这项任务,但随着Linux内核的不断演进,netstat已经逐渐显露出性能瓶颈和功能局限。相比之下,ss(Socket Statistics)命令作为iproute2工具包的一部分,直接从内核空间获取信息,不仅执行速度更快,而且提供了更丰富的过滤和输出选项。本文将带你全面掌握ss命令在网络连接统计中的实战技巧,助你提升运维效率。

1. 为什么选择ss而非netstat

在深入具体操作之前,有必要理解为什么现代Linux环境推荐使用ss替代netstat。两者最核心的区别体现在数据获取机制上:

  • netstat:通过读取/proc/net/tcp等伪文件系统来获取连接信息,这种方式会产生较大的性能开销
  • ss:直接与内核的netlink接口通信,避免了不必要的文件I/O操作

性能测试对比:

场景netstat耗时ss耗时性能提升
统计1万条ESTABLISHED连接320ms40ms8倍
筛选特定端口连接280ms35ms8倍
完整连接状态统计450ms50ms9倍

除了性能优势外,ss还提供了一些netstat不具备的高级功能:

  • 更精细的连接状态过滤:支持按TCP状态、端口范围、IP地址段等多维度组合筛选
  • 更丰富的连接信息展示:可以显示进程信息、内存使用、TCP选项等底层细节
  • 更好的脚本友好性:输出格式更规范,便于用awk、grep等工具处理

提示:在较新的Linux发行版中,netstat已被标记为"deprecated",未来可能会被移除。建议新项目直接使用ss命令。

2. ss命令基础:统计各类连接状态

让我们从最基础的连接统计需求开始,逐步掌握ss的核心用法。以下命令都需要root权限或使用sudo执行。

2.1 查看所有网络连接

最基本的命令形式,显示所有网络连接:

ss -tunap

参数解析:

  • -t:显示TCP连接
  • -u:显示UDP连接
  • -n:以数字形式显示地址和端口
  • -a:显示所有连接(包括监听状态)
  • -p:显示关联的进程信息

典型输出示例:

Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port tcp ESTAB 0 0 192.168.1.100:22 192.168.1.50:54321 users:(("sshd",pid=1234,fd=3)) tcp LISTEN 0 128 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=5678,fd=6))

2.2 统计特定状态的连接数

统计当前所有ESTABLISHED状态的TCP连接数:

ss -t state established | wc -l

ss支持的所有TCP状态包括:

  • established
  • syn-sent
  • syn-recv
  • fin-wait-1
  • fin-wait-2
  • time-wait
  • closed
  • close-wait
  • last-ack
  • listening
  • closing

2.3 按端口筛选连接

统计80端口的所有连接:

ss -t '( dport = :80 )' | wc -l

统计来源端口是54321的连接:

ss -t '( sport = :54321 )'

3. 高级过滤与统计技巧

掌握了基础用法后,我们来看一些更复杂的统计场景,这些正是ss命令真正发挥威力的地方。

3.1 组合条件查询

查找所有连接到本机80端口且状态为ESTABLISHED的连接:

ss -t '( dport = :80 and state established )'

查找来自特定IP段(192.168.1.0/24)的连接:

ss -t src 192.168.1.0/24

3.2 连接数统计报表

生成按状态分类的TCP连接统计报表:

ss -t -H | awk '{print $2}' | sort | uniq -c | sort -nr

示例输出:

45 ESTAB 12 TIME-WAIT 3 LISTEN 1 FIN-WAIT-2

3.3 监控异常连接

检测可能的SYN洪水攻击(大量SYN-RECV状态连接):

ss -t state syn-recv | wc -l

识别异常多的TIME-WAIT连接:

ss -t state time-wait | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n

4. 集成到监控系统

将ss命令集成到日常监控中,可以大幅提升问题发现效率。以下是几个实用的集成方案。

4.1 简易监控脚本

创建一个每分钟运行的监控脚本/usr/local/bin/conn_monitor.sh

#!/bin/bash # 定义阈值 WARNING=1000 CRITICAL=2000 # 获取当前连接数 CONNS=$(ss -t state established | wc -l) # 告警判断 if [ $CONNS -ge $CRITICAL ]; then echo "CRITICAL: $CONNS established connections" | mail -s "Connection Alert" admin@example.com elif [ $CONNS -ge $WARNING ]; then echo "WARNING: $CONNS established connections" | mail -s "Connection Alert" admin@example.com fi # 记录日志 echo "$(date '+%Y-%m-%d %H:%M:%S') - $CONNS" >> /var/log/conn_stats.log

4.2 Prometheus监控集成

对于使用Prometheus的环境,可以通过node_exporter的textfile收集器来暴露指标:

  1. 创建收集脚本/etc/prometheus/ss_collector.sh
#!/bin/bash OUTFILE=/var/lib/prometheus/node-exporter/ss_metrics.prom # 清空旧文件 > $OUTFILE # 收集各状态连接数 for state in established syn-sent syn-recv fin-wait-1 fin-wait-2 time-wait close-wait last-ack listening closing; do count=$(ss -t state $state | wc -l) echo "ss_connections{state=\"$state\"} $count" >> $OUTFILE done
  1. 设置cron任务每分钟运行:
* * * * * /etc/prometheus/ss_collector.sh

4.3 实时监控面板

结合ss和watch命令创建实时监控面板:

watch -n1 "ss -t -H | awk '{print \$2}' | sort | uniq -c | sort -nr; echo; ss -plnt sport = :80 or dport = :80"

这个命令会每秒刷新一次,显示:

  • 按状态分类的连接数统计
  • 所有与80端口相关的连接详情

5. 性能优化与问题排查

掌握了ss的统计能力后,我们可以进一步用它来识别和解决性能问题。

5.1 识别高负载服务

查找连接数最多的前5个服务:

ss -t -p | awk '{print $NF}' | cut -d'"' -f2 | sort | uniq -c | sort -nr | head -5

5.2 分析连接内存占用

查看每个连接的接收和发送队列大小(Recv-Q/Send-Q):

ss -t -o | awk '{print $2,$3,$4}'

高队列值可能表明:

  • 接收方处理速度跟不上(Recv-Q高)
  • 发送方网络拥塞(Send-Q高)

5.3 TCP参数调优建议

根据ss的输出,可以针对性地调整内核参数。例如,发现大量TIME-WAIT连接时:

# 查看当前TIME-WAIT连接数 ss -t state time-wait | wc -l # 临时调整参数 echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout

将这些设置永久化,添加到/etc/sysctl.conf

net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_fin_timeout = 30

执行sysctl -p使设置生效。

在实际生产环境中,从netstat迁移到ss后,连接统计的执行时间从平均400ms降低到了50ms左右,特别是在连接数超过1万的服务器上,这种性能差异会更加明显。对于需要频繁执行网络诊断的自动化脚本,这种改进能够显著降低系统负载。

http://www.cnnetsun.cn/news/1985796.html

相关文章:

  • 避坑指南:Acoular库声源定位从二维升级三维时,我踩过的那些坑(XML配置、网格划分、性能优化)
  • 如何分析RAC启动挂起_crond与ohasd进程启动依赖链排查
  • 从网络到本地:根治Android/Flutter项目Gradle SSL连接重置的实战指南
  • AGI供应链优化不是算法竞赛,而是“物理世界+商业逻辑+实时反馈”的三重耦合(仅限头部制造/零售CTO参阅)
  • 告别枯燥代码!用DoTweenPro可视化编辑器,让策划和美术也能玩转Unity动画
  • 从SOT-23到SOT-963:手把手教你识别和选用那些长得像的SMD晶体管封装
  • SpringBoot+Vue遥感影像共享系统源码+论文
  • 别再只用CANoe仿真了!手把手教你用Test Modules和CAPL脚本玩转自动化测试(附TFS/TSL函数库详解)
  • 【颠覆性标准】:SITS2026不是又一个LLM榜单——它首次引入动态情境迁移率(DSR≥0.68)与跨模态意图保真度(CIF≥91.3%)双硬指标
  • 别再只盯着K-Means了!用sklearn的轮廓系数(silhouette_score)帮你选出最佳聚类算法
  • 三、JumpServer堡垒机实战指南:从入门到高效运维
  • 手把手用Python模拟单缝衍射:从公式到可视化光强分布图
  • AGI规划鲁棒性测试全指南,从模拟环境到真实世界部署的9大失效陷阱与防御性验证协议
  • 【AGI战争伦理黄金三角模型】:从算法偏见、责任归属到人机指挥链,20年军工AI治理实战验证的4层动态防护体系
  • 告别cJSON?手把手教你将旧项目迁移到RapidJSON(附性能对比与常见问题)
  • 蓝桥杯单片机CT107D开发板实战:手把手教你用DS18B20测温度(附完整代码)
  • PCL点云配准效果评估:从RMSE到重合率的实战解析
  • 上交电院直博通关秘籍:从套磁到双选的实战拆解
  • 别再死磕CMOS了!从MOSFET到SOI,一文讲透射频开关的工艺演进与选型指南
  • 你的IoT设备安全吗?从STM32的RNG寄存器配置到生成加密密钥的完整流程
  • QT-ModbusTCP实战:构建高可靠QModbusTcpClient封装类
  • Multi-Agent 数据安全与隐私保护:企业落地的合规性解决方案
  • 别再被KB2999226和KB3118401补丁卡住了!Win10安装Wireshark的终极避坑指南
  • 2026最权威的十大降重复率工具横评
  • 别再瞎调了!NRF52832蓝牙发射功率实战指南:从-40dBm到+4dBm,手把手教你平衡距离与功耗
  • 如何高效使用OpenUserJS.org:5个提升工作效率的实用技巧
  • 微信安卓版8.0.18隐私清单怎么用?手把手教你查看和管理你的个人信息
  • Python剪映API终极指南:5分钟掌握视频自动化批量处理技巧
  • SAP QM新手避坑指南:主检验特性(MIC)的‘定量’与‘定性’到底怎么选?(QS21/QS22实战)
  • Ubuntu 16.04下解决‘software-properties-common’依赖地狱:从Python3缺失到Shell环境修复的完整排雷记录