原創文章,轉載請註明: 轉載自Erlang非業餘研究
本文鏈接地址: 調查用戶空間程序某函數最常調用路徑
在做系統調優或者調查性能問題的的時候,比如說調查一個鎖的性能問題。 這把鎖的代碼會有很多路徑會調用, 我們可以在鎖的地方設個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
|
--------------------------------------------------------------
|
... |
哈效果不錯哦!
祝玩的開心。