高 进阶
Linux性能指标与排障命令#
一句话答案#
Linux 性能排障五板斧:top 看 CPU/内存概览、vmstat 看上下文切换和 IO 等待、iostat 看磁盘 IO、netstat/ss 看网络连接、perf/strace 看系统调用热点;排障顺序是 CPU→内存→磁盘→网络逐层排查。
核心要点
一、性能排障命令速查表
| 维度 | 命令 | 看什么 | 关键指标 |
|---|---|---|---|
| 总览 | top / htop | CPU/内存/进程 | %CPU、%MEM、load average |
| CPU | vmstat 1 | 上下文切换/运行队列 | r(运行队列)、cs(上下文切换)、us/sy/wa |
| CPU | mpstat -P ALL 1 | 每核 CPU 使用 | 是否有单核打满 |
| 内存 | free -h | 内存/swap 使用 | available 才是真正可用内存 |
| 内存 | vmstat 1 | swap in/out | si/so>0 说明在 swap |
| 磁盘 | iostat -xd 1 | 磁盘 IO 性能 | %util(使用率)、await(等待时间) |
| 磁盘 | iotop | 哪个进程占 IO | 定位 IO 大户 |
| 网络 | ss -s | 连接状态统计 | TIME_WAIT/ESTABLISHED 数量 |
| 网络 | sar -n DEV 1 | 网络吞吐 | rxkB/s、txkB/s |
| 进程 | strace -p PID | 系统调用追踪 | 耗时最长的系统调用 |
| 进程 | perf top | CPU 热点函数 | 哪个函数消耗 CPU 最多 |
| 文件 | lsof -p PID | 打开的文件/连接 | 文件描述符泄漏 |
二、vmstat 输出解读
$ vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 0 512000 64000 256000 0 0 10 20 100 500 30 5 60 5 0bash| 字段 | 含义 | 异常判断 |
|---|---|---|
| r | 运行队列中进程数 | > CPU核数 = CPU 饱和 |
| b | 不可中断睡眠进程 | > 0 = IO 阻塞 |
| si/so | swap in/out (KB/s) | > 0 = 内存不足在 swap |
| bi/bo | 块设备读写 (blocks/s) | 持续高 = IO 压力 |
| cs | 上下文切换次数/秒 | > 10000/核 = 可能过高 |
| us | 用户态 CPU% | 高 = 应用消耗 CPU |
| sy | 内核态 CPU% | 高 = 系统调用/中断多 |
| wa | IO 等待 CPU% | > 20% = IO 瓶颈 |
三、排障决策树
应用响应慢
│
├─ top 看 CPU
│ ├─ CPU 高(us>80%) → mpstat 看是否单核满 → perf top 找热点函数
│ ├─ CPU 高(sy>30%) → vmstat 看 cs → 上下文切换频繁/中断过多
│ └─ CPU 低但 wa 高 → IO 瓶颈,转磁盘排查
│
├─ free 看内存
│ ├─ available 很低 → 内存不足
│ ├─ swap 使用 > 0 → vmstat 看 si/so → 需要加内存或优化
│ └─ buff/cache 很大 → 正常,Linux 用空闲内存做缓存
│
├─ iostat 看磁盘
│ ├─ %util > 80% → 磁盘 IO 饱和
│ ├─ await > 10ms → IO 延迟高(SSD 通常 <1ms)
│ └─ iotop 看哪个进程 → 日志写入/DB/备份
│
└─ ss/sar 看网络
├─ TIME_WAIT 过多 → 连接池/长连接
├─ ESTABLISHED 异常多 → 连接泄漏
└─ 带宽打满 → 限流/CDN/压缩plaintext四、关键 OS 概念与性能关联
| 概念 | 性能影响 | 命令验证 |
|---|---|---|
| Page Fault (缺页) | 主缺页→磁盘 IO(慢);次缺页→内存映射(快) | perf stat -e page-faults |
| TLB Miss | 虚拟→物理地址转换慢 | perf stat -e dTLB-load-misses |
| Context Switch | 寄存器/TLB/cache 刷新 | vmstat cs 列 / pidstat -w |
| Cache Miss | L1/L2/L3 缓存未命中→访问主存 | perf stat -e cache-misses |
| Fork + COW | fork 时复制页表,写时才复制页 | Redis RDB/AOF rewrite 的 fork 开销 |
五、生产常见场景
场景1:Java 应用 CPU 100%
# 1. top -Hp <PID> 找到 CPU 最高的线程
# 2. printf "%x\n" <TID> 转换成16进制
# 3. jstack <PID> | grep <TID_HEX> -A 30 → 看线程堆栈
# 常见原因:死循环、正则回溯、GC 线程bash场景2:磁盘 IO 飙高
# 1. iostat -xd 1 确认哪块盘
# 2. iotop 找到 IO 大户进程
# 3. strace -p <PID> -e trace=write,read 看 IO 模式
# 常见原因:大量日志写入、DB 刷盘、备份任务bash场景3:内存持续增长
# 1. free -h 看趋势
# 2. top 按 %MEM 排序找大户
# 3. pmap -x <PID> 看内存映射
# 4. Java: jmap -histo <PID> 看对象分布bash面试回答(2分钟版)
Linux 性能排障我按 CPU→内存→磁盘→网络的顺序逐层排查。CPU 用 top 看整体负载,如果 us 高说明应用消耗大用 perf top 找热点函数,sy 高说明系统调用多用 vmstat 看上下文切换,wa 高说明 IO 等待转磁盘排查。内存看 free 的 available 列而非 free 列因为 buff/cache 是可回收的,vmstat 的 si/so 大于 0 说明在用 swap 性能急剧下降。磁盘用 iostat 看 %util 和 await,%util 超过 80% 说明磁盘饱和。网络用 ss 看连接状态统计。Java 应用 CPU 100% 的经典排查路径是 top -Hp 找线程、printf 转16进制、jstack 看堆栈。这些命令我在排查线上问题时经常用,比如 Redis fork 导致的延迟抖动就是通过 vmstat 看到 io wait 升高然后 iostat 确认是 RDB dump 引起的。
追问与易错
追问方向:
- “load average 1/5/15 分钟怎么判断?”→ 超过 CPU 核数表示过载,关键看趋势(1 分钟 > 15 分钟说明负载在上升),用 nproc 查核数作为基准
- “buff 和 cache 区别?”→ buff 是块设备的写缓冲(裸设备 IO),cache 是文件系统的读缓存(Page Cache);现代内核两者几乎合并,看 available 即可
- “怎么看是主缺页还是次缺页?”→
ps -o min_flt,maj_flt -p PID,maj_flt(主缺页)需要磁盘 IO 很慢,大量主缺页说明内存不足频繁换页 - “strace 对性能有影响吗?”→ 有,strace 用 ptrace 拦截所有系统调用,开销可达 100 倍以上,生产环境慎用;可用 perf trace 替代开销更小
易错点:
- ❌ “free 列很低说明内存不足”——buff/cache 是可回收的,看 available
- ❌ “CPU idle 高就没问题”——可能是 IO 等待(wa)导致 CPU 空闲但应用阻塞
- ❌ “vmstat 看一次就够”——要看趋势,
vmstat 1每秒采样持续观察 - ✅ 排障口诀:top 看概况、vmstat 看上下文、iostat 看磁盘、ss 看网络