本文目录导读:
性能分析工具的使用方法取决于你具体想分析什么性能(CPU、内存、磁盘、网络、代码瓶颈)以及你使用的操作系统或开发环境,下面我把最常用的场景和工具整理成一份简明操作指南。
第一阶段:快速定位整体资源瓶颈(系统层面)
如果你感觉电脑或服务器卡顿,但不知道问题出在哪,可以先从系统监控入手。
Linux 系统
- top:实时查看进程的CPU、内存使用率,按
P按CPU排序,按M按内存排序。 - htop:top的增强版,更直观,支持鼠标操作。
- vmstat:查看系统整体运行状态(进程、内存、I/O、CPU)。
vmstat 1表示每秒刷新一次,关注r(等待CPU的进程数)、si/so(交换分区使用情况)。
- iostat:专门查看磁盘I/O性能。
iostat -x 1看%util(磁盘使用率)、await(平均I/O等待时间)。
- netstat:查看网络连接和端口状态。
Windows 系统
- 任务管理器(Ctrl + Shift + Esc):最直接,点“性能”标签看CPU、内存、磁盘、网络使用率,点“进程”标签按任一列排序。
- 资源监视器:在任务管理器“性能”页点击底部链接,可以详细看到谁在读写磁盘、谁在占用网络。
- 性能监视器:管理员工具里的老牌工具,可以添加计数器长期监控。
第二阶段:深入分析代码性能(语言/框架层面)
这是开发者最常用的场景,目的是找到代码里哪个函数最慢、哪里内存泄漏。
Java 应用(最常用工具链)
- jstack:抓取线程快照,看线程是不是死锁或者卡在某个地方。
jstack <pid>打印线程堆栈,找BLOCKED、WAITING状态的线程。
- jstat:监控JVM的GC(垃圾回收)情况。
jstat -gcutil <pid> 1000每秒打印一次GC统计,看 YGC(年轻代GC次数)、FGC(Full GC次数)、FGCT(Full GC耗时)。
- Arthas(阿里开源神器,强烈推荐):在线诊断工具,无需重启服务。
- 你能用它:
trace命令看某个方法执行耗时多少毫秒;watch命令观察参数和返回值;dashboard看实时面板。
- 你能用它:
- VisualVM:图形化工具,可以看CPU、内存、线程、GC,甚至能生成堆转储文件(dump)分析内存泄漏。
Python / Go / Node.js / Rust
- Python:
cProfile(内置标准库)、py-spy(采样分析器,无需修改代码)、memory_profiler(内存监控)。 - Go:内置强大的
pprof工具。- 在代码里引入
net/http/pprof,然后浏览器访问http://localhost:6060/debug/pprof/,可以看CPU火焰图、内存分配、协程(goroutine)阻塞。
- 在代码里引入
- Node.js:Chrome DevTools 可以直接连接Node进程做性能分析;
clinic.js是一个特别好用的第三方工具。 - Rust:
perf(Linux内核级)或flamegraph-rs生成火焰图。
第三阶段:专业性能分析(火焰图、Profiling)
当你需要找到“哪一行代码”是瓶颈时,需要用到采样分析器(Sampling Profiler)。
核心思想:火焰图(Flame Graph)
火焰图是性能分析的标准可视化方式,X轴是采样总次数,Y轴是调用栈深度。“平顶”越宽,那段代码占用时间越多。
如何生成火焰图:
-
Linux通用(perf命令):
# 1. 采样(-F 99 表示每秒采样99次,-p PID) sudo perf record -F 99 -p <进程PID> -g -- sleep 30 # 2. 生成火焰图数据 sudo perf script > out.perf # 3. 用FlameGraph项目生成SVG图 git clone https://github.com/brendangregg/FlameGraph stackcollapse-perf.pl out.perf > out.folded flamegraph.pl out.folded > out.svg # 在浏览器打开 out.svg
-
Java / Go / Python的专用工具:上面提到的Arthas、Go pprof、Python cProfile都能直接导出火焰图数据。
一个实际的操作流程(以“定位CPU过高”为例)
- 发现问题:服务器报警CPU 100%。
- 登录查看:
top -c查看是哪个进程(PID)吃掉了CPU,找到Java进程,假设PID是12345。 - 进程内排查:
- 查看线程:
top -H -p 12345找到哪个线程CPU高,记下线程ID(TID,6789)。 - 转换ID:
printf "%x\n" 6789得到十六进制1a85。 - 打印堆栈:
jstack 12345 | grep -A 30 "1a85"查看这个线程正在执行的代码行。
- 查看线程:
- 深入分析:
- 使用 Arthas:
trace com.example.MyClass myMethod看具体方法耗时。 - 或者用 async-profiler(一个非常快的Java采样器),直接生成火焰图。
./profiler.sh -d 30 -f /tmp/flamegraph.svg 12345等待30秒,打开SVG文件,一眼就能看到最宽的那块(热点代码)。
- 使用 Arthas:
总结建议
- 新人入门:先玩透
top(Linux)或 任务管理器 + 资源监视器(Windows),理解CPU、内存、磁盘的基础概念。 - 开发者必学:Arthas(针对Java)或 pprof(针对Go),它们是线上排查的瑞士军刀。
- 追求深度:学习 火焰图 的原理和生成方法,以及性能分析的基础理论(如Amdahl定律、平均负载、P99延迟等)。
你可以告诉我你当前遇到的具体问题(Java应用响应慢、数据库查询慢、还是某个Python脚本内存越来越大),我可以给你更具体的指令。