在内核中调用 times() space
Calling times() in kernel space
我正在开发内核模块,我需要获得某个进程消耗的 CPU 时间的近似值(迭代进程不是问题)。具体来说,我想要 libc clock
or the times
syscall. I tried calling do_sys_times
提供的相同行为,但似乎没有导出(编译时未定义符号)。
有没有办法在内核模块中调用 times
?还有其他选择吗?
如果你想精确测量内核中某些事件(如上下文切换)之间的时间,你需要一些跟踪器,如 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 during.
我正在开发内核模块,我需要获得某个进程消耗的 CPU 时间的近似值(迭代进程不是问题)。具体来说,我想要 libc clock
or the times
syscall. I tried calling do_sys_times
提供的相同行为,但似乎没有导出(编译时未定义符号)。
有没有办法在内核模块中调用 times
?还有其他选择吗?
如果你想精确测量内核中某些事件(如上下文切换)之间的时间,你需要一些跟踪器,如 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 during.