You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

perf_event_open采样时如何统计子进程?PERF_FORMAT_GROUP相关疑问

我来帮你拆解这两个关于perf_event_open的问题,都是实际使用中容易混淆的点:

1. 开启PERF_FORMAT_GROUP时统计子进程的方法

实际上PERF_FORMAT_GROUP和子进程继承(inherit)属性完全可以同时使用,你只需要注意以下几点就能统计到子进程(比如C代码中调用的shell命令)的执行数据:

  • 创建事件组的leader(主事件)时,在struct perf_event_attr结构体中设置inherit = 1。根据内核文档,事件组的inherit属性由leader决定,组内所有子事件都会自动继承这个设置,你不需要给每个子事件单独配置inherit。
  • 如果希望子进程退出后,它的统计数据能合并到父进程的事件计数中,或者在子进程退出时生成独立的样本记录,可以额外设置inherit_stat = 1。这个参数会让子进程的计数被汇总,或者单独保留,具体取决于你采样的配置。

给你一个简化的代码示例,展示如何创建带inherit属性的事件组:

// 初始化leader事件的属性
struct perf_event_attr leader_attr = {0};
leader_attr.type = PERF_TYPE_HARDWARE;
leader_attr.config = PERF_COUNT_HW_INSTRUCTIONS;
leader_attr.size = sizeof(struct perf_event_attr);
leader_attr.inherit = 1; // 开启子进程继承
leader_attr.read_format = PERF_FORMAT_GROUP | PERF_FORMAT_ID;

// 创建leader事件,作为组的主事件
int leader_fd = perf_event_open(&leader_attr, 0, -1, -1, 0);
if (leader_fd == -1) {
    perror("Failed to create leader event");
    exit(EXIT_FAILURE);
}

// 初始化子事件的属性(不需要设置inherit)
struct perf_event_attr child_attr = {0};
child_attr.type = PERF_TYPE_HARDWARE;
child_attr.config = PERF_COUNT_HW_CPU_CYCLES;
child_attr.size = sizeof(struct perf_event_attr);
child_attr.read_format = PERF_FORMAT_GROUP | PERF_FORMAT_ID;

// 将子事件加入leader的事件组
int child_fd = perf_event_open(&child_attr, 0, -1, leader_fd, 0);
if (child_fd == -1) {
    perror("Failed to add child event to group");
    exit(EXIT_FAILURE);
}

这样配置后,父进程以及它通过fork/exec启动的shell命令(子进程)的相关事件都会被这个组统计到。

2. 未指定PERF_FORMAT_GROUP时的样本记录格式

当你不使用PERF_FORMAT_GROUP时,每个事件都是完全独立的,样本记录的行为如下:

  • 每个事件会单独生成样本记录:比如你同时打开了指令计数和CPU周期计数两个独立事件,它们的样本是分开产生的,不会合并成一条记录。
  • 每条样本记录的格式由你设置的其他PERF_FORMAT_*标志决定(比如PERF_FORMAT_TOTAL_TIME_ENABLED、PERF_FORMAT_ID等),每条记录只包含对应单个事件的统计数据,而不是多个事件的集合。
  • 你需要分别从每个事件的文件描述符读取数据,每个read()调用只会返回对应单个事件的struct read_format(如果配置了格式标志)或者原始计数。

内容的提问来源于stack exchange,提问作者user3527764

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:31:13