0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

通過對blktrace的輸出結(jié)果進(jìn)行分析讀、寫操作的磁盤塊進(jìn)行I/O頻次統(tǒng)計(jì)

Linux閱碼場 ? 來源:未知 ? 作者:李倩 ? 2018-04-03 09:48 ? 次閱讀

如果我們想知道,在一段時(shí)間內(nèi),那一個(gè)磁盤塊被讀寫的頻率最高,怎么辦?我問這個(gè)問題是看到taobao kernel wiki上面有這么一段話,看了我十分心癢:

通過對blktrace的輸出結(jié)果進(jìn)行分析,我們可以對特定時(shí)間段內(nèi)發(fā)生的讀、寫操作的磁盤塊進(jìn)行I/O頻次統(tǒng)計(jì)。結(jié)合通過將磁盤塊I/O頻度統(tǒng)計(jì)和page cache命中率統(tǒng)計(jì)相結(jié)合,就可以比較有效的判斷服務(wù)器節(jié)點(diǎn)的cache使用效率。通過這套工具,CDN系統(tǒng)修正了一個(gè)固態(tài)硬盤上cache管理的缺陷,顯著提高了I/O性能(詳細(xì)信息)淘寶大神給了一個(gè)shell腳本解決這個(gè)問題,但是我守著代碼,不知道怎么用。就研究了下blktrace和大神的代碼。常常聽淘寶的霸爺,提起blktrace。iostat,iotop這些的工具也是統(tǒng)計(jì)磁盤IO的,也非常有用,但是和blktrace比,信息過于summarized,而blktrace跟蹤了發(fā)生在塊設(shè)備層的很多事件,簡直就是整個(gè)塊設(shè)備層事件的回放。blktrace能夠trace那些事件呢?

上面這個(gè)膠片來自HP的介紹blktrace的膠片,介紹的非常好,是參考文獻(xiàn)中一篇。 這些事件都會被blktrace 捕捉到。由于這些事件要和kernel代碼中block device的work flow一一對應(yīng),目前我的功力尚不足,所以我就不一一介紹這些事件了。 blktrace輸出的東西,不是文本,是一些特殊的格式,要想可讀,需要blkparse解析blktrace的輸出。 我們看下blktrace和blkparse合作方式

這是一個(gè)比較典型的使用: blktrace -d表示monitor哪個(gè)設(shè)備,-o -表示講輸出吐出到標(biāo)準(zhǔn)輸出。 blkparse -i - 表示從標(biāo)準(zhǔn)輸入獲取信息,-o 表示講解析的內(nèi)容記錄在blkparse.out 我們看下輸出長的什么樣子:

這個(gè)膠片非常好的介紹了各個(gè)字段的含義。主次設(shè)備號,CPU ID,sequence num,time stamp PID ,起始扇區(qū)號,進(jìn)程名字比較好理解,比較難理解的是$6,$7$6中的GPQMDC,一堆字母,代表什么含義?$7的WR 又代表什么含義呢? 一個(gè)一個(gè)來,對于$6,表示的是event,官方手冊給了事件對應(yīng)表:

那么$7是干嘛的呢? 基本上是R和W,也會出現(xiàn)B和S. R表示是read操作,W表示write操作,B是barrier operation,S是synchronous operation。 看到這個(gè)blkparse的輸出,我們發(fā)現(xiàn)這些更像是raw data,需要我們挖掘背后的信息。btt這個(gè)工具就是一個(gè)分析輸出得到更高層信息的tool,他不是我們本文的重點(diǎn),我們不提他。 回到開篇的問題,如何知道which磁盤扇區(qū)被讀寫的次數(shù)最多?有了blkparse的輸出,我們完全可以做到這個(gè)統(tǒng)計(jì):淘寶的Coly大神的shell腳本已經(jīng)幫我們作了這個(gè)事情。

root@manu-hacks:~/code/shell/blkstrace_calculator# cat cal.sh

#!/bin/bash

TMP_DIR=".blktrace_cal"

# extend the blktracelogto"blockid R/W"

extend()

{

awk-v max=$2-vmod=$3'{

if(NR%max==mod&&$6=="D"&&(index($7,"R")||index($7,"W"))){

for(i=0;i<$10;?i++)?{

print $8+i" "substr($7,1,1);

}

}

}'$1|sort-k1-nr>$TMP_DIR/.tmp.$1.$3

touch $TMP_DIR/$3.ok

}

usage()

{

echo"Usage: $1 input_log [parallel_num]"

exit

}

