假设我正在用户空间中执行程序,并且该程序中有一个功能。现在我想知道执行该函数所花费的cpu时间。
到现在为止我弄明白了什么?
在启动该程序时,我将获得该进程的PID,我将传递给内核模块并获取该进程的task_struct。之后在thread_info中我们可以得到指令指针和堆栈指针。
从用户空间我们可以给该内核模块提供该函数的起始和结束偏移量,然后在内核中我们可以在指令指针的帮助下检查这两个函数来获取执行时间。无论如何要做到这一点,还是有另一种方法来实现目标。
请不要指定一些预先退出的工具。我想通过为此编写内核模块来自己完成。
答案 0 :(得分:0)
已经存在名为SystemTap的工具。它可以即时生成模块。
在用户空间中,您可以使用:
stap -ve ' global start;
probe process("/usr/bin/python2.7").function("builtin_range")
{ start = local_clock_us(); }
probe process("/usr/bin/python2.7").function("builtin_range").return
{ printf("range(%d, %d, %d) took %d us\n",
user_int(&$ilow), user_int(&$ihigh),
user_int(&$istep), local_clock_us() - start); }'
它将测量Python 2 range()
内置的挂起时间。假设它不会睡觉,挂起时间将匹配 cpu time 。
内核函数可以用相同的方式跟踪:
stap -ve ' global start;
probe kernel.function("__schedule")
{ start[cpu()] = local_clock_us(); }
probe kernel.function("__schedule").return
{ printf("schedule() on CPU %d took %d us\n", cpu(),
local_clock_us() - start[cpu()]); }'