off time cpu profile原理(bcc/tools/offcputime.py)

本文介绍了如何利用BCC工具中的offcputime.py来分析程序放弃CPU的情况,以查找吞吐量和响应性能不佳的原因。通过kprobe拦截finish_task_switch,记录线程调度信息并计算等待时间,从而生成有助于优化的分析数据。虽然BCC的栈追踪功能有限,但此方法提供了一个理解off-CPU时间的基础。

        常见的profile都on cpu的,也即是程序在CPU上运行时候的情况,例如基于运行时的栈采样输出火焰图。还有一种profile概念,与上述的概念正好相反,记录的是放弃CPU的情况,它的用处一般是拿来查程序为啥吞吐,响应表现不佳,通过off cpu的数据可以定位程序都是什么原因放弃了CPU。

         要拿到on cpu的数据可能方式很多,但是要拿到off cpu的情况就需要从调度着手了,bcc提供了实现off cpu profile的工具,地址:https://github.com/iovisor/bcc/blob/master/tools/offcputime.py

简单看一下其实现原理:

struct key_t {
    u32 pid;
    u32 tgid;
    int user_stack_id;
    int kernel_stack_id;
    char name[TASK_COMM_LEN];
};
BPF_HASH(counts, struct key_t);
BPF_HASH(start, u32);
BPF_STACK_TRACE(stack_traces, STACK_STORAGE_SIZE);

struct warn_event_t {
    u32 pid;
    u32 tgid;
    u32 t_start;
    u32 t_end;
};
BPF_PERF_OUTPUT(warn_events);

int oncpu(struct pt_regs *ctx, struct task_struct *prev) {
    u32 pid = prev->pid;
    u32 tgid = prev->tgid;
    u64 ts, *tsp;

    // record previous threa
你遇到的错误是因为 **BCC 工具依赖的内核头文件(kernel headers)未正确安装或未启用 `CONFIG_IKHEADERS` 模块**。这类工具(如 `tcpdrop.py`)需要访问当前运行内核的源码头文件,以便编译 eBPF 程序。 --- ### 🔍 错误分析: 1. **`Module kheaders not found`** ``` modprobe: FATAL: Module kheaders not found in directory /lib/modules/6.6.0-72.0.0.76.oe2403sp1.x86_64 ``` - 表示系统中未安装或未启用 `kheaders` 内核模块。 2. **`Unable to find kernel headers`** - BCC 找不到当前运行内核的头文件,无法编译 eBPF 程序。 3. **`chdir(/lib/modules/.../build): No such file or directory`** - 表示 `/lib/modules/<kernel-version>/build` 路径不存在,通常是由于没有安装内核开发包。 --- ### ✅ 解决方法: #### ✅ 方法一:安装内核开发包(推荐) 根据你的系统版本,安装对应的内核头文件和开发包: ```bash # 安装内核头文件(以你的内核版本为例) sudo apt install linux-headers-$(uname -r) # 或者对于基于 RPM 的系统(如 CentOS、openEuler): sudo yum install kernel-devel-$(uname -r) ``` #### ✅ 方法二:启用 `CONFIG_IKHEADERS` 并重新编译内核(适用于定制内核) 如果你使用的是自定义编译的内核,确保在编译时启用: ``` CONFIG_IKHEADERS=m ``` 然后重新编译并安装模块。 #### ✅ 方法三:设置 `BPF_ENVIRON` 环境变量(调试用) 你可以临时设置环境变量跳过内核头检查(仅用于测试): ```bash export BPF_ENVIRON=1 ./tcpdrop.py ``` ⚠️ 注意:这可能导致某些功能无法正常使用。 --- ### ✅ 验证是否安装成功: 安装完成后,运行以下命令验证 `/lib/modules/$(uname -r)/build` 是否存在: ```bash ls /lib/modules/$(uname -r)/build/include/linux/version.h ``` 如果存在,说明内核头文件已正确安装。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值