blktrace介紹
blktrace是一個針對linux內核中塊設備I/O的跟蹤工具,是由Linux內核塊設備層的維護者開發的。通過這個工具,使用者可以獲得I/O請求隊列的各種詳細的情況,包括進行讀寫的進程名稱、進程號、執行時間、讀寫的物理塊號、塊的大小等等。
blktrace的工作原理
1:blktrace測試的時候,會分配給物理機上邏輯cpu個數的線程,並且每個線程綁定一個邏輯cpu來蒐集數據
例如:9630的手機,有cpu0、cpu1、cpu2、cpu3,所以啓動4個線程
2:blktrace在debugfs掛載的路徑(默認路徑:/sys/kernel/debug)下每個線程產生一個文件(就有了對應的文件描述符),然後調用ioctrl函數,
產生系統調用,將相應的參數傳遞給內核去調用相應的函數處理,由內核經由debugfs文件系統往此文件描述符寫入數據
3:blktrace需要結合blkparse來使用,用blkparse來解析blktrace產生的特定格式的二進制數據
blktrace在手機的使用
第一步:要打開kernel的Trace功能。
步驟:1. source build/envsetup.sh
2. lunch 選擇工程
3. 輸入命令kuconfig,配置內核
4. 選中kernelhacking--->Tracer----->Support for tracing block IO actions 5. make systemimage -j4
6. 將新生成的system.img boot.img下載到手機
第二步: 將可執行的blktrace/blkparse的可執行程序下載到手機
步驟:1.abd root 進入root權限
2.adb remount 重新掛載
3.adb push blktrace /system/bin/
4.adb push blkparse /system/bin
5.adb shell
6.cd /system/bin
7.修改blktrace/blkparse的屬性,chmod 0777 blktrace
Blktrace準備工作
1:因爲手機有cpu0/cpu1/cpu2/cpu3,一共4個cpu,blktrace一共啓動4個線程,一個cpu對應一個線程。所以,在運行blktrace監控命令之前保證4個cpu處於喚醒狀態
2:查看方法:adb root
adb shell
cd /sys/devices/system/cpu/
cat online
如果顯示0-3,代表4個cpu都處於喚醒狀態,如果顯示0,代表只有cpu0處於喚醒狀態
3:喚醒cpu的方法:
echo 1 >/sys/devices/system/cpu/cpufreq/sprdemand/cpu_hotplug_disable
4:只要保證運行blktrace監控命令之前4個cpu處於喚醒狀態即可,一旦blktrace監控命令啓動,無論cpu1/cpu2/cpu3處於開啓還是關閉狀態,都不會影響blktrace的工作性能
使用案例
1. mount -t vfat /dev/block/mmcblk0p1 /data/temp
2. blktrace /dev/block/mmcblk1p1 -o /data/trace 此命令的意思:blktrace監控T卡,並將監控的結果輸出到/data目錄下,生成的文件名爲trace.blktrace.0 trace.blktrace.1 trace.blktrace.2trace.blktrace.3他們的個數由cpu的個數決定
3. 重新打開一個終端 dd if=/dev/zero of=/data/temp/11bs=512 count=1024
4. 此時blktrace可監控到寫,按ctrl+c可終止監控
5. 由於trace.blktrace.x 文件裏面存的是二進制數據,需要blkparse來解析
6. 文件解析:blkparse -i trace 此命令的作用是將解析結果輸出到屏幕,(此命令在trace.blktrace.x生成的目錄執行)
此時終端,會輸出
179,1 2 0 0.000361250 0 m Ncfq110A fifo= (null)
179,1 2 0 0.000364094 0 m N cfq110A dispatch_insert
179,1 2 0 0.000378047 0 m Ncfq110A dispatched a request
179,0 1 25 0.000381250 2152 A W2993285 + 1 <- (179,1) 2991237
179,1 2 0 0.000382875 0 m Ncfq110A activate rq, drv=1
179,1 1 26 0.000386313 2152 Q W2993285 + 1 [kworker/u8:1]
179,1 2 1 0.000387250 88 D W2444 + 2 [mmcqd/0]
179,1 1 27 0.000405024 2152 G W2993285 + 1 [kworker/u8:1]
179,1 1 28 0.000409250 2152 P N[kworker/u8:1]
179,0 1 29 0.001225735 2152 A W2993286 + 1024 <- (179,1) 29912
blktrace命令詳解
1. blktrace /dev/block/mmcblk0p1 -o /data/trace 命令解析:監控mmcblk0p1塊設備,將生成的文件存儲在/data目錄下,一共生成4個文件,文件以trace開頭,分別爲trace.blktrace.0 trace.blktrace.1 trace.blktrace.2trace.blktrace.3分別對應cpu0、cpu1、cpu2、cpu3
2. blktrace /dev/block/mmcblk0p1 -D /data/trace 命令解析:監控mmcblk0p1塊設備,在/data目錄下建立一個名字爲trace的文件夾,trace文件夾下存放的是名字爲 mmcblk0p1.blktrace.0mmcblk0p1.blktrace.1 mmcblk0p1.blktrace.2 mmcblk0p1.blktrace.3 分別對應cpu0 cpu1 cpu2 cpu3
3. blktrace /dev/block/mmcblk0p1 -o /data/trace -w 10 命令解析:-w 選項表示多長時間之後停止監控(單位:秒) -w 10 表示10秒之後停止監控
4. blktrace /dev/block/mmcblk0p1 -o /data/trace -a WRITE 命令解析:-a 代表只監控寫操作
選項 -a action 表示要監控的動作,action的動作有:
READ (讀)
WRITE(寫)
BARRIER
SYNC
QUEUE
REQUEUE
ISSUE
COMPLETE
FS
PC
詳見:http://www.cse.unsw.edu.au/~aaronc/iosched/doc/blktrace.html(blktrace user guide)
blkparse工具解析
1. 實時解析,實時數據的解析即上blktrace的“終端輸出”實現實時解析的命令:blktrace -d/dev/block/mmcblk0p1 -o - |blkparse -i -
2. 文件解析,分爲兩種
(1) 在手機上生成解析文件
i. 實現方法:進入trace.blktrace.0 trace.blktrace.1 trace.blktrace.2 trace.blktrace.3所在的目錄輸入命令:blkparse -itrace -o /data/trace.txt
(2) 在PC上實現解析
ii. 實現方法,將手機上生成的trace.blktrace.0 trace.blktrace.1 trace.blktrace.2 trace.blktrace.3的文件拷貝到PC上輸入命令:./blkparse -i trace -otrace.txt
blktrace解析文件格式
默認的輸出內容格式爲:"%D ,%8s %5T.%9t %5p * =",
如:
8,16 0 35 1.157274569 2544 GWBS 121897312 + 8 [jbd2/sdb-8]
其中:
%D 主從設備號 :8.16,CPU_id: 0 ###因爲此時解析的文件是trace.blktrace.0,蒐集的cpu0的信息,所以CPU_id爲0###
%8s io序列號,一般從1開始 :35
%5T.%9t 此IO操作發生時的時間戳秒.納秒:1.157274569
%5p process ID :2544
* IO action:解釋見下面
= RWBS data。R表示讀 W表示寫D表示塊被丟棄B表示barrier operation S表示同步IO:如上面的WBS,表示同步寫操作
121897312是相對8,16的扇區起始號,+8,爲後面連續的8個扇區(默認一個扇區512byte,所以8個扇區就是4K),後面的[jbd2/sdb-8]是程序的名字。
IO action列表
C -- complete A previouslyissued request has been completed. Theout‐
put will detail the sectorand size of that request, as well as the
success or failure of it.
D -- issued A request thatpreviously resided on the block layer queue
or in the i/o scheduler hasbeen sent to the driver.
I -- inserted A request isbeing sent to the i/o scheduler for addition
to the internal queue andlater service by the driver. The request
is fully formed at thistime.
Q -- queued This notes intent to queue i/o at the given location. No
real requests exists yet.
B -- bounced The data pagesattached to this bio are not reachable by
the hardware and must be bounced to a lower memory location. This
causes a big slowdown in i/operformance, since the data must be
copied to/from kernelbuffers. Usually this can be fixed with using
better hardware -- either abetter i/o controller, or a platform
with an IOMMU.
M -- back merge A previously inserted request exists that ends on the
boundary of where this i/obegins, so the i/o scheduler can merge
them together.
F -- front merge Same as the back merge, except this i/o ends where a
previously inserted requestsstarts.
M --front or back merge Oneof the above
G -- get request To send anytype of request to a block device, a
struct request containermust be allocated first.
S -- sleep No available request structures wereavailable, so the
issuer has to wait for oneto be freed.
P -- plug When i/o is queuedto a previously empty block device queue,
Linux will plug the queue inanticipation of future ios being added
before this data is needed.
U -- unplug Some requestdata already queued in the device, start send‐
ing requests to the driver. This may happen automatically if a
timeout period has passed (see next entry) or if a number of
requests have been added tothe queue.
T -- unplug due to timer If nobody requests the i/o that wasqueued
after plugging the queue,Linux will automatically unplug it after
a defined period has passed.
X -- split On raid or device mapper setups, anincoming i/o may strad‐
dle a device or internalzone and needs to be chopped up into
smaller pieces for service.This may indicate a performance problem
due to a bad setup of thatraid/dm device, but may also just be
part of normal boundary conditions. dm is notably bad at this and
will clone lots of i/o.
A -- remap For stackeddevices, incoming i/o is remapped to device
below it in the i/o stack.The remap action details what exactly is
being remapped to what.
詳見:http://www.cse.unsw.edu.au/~aaronc/iosched/doc/blktrace.html(blktrace user guide)
實例分析
8,16 0 8 0.018543948 8191 Q W 12989792 + 24 [postgres]
8,16 0 9 0.018547191 8191 G W 12989792 + 24 [postgres]
8,16 0 10 0.018548571 8191 P N[postgres]
8,16 0 11 0.018550601 8191 I W 12989792 + 24 [postgres]
8,16 0 12 0.018551421 8191 U N [postgres] 1
8,16 0 13 0.018552618 8191 D W 12989792 + 24 [postgres]
8,16 0 14 0.018638488 8191 C W 12989792 + 24 [0]
以上就是一次IO請求的生命週期,從actions看到,分別是QGPIUDC
Q:先產生一個該位置的IO意向插入到io隊列,此時並沒有真正的請求
G:發送一個實際的Io請求給設備
P(plugging):插入:即等待即將到來的更多的io請求進入隊列,以便系統能進行IO優化,減少執行IO請求時花的時間
I:將IO請求進行調度,到這一步請求已經完全成型(formed)好了
U (unplugging):拔出,設備決定不再等待其他的IO請求並使得系統必須響應當前IO請求,將該IO請求傳給設備驅動器。可以看到,在P和U之間會等待IO,然後進行調度。這裏會對IO進行一點優化,
但是程度很低,因爲等待的時間很短,是納秒級別的
D :發佈剛纔送入驅動器的IO請求
C:結束IO請求,這裏會返回一個執行狀態:失敗或者成功,在進程號處爲0表示執行成功,反之則反
到此一個IO的週期就結束了
利用btt分析blktrace數據
blkparse只是將blktrace數據轉成可以人工閱讀的格式,由於數據量通常很大,人工分析並不輕鬆。btt是對blktrace數據進行自動分析的工具。
btt不能分析實時數據,只能對blktrace保存的數據文件進行分析。使用方法:
把原本按CPU分別保存的文件合併成一個,合併後的文件名爲sdb.blktrace.bin:
$ blkparse -i sdb -d sdb.blktrace.bin
執行btt對sdb.blktrace.bin進行分析:
$ btt -i sdb.blktrace.bin
下面是一個btt實例:
我們看到69.6173%的時間消耗在D2C,也就是硬件層,這是正常的,我們說過D2C是衡量硬件性能的指標,這裏單個IO平均0.396594毫秒,已經是相
當快了,單個IO最慢10.70692毫秒,不算壞。Q2G和G2I都很小,完全正常。I2D稍微有點大,應該是cfq scheduler的調度策略造成的,你可以試試其
它scheduler,比如deadline,比較兩者的差異,然後選擇最適合你應用特點的那個。
G2I – IO請求進入IO Scheduler所消耗的時間,包括merge的時間;
I2D – IO請求在IO Scheduler中等待的時間;
D2C – IO請求在driver和硬件上所消耗的時間;
Q2C – 整個IO請求所消耗的時間(Q2I + I2D + D2C = Q2C),相當於iostat的await。