2015-05-21 109 views
1

我想使用systemtap來提取我的linux生產服務器的細節。我的SystemTap腳本systemtap全局變量分配失敗

global bt; 
global quit = 0 

probe begin { 
    printf("start profiling...\n") 
} 
probe timer.profile { 
    if (pid() == target()) { 
     if (!quit) 
     { 
      bt[backtrace(), ubacktrace()] <<< 1 
     } 
     else 
     { 

      foreach ([sys, usr] in bt- limit 1000) 
      { 
       print_stack(sys) 
       print_ustack(usr) 
       printf("\t%d\n", @count(bt[sys, usr])) 
      } 
      exit() 
     } 
    } 
} 

probe timer.s(20) { 
    quit = 1 
} 

當我開始使用命令

sudo stap --ldd -d $program_name --all-modules     \ 
    -D MAXMAPENTRIES=10240 -D MAXACTION=20000 -D MAXTRACE=40 \ 
    -D MAXSTRINGLEN=4096 -D MAXBACKTRACE=40 -x $program_pid  \ 
    profile.stp --vp 00001 > profile.out 

它失敗,並打印運行此腳本以下錯誤:

ERROR: error allocating hash 
ERROR: global variable 'bt' allocation failed 
WARNING: /usr/bin/staprun exited with status: 1 

我的生產服務器內存的信息是

   total  used  free  shared buffers  cached 
Mem:   16008  15639  368   0   80  3090 
-/+ buffers/cache:  12468  3539 

我認爲這是不夠的,因爲在我的測試服務器,只有2G內存和SystemTap的腳本運行良好的另一臺服務器

+0

我的linux內核是2.6.18-308.el5,Linux是CentOS的5.5,systemstap版本1.8/0.152非git來源 – user2366736

回答

1

不幸的是,這是預期的行爲,在這裏看到我的討論:https://sourceware.org/ml/systemtap/2015-q1/msg00033.html

的問題在於SystemTap一次分配關聯數組(以防止將來分配失敗)和每個CPU分配(以防止鎖定),這意味着bt將需要(2 * MAXSTRINGLEN + sizeof(statistic)) * MAXMAPENTRIES * NR_CPU =〜2 Gb(如果NR_CPU == 128)。

減少MAXSTRINGLEN(被設置爲4K你的情況)或bt數組大小:

global bt[128]; 
+0

我用戶你的方法,並運行腳本。我可以看到配置文件的結果,但仍然有錯誤警告:沒有或錯誤的調試幀hdr 警告:調試幀沒有二進制搜索表,執行xt_length的緩慢線性搜索 錯誤:跳過太多探頭,檢查MAXSKIPPED或再次嘗試stap -t獲取更多細節。 – user2366736

+1

這是不同類型的錯誤和DWARF開卷機的問題。用新的debuginfo嘗試新鮮的內核... – myaut