一個(gè)正常的火焰圖,應(yīng)該呈現(xiàn)出如官網(wǎng)給出的樣例(官網(wǎng)的火焰圖是抓 C 級(jí)別函數(shù)): http://wiki.jikexueyuan.com/project/openresty/images/Flame-Graphic.svg" alt="正常" />
從上圖可以看出,正常業(yè)務(wù)下的火焰圖形狀類似的“山脈”,“山脈”的“海拔”表示 worker 中業(yè)務(wù)函數(shù)的調(diào)用深度,“山脈”的“長(zhǎng)度”表示 worker 中業(yè)務(wù)函數(shù)占用 cpu 的比例。
下面將用一個(gè)實(shí)際應(yīng)用中遇到問(wèn)題抽象出來(lái)的示例(CPU 占用過(guò)高)來(lái)說(shuō)明如何通過(guò)火焰圖定位問(wèn)題。
問(wèn)題表現(xiàn),Nginx worker 運(yùn)行一段時(shí)間后出現(xiàn) CPU 占用 100% 的情況,reload 后一段時(shí)間后復(fù)現(xiàn),當(dāng)出現(xiàn) CPU 占用率高情況的時(shí)候是某個(gè) worker 占用率高。
問(wèn)題分析,單 worker cpu 高的情況一定是某個(gè) input 中包含的信息不能被 Lua 函數(shù)以正確地方式處理導(dǎo)致的,因此上火焰圖找出具體的函數(shù),抓取的過(guò)程需要抓取 C 級(jí)別的函數(shù)和 Lua 級(jí)別的函數(shù),抓取相同的時(shí)間,兩張圖一起分析才能得到準(zhǔn)確的結(jié)果。
抓取步驟:
獲取 CPU 異常的 worker 的進(jìn)程 ID :
ps -ef | grep nginx
使用 lj-lua-stacks.sxx抓取棧信息,并用 fix-lua-bt 工具處理:
# making the ./stap++ tool visible in PATH:
$ export PATH=$PWD:$PATH
# assuming the nginx worker process pid is 6949:
$ ./samples/lj-lua-stacks.sxx --arg time=5 --skip-badvars -x 6949 > tmp.bt
Start tracing 6949 (/opt/nginx/sbin/nginx)
Please wait for 5 seconds
$ ./fix-lua-bt tmp.bt > a.bt
使用 stackcollapse-stap.pl 和 flamegraph.pl:
./stackcollapse-stap.pl a.bt > a.cbt ./flamegraph.pl a.cbt > a.svg
a.svg 即是火焰圖,拖入瀏覽器即可: http://wiki.jikexueyuan.com/project/openresty/images/flame_graphic_problem.svg" alt="problem" />
PS:一般來(lái)說(shuō)一個(gè)正常的火焰圖看起來(lái)像一座座連綿起伏的“山峰”,而一個(gè)異常的火焰圖看起來(lái)像一座“平頂山”。