# 如何安裝火焰圖生成工具
#### 安裝SystemTap
> 環境 CentOS 6.5 2.6.32-504.23.4.el6.x86_64
SystemTap是一個診斷Linux系統性能或功能問題的開源軟件,為了診斷系統問題或性能,開發者或調試人員只需要寫一些腳本,然后通過SystemTap提供的命令行接口就可以對正在運行的內核進行診斷調試。
首先需要安裝內核開發包和調試包(這一步非常重要并且最為繁瑣):
~~~
# #Installaion:
# rpm -ivh kernel-debuginfo-($version).rpm
# rpm -ivh kernel-debuginfo-common-($version).rpm
# rpm -ivh kernel-devel-($version).rpm
~~~
其中$version使用linux命令 uname -r 查看,需要保證內核版本和上述開發包版本一致才能使用systemtap。([下載](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.
~~~
如果出現如上輸出表示安裝成功。
#### 火焰圖繪制
首先,需要下載ngx工具包:[Github地址](https://github.com/openresty/nginx-systemtap-toolkit),該工具包即是用perl生成stap探測腳本并運行的腳本,如果是要抓lua級別的情況,請使用工具 ngx-sample-lua-bt
~~~
# ps -ef | grep nginx (ps:得到類似這樣的輸出,其中15010即使worker進程的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
# ./ngx-sample-lua-bt -p 15010 --luajit20 -t 5 > tmp.bt (-p 是要抓的進程的pid --luajit20|--luajit51 是luajit的版本 -t是探測的時間,單位是秒, 探測結果輸出到tmp.bt)
# ./fix-lua-bt tmp.bt > flame.bt (處理ngx-sample-lua-bt的輸出,使其可讀性更佳)
~~~
其次,下載Flame-Graphic生成包:[Github地址](https://github.com/brendangregg/FlameGraph),該工具包中包含多個火焰圖生成工具,其中,stackcollapse-stap.pl才是為SystemTap抓取的棧信息的生成工具
~~~
# stackcollapse-stap.pl flame.bt > flame.cbt
# flamegraph.pl flame.cbt > flame.svg
~~~
如果一切正常,那么會生成flame.svg,這便是火焰圖,用瀏覽器打開即可。
#### 問題回顧
在整個安裝部署過程中,遇到的最大問題便是內核開發包和調試信息包的安裝,找不到和內核版本對應的,好不容易找到了又不能下載,@!¥#@……%@#,于是升級了內核,在后面的過程便沒遇到什么問題。ps:如果在執行ngx-sample-lua-bt的時間周期內(上面的命令是5秒),抓取的worker沒有任何業務在跑,那么生成的火焰圖便沒有業務內容,不要驚訝哦~~~~~
- 序
- Lua簡介
- Lua環境搭建
- 基礎數據類型
- 表達式
- 控制結構
- if/else
- while
- repeat
- 控制結構for的使用
- break,return
- Lua函數
- 函數的定義
- 函數的參數
- 函數的返回值
- 函數回調
- 模塊
- String庫
- Table庫
- 日期時間函數
- 數學庫函數
- 文件操作
- 元表
- 面向對象編程
- FFI
- LuaRestyRedisLibrary
- select+set_keepalive組合操作引起的數據讀寫錯誤
- redis接口的二次封裝(簡化建連、拆連等細節)
- redis接口的二次封裝(發布訂閱)
- pipeline壓縮請求數量
- script壓縮復雜請求
- LuaCjsonLibrary
- json解析的異常捕獲
- 稀疏數組
- 空table編碼為array還是object
- 跨平臺的庫選擇
- PostgresNginxModule
- 調用方式簡介
- 不支持事務
- 超時
- 健康監測
- SQL注入
- LuaNginxModule
- 執行階段概念
- 正確的記錄日志
- 熱裝載代碼
- 阻塞操作
- 緩存
- sleep
- 定時任務
- 禁止某些終端訪問
- 請求返回后繼續執行
- 調試
- 調用其他C函數動態庫
- 我的lua代碼需要調優么
- 變量的共享范圍
- 動態限速
- shared.dict 非隊列性質
- 如何添加自己的lua api
- 正確使用長鏈接
- 如何引用第三方resty庫
- 使用動態DNS來完成HTTP請求
- 緩存失效風暴
- Lua
- 下標從1開始
- 局部變量
- 判斷數組大小
- 非空判斷
- 正則表達式
- 不用標準庫
- 虛變量
- 函數在調用代碼前定義
- 抵制使用module()函數來定義Lua模塊
- 點號與冒號操作符的區別
- 測試
- 單元測試
- API測試
- 性能測試
- 持續集成
- 灰度發布
- web服務
- API的設計
- 數據合法性檢測
- 協議無痛升級
- 代碼規范
- 連接池
- c10k編程
- TIME_WAIT問題
- 與Docker使用的網絡瓶頸
- 火焰圖
- 什么時候使用
- 顯示的是什么
- 如何安裝火焰圖生成工具
- 如何定位問題