rm-rf $TMP_DIR

mkdir $TMP_DIR

if["$1"==""];then

usage $0

fi

# does input_log exists?

if[!-f $1];then

echo"($1) not exists"

exit

fi

parallel=$2

if["$2"==""];then

parallel=4

fi

echo"[input: $1]"

max=`expr $parallel-1`

files=""

filename=`basename $1`

echo"[run $parallel process]"

foriin`seq 0 $max`

do

extend $filename $parallel $i&

files=$files" $TMP_DIR/.tmp.$filename.$i"

done

echo"processing...."

nr=0

# awk will finishifall*.ok created.

while[$nr-ne"$parallel"]

do

nr=`find $TMP_DIR-maxdepth 1-name"*.ok"|wc-l`

echo-n"."

sleep 1

done

echo""

echo"merge sort"

sort-m-k1-nr $files|uniq-c|sort-k1-nr>tmp

total=`awk'{sum+=$1}END{print sum}'tmp`

awk-v sum=$total'{

print $0"\t"$1*1000/sum;

}'tmp>result

echo"sort finish."

rm-rf $TMP_DIR

這段代碼是Coly大神的代碼,我無意抄襲前輩,只是晚輩拿來欣賞學(xué)習(xí),光榮屬于淘寶的Coly前輩。 先說parallel,這個(gè)是為了充分利用CPU資源,讓多個(gè)CPU一起來執(zhí)行extend。NR%max==mod將一個(gè)文件按照行分開,由多個(gè)進(jìn)程分別處理之。不多講。 extend的含義也比較簡單:

20397704是起始扇區(qū),+ 8表示的連續(xù)8個(gè)扇區(qū)都在本次事件之內(nèi),也就是說20397704/20397705/20397706..都是本次事件涉及的扇區(qū)。 OK,我們看下cal.sh的使用及輸出:

當(dāng)前目錄下生成了tmp和result文件:

我們可以看到,扇區(qū)號為454375583被訪問的次數(shù)為39次,占總訪問的千分之0.228744。那這個(gè)扇區(qū)屬于拿個(gè)文件呢?debugfs就可以來幫忙了.我們以訪問27次的264753359扇區(qū)為例。扇區(qū)是512字節(jié),我的文件系統(tǒng)ext4的塊大小是4K,所以根據(jù)扇區(qū)可以定位的塊號,debugfs根據(jù)塊號,可以定位到inode,再根據(jù)inode,就可定位到filename。

我們發(fā)現(xiàn),這個(gè)文件被讀寫的次數(shù)最多。誰干的? lsof來幫忙?

我們用Coly大神的腳本和blktrace/blkparse就解決了磁盤塊IO訪問頻率的統(tǒng)計(jì)。如果有個(gè)別的block被頻繁的讀取,表示cache的替換效率不高。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 磁盤
    +關(guān)注

    關(guān)注

    1

    文章

    379

    瀏覽量

    25209
  • 固態(tài)硬盤
    +關(guān)注

    關(guān)注

    12

    文章

    1463

    瀏覽量

    57370

原文標(biāo)題:使用blktrace統(tǒng)計(jì)磁盤塊I/O訪問頻率

