我正在开发一个内核模块,我需要获得某个进程消耗的CPU时间的近似值(迭代进程不是问题)。具体来说,我想要libc clock
或times
系统调用提供的相同行为。我试着调用do_sys_times
,但似乎没有导出(编译时未定义的符号)。
有没有办法在内核模块中调用times
?还有其他选择吗?
答案 0 :(得分:1)
如果要在内核中的某些事件之间精确测量时间(如上下文切换),则需要一些跟踪器,如SystemTap。从内核模块,您可以通过各种跟踪和分析子系统直接绑定探测器,如ftrace,perf或kprobes。
这是一个在切换上下文时将消息转储到内核日志的示例:
#include <linux/sched.h>
#include <linux/module.h>
#include <linux/printk.h>
#include <linux/tracepoint.h>
#include <trace/events/sched.h>
...
void my_sched_switch_probe(void* ignore, struct task_struct* prev, struct task_struct* next) {
printk("my_sched_switch_probe: %s -> %s at %lu\n", prev->comm, next->comm,
(unsigned long) sched_clock());
}
int cswtracer_init(void) {
register_trace_sched_switch(my_sched_switch_probe, NULL);
return 0;
}
void cswtracer_fini(void) {
unregister_trace_sched_switch(my_sched_switch_probe, NULL);
}
module_init(cswtracer_init);
module_exit(cswtracer_fini);
注意:不要运行它,它会大大减慢你的系统。
因此,分析my_sched_switch_probe()
中的进程名称,并计算进程进入CPU(next->comm == "myprocessname"
)的时间与离开CPU(prev->comm == "myprocessname"
时)之间的差异。这个差异是在上一段时间内在CPU上花费的时间。