鍍金池/ 教程/ Java/ 如何安裝火焰圖生成工具
定時任務(wù)
函數(shù)的參數(shù)
超時
一個 openresty 內(nèi)存“泄漏”問題
獲取 uri 參數(shù)
局部變量
sleep
灰度發(fā)布
TIME_WAIT
代碼覆蓋率
連接池
CentOS 平臺安裝
稀疏數(shù)組
如何只啟動一個 timer 工作?
變量的共享范圍
break,return 關(guān)鍵字
Nginx
SQL 注入
如何引用第三方 resty 庫
不同階段共享變量
獲取請求 body
動態(tài)生成的 lua-resty-redis 模塊方法
動態(tài)加載證書和 OCSP stapling
repeat 控制結(jié)構(gòu)
編碼為 array 還是 object
Nginx 靜態(tài)文件服務(wù)
執(zhí)行階段概念
Lua 函數(shù)
日期時間函數(shù)
健康監(jiān)測
與其他 location 配合
for 控制結(jié)構(gòu)
函數(shù)定義
HTTPS 時代
點(diǎn)號與冒號操作符的區(qū)別
String 庫
文件操作
OpenResty 最佳實(shí)踐
<code>ngx.shared.DICT</code> 非隊列性質(zhì)
使用動態(tài) DNS 來完成 HTTP 請求
代碼規(guī)范
什么是 JIT?
Windows 平臺安裝
正確的記錄日志
LuaNginxModule
不用標(biāo)準(zhǔn)庫
C10K 編程
控制結(jié)構(gòu)
請求中斷后的處理
Lua 環(huán)境搭建
Test::Nginx 能指定現(xiàn)成的 nginx.conf,而不是自動生成一個嗎
Lua 基礎(chǔ)數(shù)據(jù)類型
動態(tài)限速
PostgresNginxModule
簡單API Server框架
API 測試
location 匹配規(guī)則
虛變量
單元測試
防止 SQL 注入
select + set_keepalive 組合操作引起的數(shù)據(jù)讀寫錯誤
阻塞操作
全動態(tài)函數(shù)調(diào)用
Web 服務(wù)
典型應(yīng)用場景
Nginx 新手起步
TLS session resumption
輸出響應(yīng)體
調(diào)用代碼前先定義函數(shù)
module 是邪惡的
怎樣理解 cosocket
模塊
Socket 編程發(fā)展
如何對 Nginx Lua module 添加新 api
如何在后臺開啟輕量級線程完成定時任務(wù)?
如何定位問題
table 庫
json 解析的異常捕獲
如何安裝火焰圖生成工具
lua 中如何 continue
if 是邪惡的
為什么我們的域名不能被解析
抵制使用 module() 定義模塊
測試
body 在 location 中的傳遞
Lua 入門
子查詢
pipeline 壓縮請求數(shù)量
如何發(fā)起新 HTTP 請求
Lua 簡介
緩存失效風(fēng)暴
Ubuntu 平臺安裝
日志輸出
緩存
Lua 面向?qū)ο缶幊?/span>
Nginx 陷阱和常見錯誤
Redis 接口的二次封裝(發(fā)布訂閱)
日志
訪問有授權(quán)驗證的 Redis
正則表達(dá)式
lock
熱裝載代碼
調(diào)用 FFI 出現(xiàn) &quot;table overflow&quot;
數(shù)據(jù)合法性檢測
禁止某些終端訪問
控制結(jié)構(gòu) if-else
調(diào)試
與 Docker 使用的網(wǎng)絡(luò)瓶頸
PostgresNginxModule 模塊的調(diào)用方式
用 do-end 整理你的代碼
FFI
什么時候使用
簡介
環(huán)境搭建
Mac OS X 平臺安裝
火焰圖
負(fù)載均衡
while 型控制結(jié)構(gòu)
如何定位 openresty 崩潰 bug
使用 Nginx 內(nèi)置綁定變量
判斷數(shù)組大小
請求返回后繼續(xù)執(zhí)行
Redis 接口的二次封裝
KeepAlive
反向代理
協(xié)議無痛升級
數(shù)學(xué)庫
元表
Vanilla 介紹
HelloWorld
LuaCjsonLibrary
持續(xù)集成
代碼靜態(tài)分析
網(wǎng)上有大量對 Lua 調(diào)優(yōu)的推薦,我們應(yīng)該如何看待?
script 壓縮復(fù)雜請求
非空判斷
性能測試
函數(shù)返回值
API 的設(shè)計
kong 介紹
表達(dá)式
不支持事務(wù)
LuaRestyDNSLibrary 簡介

如何安裝火焰圖生成工具

安裝 SystemTap

SystemTap 是一個診斷 Linux 系統(tǒng)性能或功能問題的開源軟件,為了診斷系統(tǒng)問題或性能,開發(fā)者或調(diào)試人員只需要寫一些腳本,然后通過 SystemTap 提供的命令行接口就可以對正在運(yùn)行的內(nèi)核進(jìn)行診斷調(diào)試。

