正在加载,请稍候…

Linux 性能分析:USE 方法、perf、eBPF 与系统剖析

系统化诊断 Linux 性能问题——USE 方法、使用 perf/strace/vmstat/iostat/eBPF 工具进行 CPU/内存/磁盘 I/O 分析

Linux 性能分析:USE 方法、perf、eBPF 与系统剖析

USE 方法

对于每个资源,检查:

  • Utilization(利用率):资源忙碌的时间百分比
  • Saturation(饱和度):排队等待的额外工作量
  • Errors(错误):错误计数

Linux 性能分析:USE 方法、perf、eBPF 与系统剖析 插图

CPU 分析

# 整体 CPU 利用率
top -1        # 按 CPU 分解,按 1 键
htop          # 交互式,比 top 更好
mpstat -P ALL 1  # 每秒显示每个 CPU 统计

# CPU 饱和度(运行队列)
vmstat 1      # r 列 = 等待 CPU 的进程数
              # r > CPU 数量 = 饱和!
uptime        # 1/5/15 分钟平均负载

# 什么在使用 CPU
pidstat 1     # 每秒显示每个进程的 CPU
perf top      # 实时内核/用户态分析
perf record -F 99 -a -g -- sleep 10  # 记录火焰图数据
perf report   # 分析记录

内存分析

# 内存概览
free -h              # 总量/已用/空闲/缓冲区/缓存
cat /proc/meminfo    # 详细分解

# 内存饱和度(交换 = 糟糕)
vmstat 1             # si/so 列 = 换入/换出
iostat -xz 1         # 检查交换 I/O

# 内存泄漏 - 按进程
pmap -x <pid>        # 进程内存映射
smem --sort rss      # 按常驻集大小排序
valgrind --leak-check=full ./app  # 查找泄漏

# 缺页错误
perf stat -e page-faults ./app

Linux 性能分析:USE 方法、perf、eBPF 与系统剖析 插图

磁盘 I/O 分析

# I/O 概览
iostat -xz 1         # %util, await (ms), r/s, w/s
                     # util > 90% = 磁盘饱和
                     # await > 10ms = I/O 慢

# 什么在进行 I/O
iotop -ao            # 产生 I/O 的进程
pidstat -d 1         # 每个进程的 I/O 统计

# 文件级跟踪(eBPF)
opensnoop            # 显示所有 open() 系统调用
filelife             # 短生命周期文件
ext4slower 10        # 慢于 10ms 的 ext4 操作

网络分析

# 网络统计
netstat -s           # 协议统计
ss -s                # 套接字摘要
ss -ntlp             # 监听中的 TCP 套接字

# 网络 I/O
sar -n DEV 1         # 网络接口统计
nethogs              # 每个进程的带宽
iftop                # 每个连接的带宽

# 连接分析
ss -n 'state time-wait' | wc -l   # TIME_WAIT 连接数
ss -n 'state close-wait' | wc -l  # CLOSE_WAIT(可能泄漏)

Linux 性能分析:USE 方法、perf、eBPF 与系统剖析 插图

strace 系统调用跟踪

# 跟踪运行中的进程
strace -p <pid>
strace -p <pid> -e trace=read,write,open,close  # 过滤系统调用

# 带时间跟踪
strace -T -p <pid>   # 显示每个系统调用花费的时间

# 跟踪命令
strace -o output.txt -T -tt ls /tmp

perf 火焰图

# 1. 记录 CPU 性能剖析
perf record -F 99 -g -p <pid> -- sleep 30

# 2. 生成火焰图(需要 FlameGraph 工具)
perf script | stackcollapse-perf.pl | flamegraph.pl > flame.svg

# 在浏览器中查看
open flame.svg

eBPF 工具(BCC/bpftrace)

# 所有 execve 调用(新进程)
execsnoop

# TCP 连接跟踪
tcpconnect   # 显示新的 TCP 连接
tcpaccept    # 显示传入连接

# DNS 查询
dnsnoop

# 自定义 bpftrace 脚本
bpftrace -e '
tracepoint:syscalls:sys_enter_write {
  @[comm] = count();
}
interval:s:5 {
  print(@);
  clear(@);
}
'

快速性能检查清单

# 60 秒分析清单
uptime               # 平均负载趋势
dmesg | tail         # 内核消息
vmstat 1 3           # 虚拟内存统计
mpstat -P ALL 1      # CPU 分解
pidstat 1 3          # 进程统计
iostat -xz 1 3       # 磁盘 I/O
free -h              # 内存
sar -n DEV 1 3       # 网络接口统计
sar -n TCP,ETCP 1    # TCP 统计
top                  # 系统概览