文章出處:【微信號:LinuxDev,微信公眾號:Linux閱碼場】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    如何操作PIC24的I/O輸出高低電平

    /O輸出方向,x表示端口類別,比如TRISA就是操作A端口輸出方向的,TRISx = 0,表示輸出;TRISx = 1,表示輸入。2.PO
    發(fā)表于 11-24 07:30

    如何對RAM進(jìn)行操作

    如何對RAM進(jìn)行操作?
    發(fā)表于 01-18 06:47

    請問GPIO設(shè)定為輸出的時(shí)候進(jìn)行操作會得到什么結(jié)果?

    看了一段模擬I2C的代碼,居然是在輸出的時(shí)候進(jìn)行,不知道是不是代碼寫錯了.我認(rèn)為是作者忘記了切換IO狀態(tài).但是看到代碼這么規(guī)整,總不能沒有調(diào)試過就直接貼上來吧?請教各位大神,GPIO
    發(fā)表于 09-15 06:01

    一種高效的磁盤隊(duì)列I/O機(jī)制

    分析了傳統(tǒng)磁盤隊(duì)列的存儲管理開銷和讀寫性能,針對磁盤隊(duì)列I/O已成為影響消息服務(wù)器性能的首要瓶頸,提出了一種高效
    發(fā)表于 05-14 19:51 ?32次下載

    播出服務(wù)器磁盤I/O與緩存性能分析

    播出服務(wù)器磁盤I/O與緩存性能分析:針對電視臺專業(yè)播出服務(wù)器在播出質(zhì)量和播出性能上的高要求,提出了(s,S)策略下讀數(shù)據(jù)緩存和復(fù)用緩存與節(jié)目數(shù)量、節(jié)目數(shù)據(jù)速率、
    發(fā)表于 01-16 15:09 ?22次下載

    電池管理器件的/操作

    電池管理器件的/操作 Dallas Semiconductor 的電池管理IC 采用相同的通信協(xié)議和相同的存儲器地址不同類型的存儲器可以分別進(jìn)行
    發(fā)表于 04-12 08:50 ?21次下載

    基于小數(shù)據(jù)同步的回I/O調(diào)度器

    據(jù)將會導(dǎo)致嚴(yán)重的放大問題,使得系統(tǒng)的I/O性能大幅度降低.為了解決上述問題,提出了一種I/O
    發(fā)表于 12-26 18:05 ?0次下載

    關(guān)于標(biāo)準(zhǔn)I/O庫執(zhí)行I/O操作

    當(dāng)在輸入和輸出中遇到換行符時(shí),標(biāo)準(zhǔn)I/O庫執(zhí)行I/O操作。這允許我們一次
    的頭像 發(fā)表于 07-01 17:17 ?2396次閱讀

    如何使用QSPI Flash控制器開發(fā)板上的 QSPI Flash進(jìn)行操作

    學(xué)習(xí)內(nèi)容 本文首先介紹Flash和QSPI Flash控制器的相關(guān)內(nèi)容,然后使用 QSPI Flash 控制器,開發(fā)板上的 QSPI Flash 進(jìn)行、 操作。
    的頭像 發(fā)表于 06-10 17:08 ?1.4w次閱讀
    如何使用QSPI Flash控制器開發(fā)板上的 QSPI Flash<b class='flag-5'>進(jìn)行</b><b class='flag-5'>寫</b><b class='flag-5'>讀</b><b class='flag-5'>操作</b>

    PIC24HJ128GP506A I/O,定時(shí)器中斷操作

    /O輸出方向,x表示端口類別,比如TRISA就是操作A端口輸出方向的,TRISx = 0,表示輸出;TRISx = 1,表示輸入。2.PO
    發(fā)表于 11-16 16:06 ?3次下載
    PIC24HJ128GP506A <b class='flag-5'>I</b>/<b class='flag-5'>O</b>,定時(shí)器中斷<b class='flag-5'>操作</b>

    Linux磁盤I/O的性能指標(biāo)和查看性能工具

    在我之前的文章:《探討 Linux 的磁盤 I/O》中,我談到了 Linux 磁盤 I/O 的工
    的頭像 發(fā)表于 05-14 15:21 ?2636次閱讀

    使用System IO Ports SerialPort進(jìn)行串行/

    電子發(fā)燒友網(wǎng)站提供《使用System IO Ports SerialPort進(jìn)行串行/.zip》資料免費(fèi)下載
    發(fā)表于 11-21 09:56 ?0次下載
    使用System IO Ports SerialPort<b class='flag-5'>進(jìn)行</b>串行<b class='flag-5'>讀</b>/<b class='flag-5'>寫</b>

    為什么異步fifo中地址同步在時(shí)鐘域時(shí)序分析通過?

    為什么異步fifo中地址同步在時(shí)鐘域時(shí)序分析通過? 異步FIFO中地址同步在時(shí)鐘域時(shí)序
    的頭像 發(fā)表于 10-18 15:23 ?746次閱讀

    Linux系統(tǒng)下I/O操作講解

    Linux系統(tǒng)下I/O 一、I/O簡介 I/O(輸入/輸出
    的頭像 發(fā)表于 11-08 15:13 ?1245次閱讀
    Linux系統(tǒng)下<b class='flag-5'>I</b>/<b class='flag-5'>O</b><b class='flag-5'>操作</b>講解

    磁盤I/O是怎么工作的

    同前面講述的CPU、內(nèi)存一樣,文件系統(tǒng)和磁盤I/O,也是Linux操作系統(tǒng)最核心的功能。 磁盤為系統(tǒng)提供了最基本的持久化存儲。 文件系統(tǒng)則在
    的頭像 發(fā)表于 11-13 11:20 ?1047次閱讀
    <b class='flag-5'>磁盤</b><b class='flag-5'>I</b>/<b class='flag-5'>O</b>是怎么工作的