【问题标题】:Calling times() in kernel space在内核空间调用 times()
【发布时间】:2015-06-12 17:44:04
【问题描述】:

我正在开发一个内核模块,我需要获取某个进程消耗的 CPU 时间的近似值(迭代进程不是问题)。具体来说,我希望 libc clocktimes 系统调用提供相同的行为。我尝试调用do_sys_times,但似乎没有导出(编译时未定义符号)。

有没有办法在内核模块中调用times?还有其他选择吗?

【问题讨论】:

  • 不是重复的。我想要经过的每个进程的 CPU 时钟滴答声(见 man 2 次)。您链接到的帖子要求以秒为单位的挂钟时间。
  • 啊,我想我现在明白了。也许您可以尝试从 /proc 中的某个位置读取此信息作为快速破解(假设您可以从内核模块内部访问文件)。
  • 内核模块通常不关心进程。为什么不能从用户空间调用times()?您要解决的实际问题是什么?
  • 我无法控制流程。该模块需要监控任意进程在离开调度程序时消耗的滴答声。

标签: linux-kernel posix kernel-module system-calls


【解决方案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-&gt;comm == "myprocessname") 和离开CPU (prev-&gt;comm == "myprocessname") 的时间差。该差异是进程在 CPU 上花费的最后一个时间段。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-29
    • 2017-12-10
    • 2012-06-21
    • 2015-06-26
    相关资源
    最近更新 更多