常见的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;