SystemTap
簡單介紹
- systemtap是一個診斷l(xiāng)inux系統(tǒng)性能和功能問題的開源軟件尔觉,并且允許開發(fā)人員編寫和重用簡單的腳本深入探查linux系統(tǒng)的活動设易,可以快速安全的提取過濾總結(jié)數(shù)據(jù),以便能夠診斷復(fù)雜的性能或功能問題澎灸。
- 基本思想是name events(命名事件)院塞,并給它們處理程序。每當(dāng)事件發(fā)生的時候性昭,linux內(nèi)核運(yùn)行處理程序拦止,就像一個子程序一樣,之后恢復(fù)糜颠。處理程序是一系列的腳本語言汹族,用于指定事件完成時要完成的工作,這種工作通常包括是提取數(shù)據(jù)其兴,打印結(jié)果等顶瞒。
- systemtap通過將腳本裝換成C,運(yùn)行系統(tǒng)的時候創(chuàng)建一個內(nèi)核模塊元旬,當(dāng)模塊加在的時候榴徐,它通過掛載到內(nèi)核的鉤子來激活所有的探測事件守问。最后,這次事件結(jié)束的時候箕速,掛載的鉤子斷開連接酪碘,移除模塊。
systemtap工具功能很強(qiáng)大盐茎,目前剛接觸兴垦,在此僅僅通過官網(wǎng)做一些簡單的介紹。
安裝
- 環(huán)境 centos 7字柠,直接用
yum install systemtap systemtap-runtime
安裝探越,如果遇到依賴包的問題,安裝所需要的依賴就好了窑业; - 另外需要注意一個重要的問題是需要安裝kernel-debuginfo和kernel-debuginfo-common钦幔;可以直接用yum安裝也可以下載rpm包安裝;但是 ** 必須要和kernel版本一樣 **
- 安裝完成后可以用
stap -v -e 'probe vfs.read {printf("read performed\n"); exit()}'
測試常柄,如果不出意外的話會正常輸出的
表示在這里被坑了好久鲤氢,全部安裝好后運(yùn)行的時候一直報錯,累西潘。卷玉。。
Openresty
介紹
- OpenResty是一個動態(tài)的基于nginx和lua的網(wǎng)絡(luò)平臺喷市。把nginx和lua集成在一起相种,可以通過lua完成一些復(fù)雜的需求,而不用再去開發(fā)C層面的module了品姓,同時性能也很理想寝并。
- 目前應(yīng)該直接集成LuaJIT了,簡單來說LuaJIT是lua的一個更高性能的版本腹备。
安裝
- 直接到官網(wǎng)下載源碼進(jìn)行編譯安裝就行了衬潦,如果遇到一些依賴,就直接安裝依賴就行了植酥。
目前在做nginx的相關(guān)工作别渔,所以對openresty了解的比較多一點(diǎn),如有興趣惧互,歡迎共同交流。
火焰圖
介紹
- 火焰圖(Flame Graphs)是一個通過可視話堆棧的方法喇伯,可以直觀的看出每個函數(shù)占用cpu的時間喊儡,內(nèi)存,off-cpu等等稻据,對于我們排查軟件問題很有幫助艾猜。
- 顯示的是买喧,Y軸是堆棧的深度,X軸是樣本數(shù)量匆赃。每個樣本(函數(shù))是一個矩形淤毛。鼠標(biāo)點(diǎn)擊可以看到一些詳細(xì)的信息。通過這些可以看出那些需要調(diào)整優(yōu)化算柳。
對于火焰圖也是最近才了解到的低淡,有些解釋可能很牽強(qiáng),誤怪瞬项,后面會慢慢的了解學(xué)習(xí)的蔗蹋。
生成
- openresty提供了一套完整的工具用于探測運(yùn)行的狀況〈蚜埽可以直接下載并根據(jù)介紹運(yùn)行猪杭。
- 然后下載FlameGraph火焰圖生成工具,用于把前面采樣到的信息繪制成火焰圖妥衣。
- 然后在瀏覽器中打開進(jìn)行觀察分析皂吮。
在采樣信息的時候需要讓nginx在壓力很大的情況下,這樣得出的結(jié)果才會有更大的參考性税手。
分析火焰圖
- 采樣C層面的信息進(jìn)行分析
- sudo ./sample-bt -p 15507 -t 60 -u -a '-DMAXACTION=100000' > /tmp/nginx.bt
-p 表示nginx的worker的pid
-t 表示采樣時間
-u 表示在用戶空間
-a 傳遞一些參數(shù)蜂筹,因?yàn)槲易约旱臋C(jī)器的原因所以需要傳遞這個參數(shù),要不然會報錯的
- sudo ./stackcollapse-stap.pl /tmp/nginx.bt > /tmp/nginx.cbt
- sudo ./flamegraph.pl /tmp/nginx.cbt > /tmp/nginx.svg
- 用瀏覽器打開/tmp/nginx.svg
openresty C層面的火焰圖
我用wrk給nginx的壓力還不是很大大概CPU才20%左右冈止,所以這個不是很準(zhǔn)確的狂票;但是也可以看出一些問題,比如看出在發(fā)送數(shù)據(jù)的時候還是有問題的熙暴,都在body_filter階段闺属,可能因?yàn)槲矣昧撕芏嗟腷uffer的原因
- 采樣lua層面的信息進(jìn)行分析,在編譯luaJIT的時候需要添加
CCDEBUG=-g
參數(shù)
- sudo ./ngx-sample-lua-bt -a '-DMAXACTION=100000' -p 4790 --luajit20 -t 60 > /tmp/lua.bt
各個參數(shù)的意思和上面的一樣周霉。
- sudo ./fix-lua-bt /tmp/lua.bt > /tmp/lua-fix.bt
- sudo ./stackcollapse-stap.pl /tmp/lua-fix.bt > /tmp/lua-fix.cbt
- sudo ./flamegraph.pl /tmp/lua-fix.cbt > /tmp/lua-fix.svg
- 瀏覽器打開/tmp/lua-fix.svg
圖的話在這里就不再貼出來了
后記
- 上面用
sample-bt
生成的是on-cpu的相關(guān)數(shù)據(jù)掂器,也可以用sample-bt-off-cpu
生成off-cpu的相關(guān)分析數(shù)據(jù),具體的區(qū)別可以到相關(guān)網(wǎng)站進(jìn)行詳細(xì)的了解俱箱; - 首先呢国瓮,這個火焰圖是一個很好的分析工具,相信可以為我們再排查問題的時候提供很大的幫助狞谱,目前我也是剛接觸這個工具乃摹,還在慢慢摸索學(xué)習(xí)當(dāng)中;
- 另外一個就是在安裝遇到過很多的坑跟衅,也相當(dāng)無語孵睬,但是都通過google慢慢的一個一個解決了,要有一顆永不放棄的心不是嗎伶跷;
*** 如有疑問歡迎批評指正掰读,謝謝秘狞! ***