linux系統分析工具之Blktrace(十)

Blktrace簡介:
 blktrace是一個針對Linux內核中塊設備I/O層的跟蹤工具,用來收集磁盤IO信息中當IO進行到塊設備層(block層,所以叫blk trace)時的詳細信息(如IO請求提交,入隊,合併,完成等等一些列的信息),是由Linux內核塊設備層的維護者開發的,目前已經集成到內核2.6.17及其之後的內核版本中。通過使用這個工具,使用者可以獲取I/O請求隊列的各種詳細的情況,包括進行讀寫的進程名稱、進程號、執行時間、讀寫的物理塊號、塊大小等等,是一個Linux下分析I/O相關內容的很好的工具
 透過blktrace來觀察io行爲的時候,第一件事情需要選擇目標設備,以便分析該設備的io行爲。blktrace分爲內核部分和應用部分,應用部分收到我們要捕捉的設備名單,傳給內核。內核分佈在block層的各個tracepoint就會開始工作,把相關的數據透過relayfs傳遞到blktrace的應用部分,應用部分把這些數據記到磁盤,以便後續分析。
 blktrace架構圖參照:
 http://blog.yufeng.info/archives/2524
 block層位置圖參照:
 http://blog.yufeng.info/archives/751
 blktrace是一個可以顯示block的io詳細信息的工具,但他的輸出信息太專業了,很難看懂,可以同通過blkiomon、blkparse,btt等工具來查看
blktrace工作原理:
(1)blktrace測試的時候,會分配物理機上邏輯cpu個數個線程,並且每一個線程綁定一個邏輯cpu來收集數據
(2)blktrace在debugfs掛載的路徑(默認是/sys/kernel/debug )下每個線程產生一個文件(就有了對應的文件描述符),然後調用ioctl函數(攜帶文件描述符, _IOWR(0x12,115,struct blk_user_trace_setup),& blk_user_trace_setup三個參數),產生系統調用將這些東西給內核去調用相應函數來處理,由內核經由debugfs文件系統往此文件描述符寫入數據
(3)blktrace需要結合blkparse來使用,由blkparse來解析blktrace產生的特定格式的二進制數據
(4)blkparse僅打開blktrace產生的文件,從文件裏面取數據做展示以及最後做per cpu的統計輸出,但blkparse中展示的數據狀態(如 A,U,Q,詳細見下)是blkparse在t->action & 0xffff之後自己把數值轉換爲“A,Q,U之類的狀態”來展示的。
blktrace安裝:
 $ sudo apt-get install blktrace
Debugfs掛載:
 由blktrace工作原理可知,blktrace需要藉助內核經由debugfs文件系統(debugfs文件系統在內存中)來輸出信息,所以用blktrace工具之前需要先掛載debugfs文件系統
$ sudo mount –t debugfs debugfs /sys/kernel/debug
blktrace語法:
 blktrace -d dev [ -r debugfs_path ] [ -o output ] [-k ] [ -w time ] [ -a action ] [ -A action_mask ] [ -v ]
blktrace選項:
 -A hex-mask			#設置過濾信息mask成十六進制mask
 -a mask			#添加mask到當前的過濾器
 -b size			#指定緩存大小for提取的結果,默認爲512KB
 -d dev			#添加一個設備追蹤
 -I file			#Adds the devices found in file as devices to trace
 -k			#殺掉正在運行的追蹤
 -n num-sub			#指定緩衝池大小,默認爲4個子緩衝區 
 -o file			#指定輸出文件的名字
 -r rel-path			#指定的debugfs掛載點
 -V			#版本號 
 -w seconds			#設置運行的時間
輸出方式:

 文件輸出:
 $ blktrace –d /dev/sda –o test1
  #對/dev/sda的trace,輸出文件名爲test1. Blktrace.[0-cpu數-1](文件裏面存的是二進制數據,需要blkparse來解析)(如之前在blktrace原理中提到,每個邏輯cpu都有一個線程,產生一個文件,故會產生cpu數目個文件)
 終端輸出:
 $ blktrace –d /dev/sda –o - | blkparse  -i –
  #輸出到終端用“-”表示,可是都是一堆二進制東西,沒法看,所以需要實時blkparse來解析
  #Blkparse 的“-i”後加文件名,blktrace輸出爲“-“代表終端(代碼裏面寫死了,就是用這個符號來代表終端),blkparse也用“-”來代表終端解析
幾個例子:
blktrace -d /dev/sda -o - |blkparse -i -
此命令是將blktrace的結果輸出到屏幕,然後blkparse將屏幕中的blktrace的結果作爲分析的輸入,最後將分析的結果同樣輸出到屏幕。這裏需要指出的是,blkparse是基於blktrace的分析工具,因爲blktrace本身並不具有分析功能,它只是進行監測,其餘的工作都是由blkparse來進行的。
blktrace -d /dev/sda |blkparse -i -
此命令是將blktrace的結果輸出到本地文件夾,文件名爲sda.blktrace.0和sda.blktrace.1,這裏之所以有兩個文件是因爲運行機器有兩個CPU的緣故,blktrace根據CPU的個數來生成文件,對應每個CPU都有一個相應的監測數據文件。
blktrace -d /dev/sda -o trace |blkparse -i -
此命令是將blktrace的結果輸出到已經事先指定好的文件trace中,注意這個trace文件必須在本地文件夾中存在,無需帶有任何後綴。運行之後會產生兩個新的文件叫做trace.blktrace.0和trace.blktrace.1。
blkparse -i trace
此命令是將trace文件作爲blkparse的輸入,blkparse的結果依然輸出到屏幕
blkparse -i trace -o /root/trace.txt
此命令是將trace文件作爲blkparse的輸入,同時將分析結果輸出到/root/trace.txt這個文件,以便人工進行更加深入的分析,因爲trace文件是人眼不可讀的,所以如果要進行更多後續的人工或程序處理最好還是將結果轉化爲文本文檔來處理。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章