简介
perf_event 是内核对用户态提供软硬件性能数据的一个统一的接口,用户通过 perf_event 的句柄操作能获取到各式各样的性能数据,本文将介绍如何通过用户态实现对内核 perf_event 功能的使用
API 介绍
int perf_event_open(struct perf_event_attr *attr,
pid_t pid, int cpu, int group_fd,
unsigned long flags);
用于打开特定的 perf 事件
参数 attr 指定 事件类型以及参数 (attr.type attr.config)
参数 pid 指定 被监控的进程 或者 cgroup
参数 cpu 指定 cpu id
参数 group_fd 指定 perf 事件组
参数 flags man perf_event_open
man perf_event_open 去发现更多
对创建的 event 句柄控制
主要是通过 ioc 和 prctl
ioc(fd, PERF_EVENT_IOC_DISABLE, 0) # 暂停该事件的监控
ioc(fd, PERF_EVENT_IOC_RESET, 0) # 重置计数器
完整用例
# 创建 event 属性
cycle_perf_event_attr = pyperf.perf_event_attr()
cycle_perf_event_attr.type = pyperf.PERF_TYPE_HARDWARE # 通用 CPU 事件类型
cycle_perf_event_attr.config = pyperf.PERF_COUNT_HW_CPU_CYCLES # 记录 CPU cycle
cycle_perf_event_attr.inherit = 1
# 其他参数
cpu = -1 # 所有cpu
pid = 0 # 监控本进程
# 打开事件
fd = pyperf.perf_event_open(cycle_perf_event_attr, pid, cpu, -1, flag)
time.sleep(1)
ret = os.read(fd, 8) # 所有字段均为 64 bit
value = struct.unpack("L", ret)[0]
注意事项
- counter 是每次累加,需要用户态自己算偏移量
- 注意事件类型 core, uncore, offcore
- 注意潜在可能产生的 multiplexing 情况
其他
PERF_EVENT 系列文章