blktrace結合btt分析IO性能

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,比較兩者的差異,然後選擇最適合你應用特點的那個。


Q2G – 生成IO請求所消耗的時間,包括remap和split的時間;
G2I – IO請求進入IO Scheduler所消耗的時間,包括merge的時間;
I2D – IO請求在IO Scheduler中等待的時間;
D2C – IO請求在driver和硬件上所消耗的時間;
Q2C – 整個IO請求所消耗的時間(Q2I + I2D + D2C = Q2C),相當於iostat的await。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章