温馨提示×

怎样分析进程性能问题

小樊
48
2026-09-21 18:41:07
栏目: 编程语言

分析进程性能问题,通常需要系统化地从“资源瓶颈 → 进程行为 → 代码/逻辑”逐层定位。下面给你一套实用、可操作的分析思路和常用工具(以 Linux 为主,其他系统思路类似)。


一、先明确“性能问题”的表现

先搞清楚是哪一类问题:

  • CPU 高:进程占用 CPU 过高
  • 内存高 / 泄漏:RSS 持续增长、OOM
  • IO 慢:磁盘或网络读写阻塞
  • 延迟高:响应慢但资源看起来不高
  • 吞吐低:并发上不去

不同表现,分析路径不同。


二、系统级:先看整体资源瓶颈

1. CPU

top
htop

关注:

  • %CPU
  • 单核是否打满
  • load average

进一步:

mpstat -P ALL 1

看是否是:

  • 用户态 CPU 高(计算)
  • 系统态 CPU 高(系统调用/锁)
  • iowait 高(IO 问题)

2. 内存

free -h
cat /proc/meminfo

重点:

  • 可用内存
  • available 而非 free
  • swap 是否使用

进程内存:

ps -o pid,rss,vsz,comm -p <pid>

3. IO(磁盘 / 网络)

磁盘:

iostat -x 1

看:

  • %util
  • await

网络:

sar -n DEV 1
iftop

三、进程级:定位“是哪个进程、在干什么”

1. 查看进程状态

ps -eo pid,ppid,stat,%cpu,%mem,comm | grep <proc>

状态含义:

  • R:运行
  • D:不可中断睡眠(常是 IO)
  • S:睡眠
  • Z:僵尸

2. 线程级分析(多线程程序很重要)

top -H -p <pid>

找到高 CPU 线程 ID(十进制)

转成十六进制:

printf "%x\n" <tid>

四、深入进程内部:到底在忙什么

1. 火焰图(最推荐)

使用 perf:

perf record -F 99 -p <pid> -g -- sleep 30
perf script | FlameGraph/stackcollapse-perf.pl | FlameGraph/flamegraph.pl > cpu.svg

可看到:

  • 热点函数
  • 系统调用
  • 锁竞争

2. 系统调用分析

strace -p <pid> -c
strace -p <pid> -T -e trace=network,read,write

看是否在:

  • 频繁 syscall
  • 网络阻塞
  • 文件 IO 慢

3. 锁 / 同步问题

perf lock

或:

cat /proc/<pid>/stack

结合 top -H 看是否大量线程在 futex


五、内存问题专项

1. 内存泄漏

  • 长期观察 RSS
  • 使用:
valgrind --tool=memcheck

或:

  • jemalloc / tcmalloc 的 heap profile
  • Java:jmap / jstat
  • Go:pprof

2. Page Fault

ps -o min_flt,maj_flt -p <pid>
  • maj_flt 高 → 内存不足或 IO 问题

六、延迟 & 吞吐问题(资源不高但慢)

常见原因:

  • 锁竞争
  • 上下文切换
vmstat 1

看:

  • cs(context switch)
  • r(run queue)

网络:

  • 连接数
  • 丢包
  • 延迟(ping / traceroute)

七、典型问题速查表

现象 优先检查
CPU 100% perf / top -H
内存涨不停 RSS + valgrind
IO 慢 iostat / strace
卡死 D 状态 / stack
并发低 cs / lock / 线程模型

八、一个标准分析流程(总结)

  1. 确认现象(CPU / 内存 / IO / 延迟)
  2. 系统级定位瓶颈
  3. 进程级确认目标 PID
  4. 线程级定位热点
  5. 函数级用 perf / 火焰图
  6. 结合代码验证假设

如果你愿意,可以告诉我:

  • 操作系统
  • 进程类型(Java / Go / C++ / Python)
  • 具体现象(CPU 高?卡?OOM?)

我可以直接给你针对性的分析命令和解读。

0 踩