Linux -- profile

OProfile manual:

http://oprofile.sourceforge.net/doc/index.html

 

 

内核版本2.6.18-RC7
profile只是内核的一个调试性能的工具,这个可以通过menuconfig中的Instrumentation Support->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=? 可以获得每个函数执行次数,用来调试函数性能很有用
如果设置成profile=schedule ?可以获得每个函数调用schedule的次数,用来调试schedule很有用

profile的实现:
在内核中创建一个/proc/profile接口,在系统启动时用profile_init()分配好存放profile信息的内存,每条指令都有一个计数器。
如果设置的是profile=? 统计每条指令执行的次数。在时钟中断中调用        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, 可以看看driver/oprofile的实现。

 

 

引自 :http://www.linuxdiyf.com/bbs//thread-71446-1-1.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值