2023-04-28 16:07:39 45阅读
使用perf list可以列出当前系统上perf所支持的所有事件,这些事件可以用于perf stat或者perf record的事件源,如:
perf stat -e XXX
perf record -e XXX
perf stat可以统计事件或者PMC计数器的发生次数
1. 列出执行command命令时的Performance counter stats统计情况
perf stat command
2. 列出执行command命令时的Performance counter stats统计情况,输出更详细的信息
perf stat -d command
3. 列出所有CPU上的Performance counter stats统计情况,跟踪5秒后停止
perf stat -a sleep 5
4. 列出所有CPU上的cycles,instructions,cache-references,cache-misses,bus-cycles事件的统计情况,跟踪10秒后停止
perf stat -e cycles,instructions,cache-references,cache-misses,bus-cycles -a sleep 10
5. 列出执行command命令时的L1-dcache-loads,L1-dcache-load-misses,L1-dcache-stores事件的统计情况
perf stat -e L1-dcache-loads,L1-dcache-load-misses,L1-dcache-stores command
6. 列出所有CPU上的003c号事件(CPU_CLK_UNHALTED)的统计情况
perf stat -e r003c -a sleep 5
7. 列出所有CPU上cycles事件以及对应event=0x0e,umask=0x01,inv,cmask=0x01事件(frontend stalls)的统计情况
perf stat -e cycles -e cpu/event=0x0e,umask=0x01,inv,cmask=0x01/ -a sleep 5
8. 列出所有CPU上系统调用的执行总次数,每1000ms打印一次
perf stat -e raw_syscalls:sys_enter -I 1000 -a
9. 列出进程号为PID的进程执行的系统调用的统计情况
perf stat -e 'syscalls:sys_enter_*' -p PID
10. 列出进程号为PID的进程执行的所有调度事件的统计情况
perf stat -e 'sched:*' -p PID
1. 以99Hz的采样评率,记录执行command命令时的CPU运行函数的情况
perf record -F 99 command
2. 以99Hz的采样评率,记录进程号为PID的进程的CPU运行函数的情况
perf record -F 99 -p PID
3. 以99Hz的采样评率,记录进程号为PID的进程的CPU运行函数调用栈的情况(调用栈通过frame pointers回溯)
perf record -F 99 -p PID -g -- sleep 10
4. 以99Hz的采样评率,记录进程号为PID的进程的CPU运行函数调用栈的情况(调用栈通过dwarf回溯)
perf record -F 99 -p PID --call-graph dwarf sleep 10
注:
1. perf record如果没指明事件,默认是通过采集cpu-clock事件进行采样的,因此
perf record -F 99 -ag -- sleep 10
与
perf record -F 99 -e cpu-clock -ag -- sleep 10
这两个命令是等效的。
perf report的时候,在开头会显示采样的事件,比如上述命令将看到类似下面的输出:
# Samples: 807 of event 'cpu-clock'
2. 调用栈可以通过frame pointers、dwarf和lbr(last branch record)这3种方式进行回溯,具体可以通过perf record --call-graph查看帮助。
5. 仅对指定的cgroup进行采样
perf record -F 99 -e cpu-clock --cgroup=docker/1d567f4393190204...... -a -- sleep 10
6. 每10000次L1-dcache-load-misses事件发生采样一次所有CPU上的函数调用栈,采样5秒后停止
perf record -e L1-dcache-load-misses -c 10000 -ag -- sleep 5
7. 当CPU cycles事件发生时,对所有CPU上的内核态函数进行记录,持续5秒。借此可以看出这段事件内内核函数的执行情况。
perf record -e cycles:k -a -- sleep 5
8. 当CPU cycles事件发生时,对所有CPU上的用户态函数进行记录,持续5秒。借此可以看出这段事件内用户函数的执行情况。
perf record -e cycles:u -a -- sleep 5
9. 当CPU cycles事件发生时,对所有CPU上的用户态函数进行记录,提高指令地址的精度,持续5秒。借此可以看出这段事件内用户函数的执行情况。
perf record -e cycles:up -a -- sleep 5
注:
上述命令的p选项用于指定指令地址的精确度。p选项可以指定多次,指定的次数与精确度的关系如下:
0 - SAMPLE_IP can have arbitrary skid
1 - SAMPLE_IP must have constant skid
2 - SAMPLE_IP requested to have 0 skid
3 - SAMPLE_IP must have 0 skid, or uses randomization to avoid sample shadowing effects.
因此,下面命令指定了精度为3:
perf record -e cycles:uppp -a -- sleep 5
10. 对所有CPU上的sched_process_exec事件进行跟踪
perf record -e sched:sched_process_exec -a
11. 对所有CPU上的context-switches子类事件进行跟踪,并在跟踪开始前输出具体头信息
perf record -vv -e context-switches -a
12. 对所有CPU上的context-switches子类事件进行跟踪,记录函数调用栈,并记录采样点的时间戳
perf record -e context-switches -ag -T
注:
1. 记录的时间戳可以通过 perf script -F time、perf script -D 等命令来解析查看
2. 较新版本的内核不需要加 -T 选项就会默认记录时间戳
13. 对所有CPU上的sys_enter_accept*事件进行跟踪,记录函数调用栈
perf record -e syscalls:sys_enter_accept* -ag
14. 对block_rq_complete事件进行跟踪,过滤条件为nr_sector > 200
perf record -e block:block_rq_complete --filter 'nr_sector > 200'
15. 对block_rq_complete事件进行跟踪,过滤条件为所有同步写请求
perf record -e block:block_rq_complete --filter 'rwbs == "WS"'
16. 对block_rq_complete事件进行跟踪,过滤条件为所有写请求
perf record -e block:block_rq_complete --filter 'rwbs ~ "*W*"'
17. perf record 还可以添加内存硬件断点事件
例如,对内存[0x1000~1008)这个区间添加内存断点,跟踪对这个区间的内存读写操作,这里有8个地址,故而总共会添加8个断点:
perf record -e mem:0x1000/8:rw
注意:
由于系统可以同时运行的pmu数量有限(通常只有8个),因此如果添加的硬件断点超过这个数目,将会报错。
1. 对记录的事件进行报告
perf report
2. 对记录的事件进行报告,并显示对应采样点的采样总数
perf report -n
3. 以文本形式直接输出到终端
perf report --stdio
4. 以文本形式直接输出到终端,并显示对应采样点的采样总数以及函数调用栈,调用栈以折叠形式单行输出
perf report --stdio -n -g folded
2023-04-28 16:07:39 45阅读
使用perf list可以列出当前系统上perf所支持的所有事件,这些事件可以用于perf stat或者perf record的事件源,如:
perf stat -e XXX
perf record -e XXX
perf stat可以统计事件或者PMC计数器的发生次数
1. 列出执行command命令时的Performance counter stats统计情况
perf stat command
2. 列出执行command命令时的Performance counter stats统计情况,输出更详细的信息
perf stat -d command
3. 列出所有CPU上的Performance counter stats统计情况,跟踪5秒后停止
perf stat -a sleep 5
4. 列出所有CPU上的cycles,instructions,cache-references,cache-misses,bus-cycles事件的统计情况,跟踪10秒后停止
perf stat -e cycles,instructions,cache-references,cache-misses,bus-cycles -a sleep 10
5. 列出执行command命令时的L1-dcache-loads,L1-dcache-load-misses,L1-dcache-stores事件的统计情况
perf stat -e L1-dcache-loads,L1-dcache-load-misses,L1-dcache-stores command
6. 列出所有CPU上的003c号事件(CPU_CLK_UNHALTED)的统计情况
perf stat -e r003c -a sleep 5
7. 列出所有CPU上cycles事件以及对应event=0x0e,umask=0x01,inv,cmask=0x01事件(frontend stalls)的统计情况
perf stat -e cycles -e cpu/event=0x0e,umask=0x01,inv,cmask=0x01/ -a sleep 5
8. 列出所有CPU上系统调用的执行总次数,每1000ms打印一次
perf stat -e raw_syscalls:sys_enter -I 1000 -a
9. 列出进程号为PID的进程执行的系统调用的统计情况
perf stat -e 'syscalls:sys_enter_*' -p PID
10. 列出进程号为PID的进程执行的所有调度事件的统计情况
perf stat -e 'sched:*' -p PID
1. 以99Hz的采样评率,记录执行command命令时的CPU运行函数的情况
perf record -F 99 command
2. 以99Hz的采样评率,记录进程号为PID的进程的CPU运行函数的情况
perf record -F 99 -p PID
3. 以99Hz的采样评率,记录进程号为PID的进程的CPU运行函数调用栈的情况(调用栈通过frame pointers回溯)
perf record -F 99 -p PID -g -- sleep 10
4. 以99Hz的采样评率,记录进程号为PID的进程的CPU运行函数调用栈的情况(调用栈通过dwarf回溯)
perf record -F 99 -p PID --call-graph dwarf sleep 10
注:
1. perf record如果没指明事件,默认是通过采集cpu-clock事件进行采样的,因此
perf record -F 99 -ag -- sleep 10
与
perf record -F 99 -e cpu-clock -ag -- sleep 10
这两个命令是等效的。
perf report的时候,在开头会显示采样的事件,比如上述命令将看到类似下面的输出:
# Samples: 807 of event 'cpu-clock'
2. 调用栈可以通过frame pointers、dwarf和lbr(last branch record)这3种方式进行回溯,具体可以通过perf record --call-graph查看帮助。
5. 仅对指定的cgroup进行采样
perf record -F 99 -e cpu-clock --cgroup=docker/1d567f4393190204...... -a -- sleep 10
6. 每10000次L1-dcache-load-misses事件发生采样一次所有CPU上的函数调用栈,采样5秒后停止
perf record -e L1-dcache-load-misses -c 10000 -ag -- sleep 5
7. 当CPU cycles事件发生时,对所有CPU上的内核态函数进行记录,持续5秒。借此可以看出这段事件内内核函数的执行情况。
perf record -e cycles:k -a -- sleep 5
8. 当CPU cycles事件发生时,对所有CPU上的用户态函数进行记录,持续5秒。借此可以看出这段事件内用户函数的执行情况。
perf record -e cycles:u -a -- sleep 5
9. 当CPU cycles事件发生时,对所有CPU上的用户态函数进行记录,提高指令地址的精度,持续5秒。借此可以看出这段事件内用户函数的执行情况。
perf record -e cycles:up -a -- sleep 5
注:
上述命令的p选项用于指定指令地址的精确度。p选项可以指定多次,指定的次数与精确度的关系如下:
0 - SAMPLE_IP can have arbitrary skid
1 - SAMPLE_IP must have constant skid
2 - SAMPLE_IP requested to have 0 skid
3 - SAMPLE_IP must have 0 skid, or uses randomization to avoid sample shadowing effects.
因此,下面命令指定了精度为3:
perf record -e cycles:uppp -a -- sleep 5
10. 对所有CPU上的sched_process_exec事件进行跟踪
perf record -e sched:sched_process_exec -a
11. 对所有CPU上的context-switches子类事件进行跟踪,并在跟踪开始前输出具体头信息
perf record -vv -e context-switches -a
12. 对所有CPU上的context-switches子类事件进行跟踪,记录函数调用栈,并记录采样点的时间戳
perf record -e context-switches -ag -T
注:
1. 记录的时间戳可以通过 perf script -F time、perf script -D 等命令来解析查看
2. 较新版本的内核不需要加 -T 选项就会默认记录时间戳
13. 对所有CPU上的sys_enter_accept*事件进行跟踪,记录函数调用栈
perf record -e syscalls:sys_enter_accept* -ag
14. 对block_rq_complete事件进行跟踪,过滤条件为nr_sector > 200
perf record -e block:block_rq_complete --filter 'nr_sector > 200'
15. 对block_rq_complete事件进行跟踪,过滤条件为所有同步写请求
perf record -e block:block_rq_complete --filter 'rwbs == "WS"'
16. 对block_rq_complete事件进行跟踪,过滤条件为所有写请求
perf record -e block:block_rq_complete --filter 'rwbs ~ "*W*"'
17. perf record 还可以添加内存硬件断点事件
例如,对内存[0x1000~1008)这个区间添加内存断点,跟踪对这个区间的内存读写操作,这里有8个地址,故而总共会添加8个断点:
perf record -e mem:0x1000/8:rw
注意:
由于系统可以同时运行的pmu数量有限(通常只有8个),因此如果添加的硬件断点超过这个数目,将会报错。
1. 对记录的事件进行报告
perf report
2. 对记录的事件进行报告,并显示对应采样点的采样总数
perf report -n
3. 以文本形式直接输出到终端
perf report --stdio
4. 以文本形式直接输出到终端,并显示对应采样点的采样总数以及函数调用栈,调用栈以折叠形式单行输出
perf report --stdio -n -g folded