Linux内核 eBPF基础:perf(3)用户态指令分析

Linux内核 eBPF基础
perf基础(3)用户态指令分析


荣涛
2021年5月19日

1. strace perf stat分析

执行strace perf stat ls可以得到如下输出:

execve("/usr/bin/perf", ["perf", "stat", "ls"], [/* 65 vars */]) = 0
[...]

open("/sys/bus/event_source/devices/cpu/format/pc", O_RDONLY) = 5
read(5, "config:19\n", 8192)            = 10
close(5)                                = 0

[按照上面形式获取以下信息]

/sys/bus/event_source/devices/cpu/format/any 	config:21
/sys/bus/event_source/devices/cpu/format/cmask 	config:24-31
/sys/bus/event_source/devices/cpu/format/edge 	config:18
/sys/bus/event_source/devices/cpu/format/event 	config:0-7
/sys/bus/event_source/devices/cpu/format/frontend 	config1:0-23
/sys/bus/event_source/devices/cpu/format/in_tx 	config:32
/sys/bus/event_source/devices/cpu/format/in_tx_cp 	config:33
/sys/bus/event_source/devices/cpu/format/inv 	config:23
/sys/bus/event_source/devices/cpu/format/ldlat 	config1:0-15
/sys/bus/event_source/devices/cpu/format/offcore_rsp 	config1:0-63
/sys/bus/event_source/devices/cpu/format/pc 	config:19
/sys/bus/event_source/devices/cpu/format/umask 	config:8-15

/sys/bus/event_source/devices/cpu/events/branch-instructions 	event=0xc4
/sys/bus/event_source/devices/cpu/events/branch-misses 	event=0xc5
/sys/bus/event_source/devices/cpu/events/bus-cycles 	event=0x3c,umask=0x01
/sys/bus/event_source/devices/cpu/events/cache-misses 	event=0x2e,umask=0x41
/sys/bus/event_source/devices/cpu/events/cache-references 	event=0x2e,umask=0x4f
/sys/bus/event_source/devices/cpu/events/cpu-cycles 	event=0x3c
/sys/bus/event_source/devices/cpu/events/cycles-ct 	event=0x3c,in_tx=1,in_tx_cp=1
/sys/bus/event_source/devices/cpu/events/cycles-t 	event=0x3c,in_tx=1
/sys/bus/event_source/devices/cpu/events/el-abort 	event=0xc8,umask=0x4
/sys/bus/event_source/devices/cpu/events/el-capacity 	event=0x54,umask=0x2
/sys/bus/event_source/devices/cpu/events/el-commit 	event=0xc8,umask=0x2
/sys/bus/event_source/devices/cpu/events/el-conflict 	event=0x54,umask=0x1
/sys/bus/event_source/devices/cpu/events/el-start 	event=0xc8,umask=0x1
/sys/bus/event_source/devices/cpu/events/instructions 	event=0xc0
/sys/bus/event_source/devices/cpu/events/ref-cycles 	event=0x00,umask=0x03
/sys/bus/event_source/devices/cpu/events/tx-abort 	event=0xc9,umask=0x4
/sys/bus/event_source/devices/cpu/events/tx-capacity 	event=0x54,umask=0x2
/sys/bus/event_source/devices/cpu/events/tx-commit 	event=0xc9,umask=0x2
/sys/bus/event_source/devices/cpu/events/tx-conflict 	event=0x54,umask=0x1
/sys/bus/event_source/devices/cpu/events/tx-start 	event=0xc9,umask=0x1

/sys/bus/event_source/devices/cpu/type    4

/sys/bus/event_source/devices/msr/format/event    config:0-63

/sys/bus/event_source/devices/msr/events/smi 	event=0x04
/sys/bus/event_source/devices/msr/events/tsc 	event=0x00
/sys/bus/event_source/devices/msr/events/pperf 	event=0x03

/sys/bus/event_source/devices/msr/type    8


/sys/bus/event_source/devices/software/type 	1
/sys/bus/event_source/devices/software/uevent


/sys/bus/event_source/devices/power/format/event 	config:0-7

/sys/bus/event_source/devices/power/events/energy-cores 	event=0x01
/sys/bus/event_source/devices/power/events/energy-cores.scale 	2.3283064365386962890625e-10
/sys/bus/event_source/devices/power/events/energy-cores.unit 	Joules
/sys/bus/event_source/devices/power/events/energy-pkg 	event=0x02
/sys/bus/event_source/devices/power/events/energy-pkg.scale 	2.3283064365386962890625e-10
/sys/bus/event_source/devices/power/events/energy-pkg.unit 	Joules
/sys/bus/event_source/devices/power/events/energy-ram 	event=0x03
/sys/bus/event_source/devices/power/events/energy-ram.scale 	2.3283064365386962890625e-10
/sys/bus/event_source/devices/power/events/energy-ram.unit 	Joules


