系统性能分析-CPU耗时定位
上篇博客介绍了 CPU异常分析的工具和方法。本文将介绍如何定位 CPU 耗时。
定位思路
mindmap root((耗时分析)) system耗时高 可能原因 并发 网络IO 磁盘IO 内存分配 常用工具 dstat vmstat iostat netstat ifstat user耗时高 耗时进程/线程定位 TOP 代码分析 strace perf
代码分析
strace
strace是一个可用于诊断、调试和教学的Linux用户空间跟踪器。我们用它来监控用户空间进程和内核的交互,比如系统调用、信号传递、进程状态变更等(strace底层使用内核的ptrace特性来实现其功能)。
strace有两种运行模式。
- 一种是通过它启动要跟踪的进程。用法很简单,在原本的命令前加上strace即可。比如我们要跟踪
ls -lh /var/log/messages
这个命令的执行,可以这样:strace ls -lh /var/log/messages
。 - 另外一种运行模式,是跟踪已经在运行的进程,在不中断进程执行的情况下进行分析。这种方式通过传递pid启动
strace -p [pid]
。
strace常用选项:
-t
跟踪的每一行都以时间为前缀。-tt
在每行输出的前面,显示毫秒级别的时间-T
显示每次系统调用所花费的时间,这将记录每个系统调用的开始和结束之间的时间差。-v
对于某些相关调用,把完整的环境变量,文件stat结构等打出来。-f
跟踪目标进程,以及目标进程创建的所有子进程-e expr
控制要跟踪的事件和跟踪行为,比如指定要跟踪的系统调用名称-e trace=set
仅跟踪指定的系统调用集。该选项用于确定哪些系统调用可能是跟踪有用有用。例如,trace=open,close,read,write表示仅跟踪这四个系统调用。-e trace=file
跟踪所有以文件名作为参数的系统调用。-e trace=process
跟踪涉及过程管理的所有系统调用。
-o
把strace的输出单独写到指定的文件-s
当系统调用的某个参数是字符串时,最多输出指定长度的内容,默认是32个字节-p
指定要跟踪的进程pid, 要同时跟踪多个pid, 重复多次-p选项即可。-c
统计系统调用的所执行的时间,次数和出错的次数等。-S
按指定条件对-c选项打印的直方图输出进行排序。
1 | strace -c uptime |
perf
perf是Linux内核自带的一款性能分析工具,它利用内核中的性能计数器(performance counters)来收集系统的各种性能数据。这些数据包括CPU使用率、缓存命中率、分支预测失败率等,可以帮助我们深入了解系统的运行情况,找出性能瓶颈,进而进行优化。
perf的主要功能
- 数据收集:perf可以收集CPU、内存、IO等各个方面的性能数据,通过对这些数据的分析,我们可以找出系统中的性能瓶颈。
- 实时分析:perf提供了实时分析功能,可以在系统运行过程中实时查看性能数据,帮助开发人员及时发现问题并进行调整。
- 事件跟踪:perf支持事件跟踪功能,可以跟踪系统中的特定事件,如函数调用、系统调用等,从而找出性能问题的根源。
perf list
可以列出所有可用的性能事件。这些事件包括硬件事件(如 CPU 周期、缓存命中/未命中等)和软件事件(如上下文切换、系统调用等)。
perf record
使用 perf record 命令来记录目标程序的性能数据。
1 | timeout 10s perf record -g -p 1156 |
-e
选择性能事件。可以是 CPU 周期、缓存未命中等。使用 perf list 命令来查看所有可用的事件。-g
记录函数调用关系(调用栈)。这对于分析程序中函数调用和热点非常有帮助。-a
表示对所有 CPU 进行采样-p
记录指定进程的性能数据。只关注某一个特定进程-t
记录指定线程的性能数据。用于分析多线程程序中某个特定线程的性能-F 99
设置采样频率,表示每秒采样 99 次-c 1000
设置事件的采样周期。例如,每发生1000次事件采样一次。
这会生成一个 perf.data 文件,它包含了采集的性能数据,也可以用 -o 来指定生成的文件名。
可以指定要分析的事件类型,例如 CPU 时钟周期、缓存命中等。
1 | perf record -e cpu-clock -a sleep 6 |
分析性能数据
使用perf report
产生结果分析。
1 | Samples: 717 of event 'cycles:uppp', Event count (approx.): 195060525 |
列 | 描述 |
---|---|
Children | 该函数及其所有子函数的 CPU 使用百分比总和 |
Self | 该函数本身 CPU 使用百分比 |
Command | 正在运行的程序或命令 |
Shared Object | 包含该函数的库或模块 |
Symbol | 函数或方法的名称 |
文件查看不够直观,还有一种火焰图分析的方式:
- 工具下载:
git clone https://github.com/brendangregg/FlameGraph.git
- 使用命令:
- 使用perf script工具对perf.data进行解析
perf script -i perf.data &> perf.unfold
- 将perf.unfold中的符号进行折叠:
/data/stackcollapse-perf.pl perf.unfold &> perf.folded
- 最后生成svg图:
/data/flamegraph.pl perf.folded > perf.svg
- 使用perf script工具对perf.data进行解析