性能·网络 / 命令文档
Linux ss命令
概述
网络调试与监控的利器
为什么需要ss命令?
在Linux系统管理和网络故障排除中,了解系统的网络连接状态至关重要。传统的netstat命令虽然功能强大,但在现代高负载系统中存在性能瓶颈。
netstat的局限性:
在大量连接的系统上运行缓慢
需要遍历整个/proc/net目录
输出格式相对固定,扩展性有限
对IPv6支持不够完善
ss命令的优势
| 特性 | netstat | ss |
|---|---|---|
| 执行速度 | 较慢 | 快速 |
| 内存占用 | 较高 | 较低 |
| 过滤功能 | 基础 | 强大 |
| 输出格式 | 固定 | 灵活 |
| IPv6支持 | 一般 | 优秀 |
基础语法
ss [选项] [过滤条件]
主要选项详解
ss -t
显示TCP连接
ss -u
显示UDP连接
ss -l
只显示监听端口
ss -a
显示所有连接
ss -n
不解析主机名
ss -p
显示进程信息
常用组合命令
1. 查看所有TCP监听端口
ss -tlnp
这是最常用的组合,显示所有TCP监听端口及其对应的进程
2. 查看特定端口的连接
ss -tlnp | grep :80
ss -tlnp sport = :80
3. 查看已建立的TCP连接
ss -tnp state established
4. 统计连接状态
ss -s
实用技巧:使用 -o 选项可以显示计时器信息,-e 选项显示详细的套接字信息,-m 选项显示套接字内存使用情况。
过滤表达式
ss命令支持强大的过滤功能,可以精确筛选所需的连接信息:
状态过滤
ss state established
ss state listening
ss state time-wait
端口过滤
ss sport = :80
ss dport = :3306
ss sport \> :1024
地址过滤
ss src 192.168.1.100
ss dst 10.0.0.0/8
复合过滤
ss -tn state established and dst :80
ss -tu state listening and sport \> :1024
权限要求
权限限制:普通用户只能查看自己的进程信息,要查看所有进程的网络连接需要root权限或使用sudo。
sudo ss -tlnp # 需要管理员权限
性能考虑
性能提示: 使用-n选项避免DNS解析,提高执行速度 在高负载系统上,ss比netstat快数倍 合理使用过滤条件,减少输出量
输出解读
输出字段含义:
State: 连接状态(LISTEN, ESTABLISHED, TIME-WAIT等)
Recv-Q: 接收队列中的字节数
Send-Q: 发送队列中的字节数
Local Address:Port: 本地地址和端口
Peer Address:Port: 远程地址和端口
Process: 关联的进程信息
常见问题与解决
1. 显示结果过多
问题:在繁忙的服务器上,ss输出可能非常多,难以查看。 解决:使用过滤条件或结合管道命令。
ss -tn | head -20
ss -tn state established | wc -l
2. 进程信息显示不完整
问题:某些进程信息显示为空或不完整。 解决:确保有足够权限,或者进程可能已经结束。
3. IPv6连接显示
提示:ss默认显示IPv4和IPv6连接,如果只需要IPv4,使用-4选项;只需要IPv6,使用-6选项。
ss -4 -tlnp # 仅IPv4
ss -6 -tlnp # 仅IPv6
最佳实践
日常运维建议:
定期检查监听端口:ss -tlnp
监控连接数变化:ss -s
排查网络问题时结合tcpdump使用
编写监控脚本时使用JSON输出:ss -j
在生产环境中避免不必要的DNS解析
系统监控脚本示例
#!/bin/bash # 网络连接监控脚本 echo "=== TCP连接统计 ===" ss -s echo -e "\n=== 监听端口 ===" ss -tlnp echo -e "\n=== 活跃连接数 ===" ss -tn state established | wc -l echo -e "\n=== TIME-WAIT连接数 ===" ss -tn state time-wait | wc -l
故障排查场景
场景:Web服务响应缓慢 排查步骤: 1.使用curl测试确认慢在哪 httpstat "http://img.youngsu.top/" 2.登陆服务器自检 top -c # CPU, load, 哪个进程占用高 vmstat 1 # 系统负载、上下文切换 iostat -x 1 # 磁盘I/O瓶颈 ar -n DEV 1 # 网络带宽 free -m # 内存情况 3.使用ss命令检查网络连接 检查监听状态:ss -tlnp | grep :80 查看连接队列:ss -tln sport = :80 统计连接状态:ss -tn | awk '{print $1}' | sort | uniq -c 4.检查web日志定位 cat /data/wwwlogs/access_nginx.log | awk '{print $7,$NF}' | sort | uniq -c | sort -nr | head