perf
perf 是一个 Linux 性能分析工具,提供了性能分析架构,应用程序可以利用 tracepoint 和内核计数器进行性能相关信息统计。利用这些信息可以帮助分析性能问题和定位性能瓶颈。
perf record
perf record 用来收集采样信息,并将其记录在数据文件中。
命令行形式:
perf record [-e <EVENT> | --event=EVENT] [-a] <command> [<options>]
参数说明:
- EVENT 的取值如下:
- u:表示用户空间触发的性能事件 。
- k:表示内核态触发的性能事件。
- h:表示管理程序产生的性能事件。
- G:表示在 KVM 虚拟机下的客户机产生的性能事件。
- H:表示在 KVM 虚拟机下的宿主机产生的性能事件。
- -a:表示所有 CPU。
- options 的取值如下:
- -F:表示每秒的采样次数,取值范围为 [1,+∞),默认配置为 4000,推荐配置为 99。
- -p:用于指定需要进行分析的进程 PID。
- -g:表示用于记录的调用栈。
- sleep:表示持续时间,单位为秒,取值范围为 [1,+∞)。
perf stat
perf stat 用于分析指定程序的性能概况。
命令行形式:
perf stat [-e <EVENT> | --event=EVENT] [-a] <command>
参数说明:
- EVENT 的取值如下:
- u:表示用户空间触发的性能事件 。
- k:表示内核态触发的性能事件。
- h:表示管理程序产生的性能事件。
- G:表示在 KVM 虚拟机下的客户机产生的性能事件。
- H:表示在 KVM 虚拟机下的宿主机产生的性能事件。
- -a:表示所有 CPU。
- 可选项:
- -p
:指定进程 ID。 - -v:展示更多数据信息。
- -r:求平均。
- -C:从指定 CPU 上收集性能数据。
- -p
通过 perf stat -p 120228 命令显示进程 ID 为 120228 的程序的性能概况。示例如下:
$perf stat -p 120228
Performance counter stats for process id '120228':
1212814.537787 task-clock (msec) # 77.290 CPUs utilized (100.00%)
13,932,119 context-switches # 0.011 M/sec (100.00%)
4,504,797 cpu-migrations # 0.004 M/sec (100.00%)
709,321 page-faults # 0.585 K/sec
2,956,658,594,250 cycles # 2.438 GHz (100.00%)
<not supported> stalled-cycles-frontend
<not supported> stalled-cycles-backend
2,397,178,336,412 instructions # 0.81 insns per cycle (100.00%)
542,664,260,703 branches # 447.442 M/sec (100.00%)
3,346,269,384 branch-misses # 0.62% of all branches
15.691803125 seconds time elapsed
字段说明:
task-clock:任务真正占用的处理器时间,单位为 ms。
context-switches : 上下文切换。
CPUs utilized:CPU 的占用率,CPUs utilized = task-clock / time elapsed。
cpu-migrations:处理器迁移次数,Linux 为了维持多个处理器的负载均衡,在特定条件下会将某个任务从一个 CPU 迁移到另一个 CPU。
page-faults:缺页异常的次数。
cycles:消耗的处理器周期数,CPU 周期是指 CPU 所能识别的最小时间单元。
instructions:执行了多少条指令。
insns per cycle:平均每个 cpu cycle 执行了多少条指令。
branches:遇到的分支指令数。
branch-misses:预测错误的分支指令数。
time elapsed :命令执行时长。
perf list
perf list 用来查看 perf 所支持的性能事件。
命令行形式:
perf list [hw | sw | cache | tracepoint | event_glob]
参数说明:
hw:表示 PMU 部件产生硬件事件。
sw:表示内核产生的事件。
cache:表示 CPU 各级 cache 产生的事件。
tracepoint:表示基于内核的 ftrace,是内核中静态 tracepoint 所触发的事件。
event_glob:表示其他事件。
perf top
perf top 用来指定性能事件(默认是 CPU 周期),显示消耗最多的函数或指令。主要用于实时分析各个函数在某个性能事件上的热度,能够快速定位热点函数,包括应用程序函数、模块函数与内核函数,甚至能够定位到热点指令。
命令行形式:
perf top [-e <EVENT> | --event=EVENT] [<options>]
参数说明:
EVENT 的取值如下:
- u:表示用户空间触发的性能事件 。
- k:表示内核态触发的性能事件。
- h:表示管理程序产生的性能事件。
- G:表示在 KVM 虚拟机下的客户机产生的性能事件。
- H:表示在 KVM 虚拟机下的宿主机产生的性能事件。
options 的取值如下:
- -p
:指定进程 ID。 - -K:不显示属于内核或模块的符号。
- -U:不显示属于用户态程序的符号。
- -d
:界面的刷新周期,默认为 2 s,因为 perf top 默认每 2 s 从 mmap 的内存区域读取一次性能数据。 - -G:得到函数的调用关系图。
- --call-graph:dwarf 栈回溯所需的全部信息(需要编译时附加了调试信息 -g )。
- -p
通过 perf top 命令显示指定性能事件中消耗最多的函数或指令。示例如下:
$perf top
Samples: 366K of event 'cycles', Event count (approx.): 23340587417
Overhead Shared Object Symbol
10.40% [vdso] [.] __vdso_gettimeofday
4.70% observer [.] oceanbase::storage::ObPartitionGroupIterator::get_next
4.23% observer [.] oceanbase::common::ObLatch::unlock
4.02% observer [.] oceanbase::common::ObLatch::rdlock
3.08% observer [.] oceanbase::common::ObLatch::wrlock
2.26% observer [.] oceanbase::common::ObLinearHashMap<oceanbase::clog::ObPartitionLogInfo, oceanbase::clog::ObLogCursorExt, ocea
1.97% observer [.] oceanbase::memtable::ObLockWaitMgr::check_timeout
1.82% observer [.] oceanbase::common::hash::ObPreAllocLinkHashMap<oceanbase::storage::ObITable::TableKey, oceanbase::storage::Ob
1.68% observer [.] oceanbase::omt::ObThWorker::worker
字段说明:
Overhead:符号引发的性能事件的比例,默认指占用的 CPU 周期比例。
Shared Object:符号所在的 DSO ( Dynamic Shared Object ),可以是应用程序、内核、动态链接库、模块。
Symbol:DSO 的类型及符号名。对于 DSO 的类型:[ . ] 表示此符号属于用户态的 ELF 文件,包括可执行文件与动态链接库。[ k ] 表述此符号属于内核或模块。对于符号名:有些符号不能解析为函数名,只能用地址表示。
vmstat
vmstat 是 Virtual Meomory Statistics 的缩写,可以对操作系统的虚拟内存、进程、CPU 活动进行监控。
命令行形式:
vmstat [-a] [delay [count]] [<options>]
参数说明:
-a:显示活跃和非活跃内存 。
delay :表示刷新一次的时间间隔。
count:表示刷新次数。
options:表示其他可查看的性能指标。
通过 vmstat 10 2 命令显示操作系统的虚拟内存、进程、CPU 活动。示例如下:
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
28 0 0 415902272 283432 201305696 0 0 387 1054 0 0 19 3 78 0 0
38 0 0 415039424 283432 201309824 0 0 907308 1009947 211462 242965 31 2 67 0 0
第一次的值是当前的系统值,第二次的值是 10 s 内的平均值。
字段说明:
Procs
- r:表示运行和等待 CPU 时间片的进程数。
- b:表示等待资源的进程数。如 I/O 进程。
说明
每个 CPU 核有一个运行时队列,在 CPU 为进程提供服务时,进程需要首先进入运行时队列等待 CPU 分配 CPU 时间。运行队列里包括:runnable process 和 blocked process。
Memory
- swpd:切换到 swap 的内存数量,单位 KB。
- free:空闲物理内存。
- buff:缓存的内存。一般块设备的读写缓存。
- cache:内存缓存,频繁访问的文件会被 cached,如果 cached 值较大,说明 cached 的数量多,对于磁盘访问会相对较少。文件系统效率提高。
- inact:非活跃内存大小,带 -a 可选项时显示。
- active:活跃内存大小,带 -a 可选项时显示。
Swap
- si: 从磁盘调入内存,内存进入内存交换区的数量。
- so: 从内存调入磁盘,内存交换区进入内存的数据。
如果这两项都大于 0,需要关注,表示系统内存不足。
io
- bi:每秒读磁盘块的速度。
- bo:每秒写磁盘块的速度。
跟进磁盘的指标,并参考 I/O 等待占用 CPU 时间百分比评估系统 IO 性能瓶颈。
System
- in: 每秒中断数。
- cs: 每秒上下文切换次数。
这两个值越大,说明内存消耗 CPU 的时间越多,正常情况下上下文切换的次数应该小于时钟中断的次数, 如果发现上下文切换次数比时钟中断次数多,这种负载可能是由系统需要处理很多 I/O 或者长时间高强度系统调用引起。
CPU
- us:用户进程 CPU 时间消耗百分比。
- sy:内核进程 CPU 消耗百分比。
- id:空闲 CPU 百分比。
- wa:I/O 等待占用 CPU 时间百分比。
- st:虚拟机占用时间。




