运维老鸟打死不说的10个Linux性能排查命令
最后一个直接封神,90%的人都没用过
核心看点
CPU飙到100%怎么一秒定位?内存泄漏如何快速揪出?磁盘IO打满是谁在搞鬼?
本文整理了10个运维老兵压箱底的性能排查命令,从入门到精通,手把手教你成为排障高手。
任何性能问题排查的第一步,永远是看整体。top 是 Linux 自带的进程监控工具,而 htop 是其增强版,界面更友好。
$ top -c
# -c 显示完整命令行,一眼看出是哪个进程在作妖
实战技巧:按1展开所有CPU核心,按P按CPU排序,按M按内存排序,按c显示完整命令。
vmstat 能同时展示CPU、内存、IO和系统整体状态,是性能排查的瑞士军刀。
$ vmstat 1 10
# 每秒采样一次,共10次,实时观察系统波动
实战技巧:如果r列持续高于CPU核数,同时us+sy接近100%,那就是纯CPU瓶颈;如果b列持续大于0且wa高,那就是IO瓶颈。
磁盘是服务器最慢的组件,IO问题往往是最隐蔽的性能杀手。iostat 让你对磁盘了如指掌。
$ iostat -x 1
# -x 显示扩展统计,1 表示每秒刷新
ss 是 netstat 的现代替代品,速度更快、信息更全。网络问题排查的第一利器。
$ ss -tunlp
# 查看所有TCP/UDP监听端口及对应进程
$ ss -s
# 汇总统计,一眼看出连接数是否异常
$ ss -tan state time-wait | wc -l
# 统计TIME_WAIT连接数,过多说明短连接频繁
实战技巧:如果TIME_WAIT连接数超过1万,说明你的服务在疯狂建立短连接,赶紧改成连接池或长连接。
sar 是 sysstat 包中的王牌工具,能回溯历史数据。出问题时如果没开监控,sar 就是你的救命稻草。
$ sar -u -f /var/log/sa/sa26
# 查看26号当天的CPU历史数据
$ sar -n DEV 1 5
# 实时查看每块网卡的流量,定位网络瓶颈
$ sar -r 1 10
# 实时内存使用情况,关注 kbmemfree 和 kbbuffers
当所有常规手段都用过了还是找不到问题,strace 就是你的终极武器。它能追踪进程的每一个系统调用。
$ strace -p 12345 -c
# 附加到进程12345,-c 统计各系统调用耗时
$ strace -e trace=network -p 12345
# 只看网络相关的系统调用,过滤噪音
$ strace -T -e trace=read,write -p 12345
# -T 显示每个调用的耗时,定位慢IO操作
注意:strace 对性能有较大影响,生产环境谨慎使用,建议先在测试环境复现。
在Linux中一切皆文件。lsof 能列出进程打开的所有文件、socket、管道,是排查资源泄漏的神器。
$ lsof -p 12345 | wc -l
# 查看进程打开了多少文件,判断是否有fd泄漏
$ lsof -i :8080
# 查看哪个进程占用了8080端口
$ lsof /var/log/nginx/access.log
# 查看哪些进程正在写这个日志文件
perf 是 Linux 内核自带的性能分析工具,能深入到函数级别告诉你CPU到底在忙什么。
$ perf top -p 12345
# 实时查看进程12345的热点函数,类似top但精确到函数
$ perf record -p 12345 -g -- sleep 30
# 采样30秒,-g 记录调用栈
$ perf report
# 生成火焰图数据,直观展示CPU热点
当怀疑是网络层面的问题时,tcpdump 能帮你抓到每一个数据包,还原真相。
$ tcpdump -i eth0 port 8080 -nn -A
# 抓取8080端口的包,-A 以ASCII显示内容
$ tcpdump -i eth0 host 10.0.0.5 -w dump.pcap
# 抓取与10.0.0.5通信的所有包,保存为pcap文件
$ tcpdump -i eth0 'tcp[tcpflags] & (tcp-rst) != 0'
# 只抓RST包,快速定位连接被拒绝的问题
十、bpftrace — 直接封神的内核可观测工具
如果说前面9个是常规武器,那 bpftrace 就是核武器。它基于 eBPF 技术,能在不修改内核、不影响性能的前提下,动态追踪内核和用户态的每一个角落。
为什么 bpftrace 是神?
1. 零侵入:不需要修改代码、不需要重启服务
2. 高性能:eBPF在内核态执行,开销极低
3. 全覆盖:从系统调用到网络包,无所不能
4. 安全:eBPF验证器保证不会把内核搞崩
经典一行命令
$bpftrace -e 'kprobe:vfs_read { @start[tid] = nsecs; } kretprobe:vfs_read /@start[tid]/ { @us = hist((nsecs - @start[tid]) / 1000); delete(@start[tid]); }'
# 统计所有vfs_read调用的耗时分布,单位微秒
$ bpftrace -e 'tracepoint:syscalls:sys_enter_openat { printf("%s %s\n", comm, str(args->filename)); }'
# 实时打印系统中所有进程打开的文件
$ bpftrace -e 'kprobe:tcp_retransmit_skb { printf("retransmit from %s\n", comm); }'
# 捕获所有TCP重传事件,一秒定位网络丢包
$ bpftrace -e 'kprobe:do_sys_open { @opens[comm] = count(); }'
# 统计哪个进程在疯狂打开文件,揪出fd泄漏元凶
假设你接到告警:线上服务响应时间从50ms飙升到2000ms。按以下流程排查:
工具是死的,思维是活的。记住性能排查的黄金法则:
USE法则:Utilization(使用率)+ Saturation(饱和度)+ Errors(错误数),对每个资源都检查这三个维度。
RED法则:Rate(请求速率)+ Errors(错误率)+ Duration(耗时),从服务角度衡量健康度。
黄金信号:延迟(Latency)、流量(Traffic)、错误(Errors)、饱和度(Saturation),Google SRE的四大黄金信号。
把这10个命令练熟,下次服务器出问题,你就是团队里那个最靓的仔。
原创 · 公众号「IT信息化」
觉得有用?转发给身边的运维兄弟
点赞 · 收藏 · 转发