面试知识库
进阶

Linux性能指标与排障命令#

一句话答案#

Linux 性能排障五板斧:top 看 CPU/内存概览、vmstat 看上下文切换和 IO 等待、iostat 看磁盘 IO、netstat/ss 看网络连接、perf/strace 看系统调用热点;排障顺序是 CPU→内存→磁盘→网络逐层排查。

核心要点

一、性能排障命令速查表

维度命令看什么关键指标
总览top / htopCPU/内存/进程%CPU、%MEM、load average
CPUvmstat 1上下文切换/运行队列r(运行队列)、cs(上下文切换)、us/sy/wa
CPUmpstat -P ALL 1每核 CPU 使用是否有单核打满
内存free -h内存/swap 使用available 才是真正可用内存
内存vmstat 1swap in/outsi/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 topCPU 热点函数哪个函数消耗 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  0
bash
字段含义异常判断
r运行队列中进程数> CPU核数 = CPU 饱和
b不可中断睡眠进程> 0 = IO 阻塞
si/soswap in/out (KB/s)> 0 = 内存不足在 swap
bi/bo块设备读写 (blocks/s)持续高 = IO 压力
cs上下文切换次数/秒> 10000/核 = 可能过高
us用户态 CPU%高 = 应用消耗 CPU
sy内核态 CPU%高 = 系统调用/中断多
waIO 等待 CPU%> 20% = IO 瓶颈

三、排障决策树

四、关键 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 MissL1/L2/L3 缓存未命中→访问主存perf stat -e cache-misses
Fork + COWfork 时复制页表,写时才复制页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 看网络