有时候在看系统代码的时候,我们很难从源码中看出我们感兴趣的函数是如何被调用的,因为调用路径有可能太多。用户空间的程序gdb设断点是个好的方法,内核的就麻烦了。这时候systemtap可以帮忙, 比如:
Read more…
在做系统调优或者调查性能问题的的时候,比如说调查一个锁的性能问题。 这把锁的代码会有很多路径会调用, 我们可以在锁的地方设个probe点,但是我们无法知道那个路径是最经常调用的。 所以我就写了个stap脚本来解决这个问题,代码在RHEL 5.4/6下都调试没有问题的。
$ cat > dig.stp
global stacks_count
probe process(@1).function(@2)
{
stacks_count[ubacktrace()]++;
}
function sprint_stackx(stack)
{
addr = tokenize(stack, " ");
while(addr != "")
{
fun= symname(strtol(addr, 16));
s = fun . "->" . s;
addr = tokenize("", " ");
}
return s;
}
function print_top_stack () {
printf ("%50s %10s\n", "STACK", "COUNT")
foreach (stack in stacks_count- limit 20) {
printf("%50s %10d\n", sprint_stackx(stack), stacks_count[stack])
}
delete stacks_count
}
probe timer.s(5) {
print_top_stack ()
printf("--------------------------------------------------------------\n")
}
CTRL+D
#我们用nmon这个程序来试验下吧
#脚本的使用方法是: stap dig.stp prog funcs
#注意这个程序需要-g编译, 才能有符号信息
#在另外一个控制台下运行nmon, 打开磁盘,CPU监控等。
$nmon
$ sudo stap dig.stp nmon proc_*
STACK COUNT
main->proc_read-> 2
main->proc_cpu-> 2
main->proc_read-> 2
main->proc_mem-> 2
main->proc_mem->proc_mem_search-> 2
main->proc_mem->proc_mem_search-> 2
main->proc_mem->proc_mem_search-> 2
main->proc_mem->proc_mem_search-> 2
main->proc_mem->proc_mem_search-> 2
main->proc_mem->proc_mem_search-> 2
main->proc_mem->proc_mem_search-> 2
main->proc_mem->proc_mem_search-> 2
main->proc_mem->proc_mem_search-> 2
main->proc_mem->proc_mem_search-> 2
main->proc_mem->proc_mem_search-> 2
main->proc_mem->proc_mem_search-> 2
main->proc_mem->proc_mem_search-> 2
main->proc_mem->proc_mem_search-> 2
main->proc_mem->proc_mem_search-> 2
main->proc_mem->proc_mem_search-> 2
--------------------------------------------------------------
...
哈效果不错哦!
祝玩的开心。
Recent Comments