一.環境 1.1 jello@jello:~$ uname -a Linux jello 4.4.0-98-generic #121-Ubuntu SMP Tue Oct 10 14:24:03 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux 1.2 jello@je ...
一.環境
1.1 jello@jello:~$ uname -a
Linux jello 4.4.0-98-generic #121-Ubuntu SMP Tue Oct 10 14:24:03 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
1.2 jello@jello-Inspiron-N4050:~$ lsb_release -a
Distributor ID: Ubuntu
Description: Ubuntu 16.04.3 LTS
Release: 16.04
Codename: xenial
二.準備工作.
2.1安裝systemtap (火焰圖依賴於此工具)
sudo apt-get install systemtap
2.2 查找內核對應的debug包
jello@jello-Inspiron-N4050:~$ uname -r
4.4.0-98-generic
那麼接下來就是去http://ddebs.ubuntu.com/pool/main/l/linux/下載對應的debug包,找4.4.0-98-generic一致的
2.3 下載對應的debug包
wget http://ddebs.ubuntu.com/pool/main/l/linux/linux-image-4.4.0-98-generic-dbgsym_4.4.0-98.121_amd64.ddeb (這是筆者自己找到的對應下載路徑)
2.4 安裝debug包
sudo dpkg -i linux-image-4.4.0-98-generic-dbgsym_4.4.0-98.121_amd64.ddeb
2.5 安裝nginx
sudo apt-get install nginx
此時在瀏覽器中輸入localhost即可出現以下信息表明安裝ok
Welcome to nginx!
If you see this page, the nginx web server is successfully installed and working. Further configuration is required.
For online documentation and support please refer to nginx.org.
Commercial support is available at nginx.com.
Thank you for using nginx.
2.5 編寫systemtap腳本nginx.systemtap,內容如下:
global s;
global quit=0;
probe timer.profile {
if (pid() == target()){
if (quit) {
foreach (i in s-) {
print_ustack(i);
printf("\t%d\n",@count(s[i]));
}
exit();
}
else {
s[ubacktrace()] <<< 1;
}
}
}
probe timer.s(20){
quit = 1
}
2.6 使用systemtap
sudo stap --ldd -d /usr/sbin/nginx --all-modules -D MAXMAPENTRIES=256 -D MAXACTION=20000 -D MAXTRACE=100 -D MAXSTRINGLEN=4096 -D MAXBACKTRACE=100 -x 2082 nginx.systemtap --vp 0001 > nginx.out
各參數解析:
--ldd,添加通過ldd解析出來的所有共用庫符號表信息以便為probe到的用戶空間二進位提供信息或者以-d選項列出來,註意:這會使得probe模塊相當的大
-d /usr/sbin/nginx,為給定的模塊(這裡是nginx)添加符號表信息到內核對象模塊,這可能使能這些模塊或者程式的象徵性traceback,即使他們沒有顯式probe到他們裡面
--all-modules,相當於為所有當前被載入的模塊指定'-dkernel'和‘-d'選項
-D MAXMAPENTRIES=256 ,添加給定的c預處理直接到模塊makefile中,這些能被用來限制以下描述的參數
未寫完,待續...