专栏
天翼云开发者社区

perf工具使用笔记(一)

2023-04-28 16:07:39 45阅读

perf list

使用perf list可以列出当前系统上perf所支持的所有事件,这些事件可以用于perf stat或者perf record的事件源,如:
perf stat -e XXX
perf record -e XXX

 

perf stat

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

 

perf record

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个),因此如果添加的硬件断点超过这个数目,将会报错。

 

perf report

1. 对记录的事件进行报告
perf report


2. 对记录的事件进行报告,并显示对应采样点的采样总数
perf report -n


3. 以文本形式直接输出到终端
perf report --stdio


4. 以文本形式直接输出到终端,并显示对应采样点的采样总数以及函数调用栈,调用栈以折叠形式单行输出
perf report --stdio -n -g folded

  • 0
  • 0
  • 0
0 评论
0/1000
评论(0) 发表评论
吴****楷

吴****楷

3 篇文章 1 粉丝
关注

perf工具使用笔记(一)

2023-04-28 16:07:39 45阅读

perf list

使用perf list可以列出当前系统上perf所支持的所有事件,这些事件可以用于perf stat或者perf record的事件源,如:
perf stat -e XXX
perf record -e XXX

 

perf stat

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

 

perf record

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个),因此如果添加的硬件断点超过这个数目,将会报错。

 

perf report

1. 对记录的事件进行报告
perf report


2. 对记录的事件进行报告,并显示对应采样点的采样总数
perf report -n


3. 以文本形式直接输出到终端
perf report --stdio


4. 以文本形式直接输出到终端,并显示对应采样点的采样总数以及函数调用栈,调用栈以折叠形式单行输出
perf report --stdio -n -g folded

文章来自专栏

Linux内核

3 篇文章 1 订阅
0 评论
0/1000
评论(0) 发表评论
  • 0
    点赞
  • 0
    收藏
  • 0
    评论