/sys/bus/event_source/devices/power/type    9
/sys/bus/event_source/devices/power/cpumask    0-3

/sys/bus/event_source/devices/tracepoint/type    2

/sys/bus/event_source/devices/kprobe/format/retprobe    config:0
/sys/bus/event_source/devices/kprobe/type    6

/sys/bus/event_source/devices/uprobe/format/retprobe    config:0
/sys/bus/event_source/devices/uprobe/type    7

/sys/bus/event_source/devices/breakpoint/type    5


perf_event_open(0x3b33988, 253222, -1, -1, PERF_FLAG_FD_CLOEXEC) = 3
perf_event_open(0x3b33b08, 253222, -1, -1, PERF_FLAG_FD_CLOEXEC) = -1 EACCES (Permission denied)
open("/proc/sys/kernel/perf_event_paranoid", O_RDONLY) = 4
read(4, "2\n", 64)                      = 2
close(4)                                = 0

[perf_event_open 了 3-11文件描述符]

[perf stat command 的 command输出]

read(3, "\276\332\22\0\0\0\0\0\276\332\22\0\0\0\0\0\276\332\22\0\0\0\0\0", 24) = 24
read(4, "\0\0\0\0\0\0\0\0\276\332\22\0\0\0\0\0\276\332\22\0\0\0\0\0", 24) = 24
read(5, "\0\0\0\0\0\0\0\0\276\332\22\0\0\0\0\0\276\332\22\0\0\0\0\0", 24) = 24
read(7, "!\1\0\0\0\0\0\0\276\332\22\0\0\0\0\0\276\332\22\0\0\0\0\0", 24) = 24
read(8, "\313\215\20\0\0\0\0\0\374\30\23\0\0\0\0\0\374\30\23\0\0\0\0\0", 24) = 24
read(9, "k\7\n\0\0\0\0\0\374\30\23\0\0\0\0\0\374\30\23\0\0\0\0\0", 24) = 24
read(10, "Y\22\2\0\0\0\0\0\374\30\23\0\0\0\0\0\374\30\23\0\0\0\0\0", 24) = 24
read(11, "8\34\0\0\0\0\0\0\374\30\23\0\0\0\0\0\374\30\23\0\0\0\0\0", 24) = 24
close(11)                               = 0
close(10)                               = 0
close(9)                                = 0
close(8)                                = 0
close(7)                                = 0
close(5)                                = 0
close(4)                                = 0
close(3)                                = 0

write(2, " Performance counter stats for ", 31 Performance counter stats for ) = 31

[perf 的打印...]

+++ exited with 0 +++

2. perf_event_open系统调用

#include <linux/perf_event.h>
#include <linux/hw_breakpoint.h>

int perf_event_open(struct perf_event_attr *attr,
                   pid_t pid, int cpu, int group_fd,
                   unsigned long flags);

3. /sys/bus/event_source/devices/文件系统

# pwd
/sys/bus/event_source/devices
# tree
.
├── breakpoint -> ../../../devices/breakpoint
├── cpu -> ../../../devices/cpu
├── kprobe -> ../../../devices/kprobe
├── msr -> ../../../devices/msr
├── power -> ../../../devices/power
├── software -> ../../../devices/software
├── tracepoint -> ../../../devices/tracepoint
└── uprobe -> ../../../devices/uprobe

他们的类型为:

/*
 * attr.type
 */
enum perf_type_id { /* perf 类型 */
	PERF_TYPE_HARDWARE			= 0,    /* 硬件 */
	PERF_TYPE_SOFTWARE			= 1,    /* 软件 */
	PERF_TYPE_TRACEPOINT		= 2,    /* 跟踪点 /sys/bus/event_source/devices/tracepoint/type */
	PERF_TYPE_HW_CACHE			= 3,    /* 硬件cache */
	PERF_TYPE_RAW				= 4,    /* RAW/CPU /sys/bus/event_source/devices/cpu/type */
	PERF_TYPE_BREAKPOINT		= 5,    /* 断点 /sys/bus/event_source/devices/breakpoint/type */

	PERF_TYPE_MAX,				/* non-ABI */
};

有些为注册时填入,有些则为初始化阶段生成。

4. 相关链接

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值