profile使用:
profile功能是架构无关的,可以用来监视linux内核的4项功能,即:
11 #define CPU_PROFILING 1
12 #define SCHED_PROFILING 2
13 #define SLEEP_PROFILING 3
14 #define KVM_PROFILING 4
要想找开profile功能,除了要在menuconfig中打开支持选项外,还要在命令行加上profile=**,##.
**表示上述4种功能之一,##表示一个数字,用来表示监视的颗粒度,越小越细。
当做了这些工作之后还需要用到util linux工具中的readprofile来读取结果,结果是从/proc/profile文件中读取的,此工具做了格式化处理。以下为转载:
1. 如何使用profile:
首先确认内核支持profile,然后在内核启动时加入以下参数:profile=1或者其它参数, 新的内核支持profile=schedule,1
2. 内核启动后会创建/proc/profile文件,这个文件可以通过readprofile读取,
如readprofile -m /proc/kallsyms | sort -nr > ~/cur_profile.log,
或者readprofile -r -m /proc/kallsyms |sort -nr,
或者readprofile -r && sleep 1 && readprofile -m /proc/kallsyms |sort -nr >~/cur_profile.log
3. 读取/proc/profile可获得哪些内容?
根据启动配置profile=?的不同,获取的内容不同:
如果设置成profile=schedule可以获得每个函数调用schedule的次数,用来调试schedule很有用
profile的实现:
在内核中创建一个/proc/profile接口,在系统启动时用profile_init()分配好存放profile信息的内存,每条指令都有一个计数器。
如果设置的是profile=2 统计每条指令执行的次数。在时钟中断中调用 profile_tick(CPU_PROFILING,
regs),将当前指令regs->eip的计数值+1。这个统计有点不准,因为一个jiffies之间,可能执行很多函数,而统计的只是恰好发生
时钟中断时的那个函数。但取样点多了,这些信息还是能说明问题。
如果设置的是profile=schedule 统计每个指令调用schedule()的次数,在schedule()中调用profile_hit(SCHED_PROFILING, __builtin_return_address(0));
其实真正调用schedule的指令只有有限的几个,但这些信息可以获得调度点的精确信息。
profile_hit()的作用是将当前指令的计数值加1
profile_tick()是在每个时钟tick的时候将响应的指令计数值加1
time_hook 一般被其它profile工具,如oprofile用来在每次中断发生时,添加自己的处理函数。
profile信息其实包括任务的所有统计信息,所以可以用profile_event_register()在任务退出或者用户空间内存释放时,挂载自己的回调函数,以统计这些信息。
profile信息的统计在smp和up下不同,即profile_hit的实现不同,smp的实现中有一个PerCPU cache,这可避免多个CPU在profile统计时效率低下问题。具体可以察看源代码kernel/profile.c
oprofile使用:
oprofile平台相关工具,请注意自己平台支持的event.