在 CentOS 上的安裝方法

首先需要安裝當(dāng)前內(nèi)核版本對應(yīng)的開發(fā)包和調(diào)試包(這一步非常重要并且最為繁瑣):

# #Installaion:
# rpm -ivh kernel-debuginfo-$(uname -r).rpm
# rpm -ivh kernel-debuginfo-common-$(uname -r).rpm
# rpm -ivh kernel-devel-$(uname -r).rpm

這些 rpm 包可以在該網(wǎng)址中下載: http://debuginfo.centos.org

安裝 systemtap:

# yum install systemtap
# ...
# 測試systemtap安裝成功否:
# stap -v -e 'probe vfs.read {printf("read performed\n"); exit()}'

Pass 1: parsed user script and 103 library script(s) using 201628virt/29508res/3144shr/26860data kb, in 10usr/190sys/219real ms.
Pass 2: analyzed script: 1 probe(s), 1 function(s), 3 embed(s), 0 global(s) using 296120virt/124876res/4120shr/121352data kb, in 660usr/1020sys/1889real ms.
Pass 3: translated to C into "/tmp/stapffFP7E/stap_82c0f95e47d351a956e1587c4dd4cee1_1459_src.c" using 296120virt/125204res/4448shr/121352data kb, in 10usr/50sys/56real ms.
Pass 4: compiled C into "stap_82c0f95e47d351a956e1587c4dd4cee1_1459.ko" in 620usr/620sys/1379real ms.
Pass 5: starting run.
read performed
Pass 5: run completed in 20usr/30sys/354real ms.

如果出現(xiàn)如上輸出表示安裝成功。

在 Ubuntu 上的安裝方法

對于 Ubuntu 上的安裝,參考 Ubuntu 官方維護(hù)的一個 wiki: https://wiki.ubuntu.com/Kernel/Systemtap

一般來說,僅需引入 ddeb 源,然后 apt-get 就能解決了。

由于 systemtap 需要依賴某些內(nèi)核特性,對于 Ubuntu Gutsy (或更老的版本),必須重新編譯內(nèi)核。 編譯的步驟參見 systemtap 的這篇 wiki: https://sourceware.org/systemtap/wiki/SystemtapOnUbuntu

另外,由于 Ubuntu 16.04 官方庫里的 systemtap 版本過舊(version 2.9),從 apt-get 安裝的 systemtap 有些情況下并不能正確地運(yùn)行。 這時候需要從 systemtap 源碼中編譯出可用的 systemtap。 編譯的過程參考 systemtap 的這篇文檔: https://sourceware.org/git/?p=systemtap.git;a=blob_plain;f=README;hb=HEAD

大體上就這幾步:

# 下載依賴……
sudo apt install elfutils
sudo apt-get build-dep systemtap

# 下載最新的版本
wget/git ...

# 構(gòu)建,并祈禱能一次成功
./configure
make all
[sudo] make install

火焰圖繪制

首先,需要下載 stapxx 工具包:Github地址。 該工具包中包含用 perl 寫的,會生成 stap 探測代碼并運(yùn)行的腳本。如果是要抓 Lua 級別的情況,請使用其中的 lj-lua-stacks.sxx。 由于 lj-lua-stacks.sxx 輸出的是文件絕對路徑和行號,要想匹配具體的 Lua 代碼,需要用 fix-lua-bt 進(jìn)行轉(zhuǎn)換。

# ps -ef | grep nginx  (ps:得到類似這樣的輸出,其中15010即使worker進(jìn)程的pid,后面需要用到)
hippo    14857     1  0 Jul01 ?        00:00:00 nginx: master process /opt/openresty/nginx/sbin/nginx -p /home/hippo/skylar_server_code/nginx/main_server/ -c conf/nginx.conf
hippo    15010 14857  0 Jul01 ?        00:00:12 nginx: worker process
# ./samples/lj-lua-stacks.sxx --arg time=5 --skip-badvars -x 15010 > tmp.bt (-x 是要抓的進(jìn)程的 pid, 探測結(jié)果輸出到 tmp.bt)
# ./fix-lua-bt tmp.bt > flame.bt  (處理 lj-lua-stacks.sxx 的輸出,使其可讀性更佳)

其次,下載 Flame-Graphic 生成包:Github地址,該工具包中包含多個火焰圖生成工具,其中,stackcollapse-stap.pl 才是為 SystemTap 抓取的棧信息的生成工具

# stackcollapse-stap.pl flame.bt > flame.cbt
# flamegraph.pl flame.cbt > flame.svg

如果一切正常,那么會生成 flame.svg,這便是火焰圖,用瀏覽器打開即可。

ps:如果在執(zhí)行 lj-lua-stacks.sxx 的時間周期內(nèi)(上面的命令是 5 秒), 抓取的 worker 沒有任何業(yè)務(wù)在跑,那么生成的火焰圖便沒有業(yè)務(wù)內(nèi)容。為了讓生成的火焰圖更有代表性,我們通常都會在抓取的同時進(jìn)行壓測。

下一篇:SQL 注入