LinuxIO性能優(yōu)化基礎工具和實踐_第1頁
LinuxIO性能優(yōu)化基礎工具和實踐_第2頁
LinuxIO性能優(yōu)化基礎工具和實踐_第3頁
LinuxIO性能優(yōu)化基礎工具和實踐_第4頁
LinuxIO性能優(yōu)化基礎工具和實踐_第5頁
已閱讀5頁,還剩40頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

LinuxIO性能優(yōu)化基礎工具和實踐基礎篇-Linux

IO

stackoverview基礎篇-readsyscallIOstack工具篇-iostat數(shù)據(jù)可靠嗎工具篇-blktrace原理和應用工具篇-debugfs應用Cacheserver機械盤IO性能瓶頸分析實踐篇-IO性能優(yōu)化之文件壓縮實踐篇-IO性能優(yōu)化之shortstroking實踐篇-IO性能優(yōu)化之減小元數(shù)據(jù)寫入實踐篇-IO性能優(yōu)化之SSD減少機械盤的IOPSLinuxIOstackoverviewP1Linux

IOstackoverviewP2Linux

IOstackoverviewP3Linux

IOstackoverviewP4readsyscallIOstackblockcorelayerblk-core.c/elevator.cblk_queue_bioIOstack(blockcore)blk_partition_remapblk_queue_bio__generic_make_requestelv_queue_empty?blk_plug_deviceelv_mergeBACK_MERGEFRONT_MERGEget_request_wait__elv_add_requestq->request_fn__generic_unplug_deviceelv_insertscsi_request_fnblk_peek_requestblktraceabstract功能:blktrace是一個針對Linux內(nèi)核塊設備I/O層的跟蹤工具,可以獲取I/O請求隊列的各種詳細的情況,如IO請求提交,入隊,合并,完成等等一些列的信息:進行讀寫的進程名稱、進程號、執(zhí)行時間、讀寫的物理塊號、塊大小等。架構:blktrace分內(nèi)核空間和用戶空間兩部分實現(xiàn),內(nèi)核空間里面主要是給塊層IO路徑上的關鍵點添加tracepoint,再通過debugfs輸出。工具組成:blktrace:收集原始信息blkparse:格式化輸出blktrace

eventsblktrace狀態(tài)含義及所屬tracepointblktraceeventsatIOstackQblk_partition_remapblk_queue_bio__generic_make_requestelv_queue_empty?blk_plug_deviceelv_mergeAPBACK_MERGEFRONT_MERGENO_MERGEget_request_wait__elv_add_requestq->request_fn__generic_unplug_deviceFMtrace_block_sleeprqget_requestSGelv_insertIUnplugduetoTimeoutorthrottlescsi_request_fnscsi_end_requestblk_end_requestblk_peek_requestopen_softirq(BLOCK_SOFTIRQ,blk_done_softirq)scsi_softirq_doneCDblktrace

usageBlktrace使用(CONFIG_BLK_DEV_IO_TRACE)#mount-tdebugfsnone/sys/kernel/debug#blktrace-d/dev/sdb-o-|blkparse-i--oblk.parsedblktrace

outputBlktrace輸出解析Blktrace輸出解析數(shù)值說明8,64major/minor1CPUID1Sequence0.000000000Tiemstamp6936PidAActionidentifitorRR/Wtype(opt:R|W|D|B|S)646562863+16<-(8,65)646562800Sectorremap(basedontracepoint)blktrace:blkiomon

blktrace實時監(jiān)控IO#blktrace/dev/sde-aissue-acomplete-w50-o-|blkiomon-I10-h-blktrace

filter(shell)#!/bin/bashforpatternin`catsde.log.trim|grep"C"|awk'{print$8}'`do catsde.log.trim|grep$pattern>tmp_trunk s_time=`cattmp_trunk|head-n1|awk'{print$4}'` e_time=`cattmp_trunk|tail-n1|awk'{print$4}'` diff_time=`echo"$e_time-$s_time"|bc` diff_time=`printf"%.2f"$diff_time` if[`echo"$diff_time>0.5"|bc`-eq1];then cattmp_trunk echo"======duration(s):$diff_time" fidoneblktrace分析性能IO性能由好變差的blktrace信息,篩選'issued',對比發(fā)送到驅(qū)動隊列IO的大小#catblk.parsed-ok2bad|grepDblktrace分析性能IO性能由好變差的blktrace信息,篩選‘Complete',對比驅(qū)動完成請求的大小#catblk.parsed-ok2bad|grepCblktrace分析性能IO差IO不能合并的blktrace信息IO好IO可以合并的blktrace信息blktrace分析性能debugfs

usageblktrace有感興趣的sectorNo.?根據(jù)sectorNo.找到文件(sector:1305783464)注意:輸出的文件路徑不包含掛載目錄。sectorNo.是分區(qū)內(nèi)部的偏移量(blktrace看到的'Aevent'的'<-'右邊部分)。$catfind_blkparse_A_block.shforsectorin`cattxt|grepA|awk'{print$NF}'|sort|uniq`do block=`echo$sector/8|bc`; inode=`debuge4fs-R"icheck$block"/dev/sda32>&1|tail-n1|awk'{print$2}'` echo-n"inode$inode\t" debuge4fs-R"ncheck$inode"/dev/sda32>&1|tail-n1doneiostat

abstract幾個問題:iostat磁盤數(shù)據(jù)源頭:/proc/diskstats/proc/diskstats何時更新iostat如何計算輸出/proc/diskstats信息iostat靠譜?哪些指標存在疑問基本使用:-t打印時間戳,-xextended模式輸出,-k吞吐率以KB為單位(-mMB)/proc/diskstats前三個字段,主次設備號以及盤符。有統(tǒng)計意義的是后面11個域:域1-4表示讀請求累計統(tǒng)計值;域5-8表示寫請求統(tǒng)計值;域9-11表示磁盤(分區(qū))的累計統(tǒng)計值。第1個域:讀請求成功完成總數(shù)。

=>r/s,avgrq-sz第2個域:讀請求合并的總數(shù),即鄰近的請求合并成一個請求,一次IO操作。

=>rrqm/s第3個域:讀扇區(qū)的總數(shù)(512B)。

=>rsec/s=>rkB/s,avgrq-sz第4個域:讀請求花費的總毫秒數(shù)。

=>r_await第5-8域:同1-4,表示寫請求的統(tǒng)計。第9個域:當前(實時)未完成的I/O請求個數(shù)。

=>不直接輸出,但用于估算avgqu-sz第10個域:磁盤或分區(qū)花在I/O操作上的毫秒數(shù),表示磁盤或者分區(qū)忙碌的時間。

=>%util,svctm第11個域:磁盤或分區(qū)花在I/O操作上的毫秒數(shù)的加權(域9*域10的增量)

=>avgqu-sz/proc/diskstats何時更新structdisk_stats{unsignedlongsectors[2];/*READs/WRITEs,increaseonIOrequestfinish

@blk_end_request<-blk_account_io_completion

*/unsignedlongios[2];/*increaseonIOrequestfinish

@blk_end_request<-blk_account_io_done*/unsignedlongmerges[2];/*increaseonIOblock-layerentry

@q->make_request_fni.e.blk_queue_bio*/unsignedlongticks[2];/*increaseonIOrequestfinish

@blk_end_request<-blk_account_io_done.INCREMENT:jiffies-req->start_time*/unsignedlongio_ticks;/*increaseonI/Ostart/merge/finish/diskstats_show

INCREMENT:now-part->stamp

*/unsignedlongtime_in_queue;/*thesameasio_ticksupdatebutwith

INCREMENT:

part_in_flight(part)*(now-part->stamp)

*/};未完成的請求(IO調(diào)度器隊列或者devicequeue):part->in_flight[rw]++;/*increaseonIOrequestblock-layerentry

@q->make_request_fni.e.blk_queue_bio

*/part->in_flight[rw]--;/*decreaseonIOrequestfinish,i.e.

@blk_end_request<-blk_account_io_done*/IO活躍點采樣iostat計算輸出/proc/diskstatsiostat計算輸出/proc/diskstatsrrqm/s:IO調(diào)度器層面讀請求每秒被merge的次數(shù)#rd_merges[1]-rd_merges[0]r/s:磁盤每秒完成讀請求的次數(shù)#rd_ios[1]-rd_ios[0]avgrq-sz:磁盤每秒完成的讀請求平均大小(512B)#(rd_sec+wr_sec)/nr_iosavgqu-sz:平均隊列長度(IO調(diào)度層以及驅(qū)動隊列所有未完成請求個數(shù)加權平均)#(rq_ticks[1]-rq_ticks[0])/1000await:請求的平均等待時間(請求創(chuàng)建(進入塊層)到請求完成(磁盤返回)的時間)#((rd_ticks[1]-rd_ticks[0])+(wr_ticks[1]-wr_ticks[0]))/nr_iosutil:磁盤使用率,準確意思是磁盤驅(qū)動忙碌的時間(塊層或以下有活躍的request)#(tot_ticks[1]-tot_ticks[0])/1000*100%svctm:請求被磁盤服務的平均時間(根據(jù)磁盤驅(qū)動活躍時間的計算平均值)#util/nr_iosiostat靠譜?哪些指標存在疑問svctm:請求被磁盤服務的平均時間(僅僅根據(jù)塊層的驅(qū)動活躍時間計算,實際上沒有準確記錄磁盤物理上處理請求的具體時間)manpage:Theaverageservicetime(svctmfield)valueismeaningless,asI/Ostatisticsarenowcalculatedatblocklevel,andwedon'tknowwhenthediskdriverstartstoprocessarequest.Forthisreason,thisfieldwillberemovedinafuturesysstatversion.%util:磁盤使用率,傳統(tǒng)意義上單隊列的機械盤,100%表示滿負荷。但對于SSD或者raid磁盤陣列可以并行處理多個請求的,100%不一定意味著跑滿。比如串行的每個jiffies都有請求到來,按iostat的計算方法,驅(qū)動服務時間就是跑滿的(每個時間點都有活躍的請求)。但是實際上每個jiffiesSSD或者raid可以并發(fā)多個請求。manpage:PercentageofelapsedtimeduringwhichI/Orequestswereissuedtothedevice(bandwidthutilizationforthedevice).Devicesaturationoccurswhenthisvalueiscloseto100%fordevicesservingrequestsserially.Butfordevicesservingrequestsinparallel,suchasRAIDarraysandmodernSSDs,thisnumberdoesnotreflecttheirperformancelimits.Forsuchdevices%utilessentiallyindicatesthepercentageoftimethatthedevicewasbusyservingatleastonerequest.Unfortunately,thistellsusnothingaboutthemaximumnumberofrequestssuchadevicecanhandle,andassuchthisvalueisuselessasasaturationindicatorforSSDsandRAIDarrays.絕大部分時候這兩個指標還是有參考意義的。iostat

await/svctm異常解析Time:03:48:23PMDevice:rrqm/swrqm/sr/sw/srkB/swkB/savgrq-szavgqu-szawaitsvctm%utilsda30.000.000.000.000.000.000.000.000.000.000.00Time:03:48:28PMDevice:rrqm/swrqm/sr/sw/srkB/swkB/savgrq-szavgqu-szawaitsvctm%utilsda30.0021.720.004.100.0038.5218.8033.7878.30243.9099.96Time:03:48:29PMDevice:rrqm/swrqm/sr/sw/srkB/swkB/savgrq-szavgqu-szawaitsvctm%utilsda30.0022.000.0045.000.00584.0025.961.733666.8010.5647.50分析:await超級大(大于1秒):觀察iostat時間戳,iostat輸出因未知原因卡住5秒(實際服務器非網(wǎng)絡原因很卡)。推測請求在很早前(如5秒前)發(fā)出,但因卡頓沒有得到服務,5秒后批量完成,await接近卡頓時間。svctm(幾百毫秒,根據(jù)現(xiàn)代磁盤的IOPS能力,正常最多20左右)超級大:svctm是某個時間段磁盤“有未完成的IO請求計時”累計的每秒平均,當前的統(tǒng)計interval之間只要有完成的IO,如這里4.1w/s,即按計算值輸出,沒有IO完成不輸出。實際請求完成的時間到達不均勻(這里還可能磁盤軟中斷返回處理的問題)。比如磁盤一秒中發(fā)出52個請求,假設導致磁盤持續(xù)2秒忙碌,但第一秒實際只完成了2個請求,則svctm=500(1000/2=500)。第二秒完成50個,svctm=20(1000/50=20)PS.上次那批未知原因的svctm超標的機器,用dd加壓讀寫,svctm看起來不會有問題,是因為dd產(chǎn)生很多的IO請求,所以svctm的指標被平均了,看起來就不高。是否因為某些特殊的SCSI磁盤指令無法及時完成?IO性能瓶頸(磁盤跑滿)Throughput和IOPS兩個參數(shù)是衡量存儲性能的主要指標,都有上限。Throughput表示每秒數(shù)據(jù)的傳輸總量,即IO帶寬。IOPS表示存儲每秒傳輸IO的數(shù)量,即IO次數(shù)(主要是磁頭seek)。1.磁盤跑滿throughput瓶頸[root@pj16mnt]#ddif=/dev/zeroof=/mnt/test.datbs=8Mcount=256oflag=direct256+0recordsin256+0recordsout2147483648bytes(2.1GB)copied,10.772seconds,199MB/s2.磁盤跑滿IOPS瓶頸[root@pj16mnt]#./seeker/dev/sdb1Seekerv2.0,2007-01-15,/how_fast_is_your_disk.htmlBenchmarking/dev/sdb1[953869MB],wait30secondsResults:69seeks/second,14.49msrandomaccesstime影響機械盤IOPS的因子IO_Time=Seek_Time+Rotation_Delay+Transfer_TimeSeek_Time磁頭尋道時間(最壞情況最內(nèi)圈<->最外圈),7200rmp硬盤的平均一般4.5ms(希捷ST2000DM001讀取:<8.5ms,寫入:<9.5ms)。Rotation_Delay磁頭旋轉(zhuǎn)到目標扇區(qū),最壞完整一圈,7200rpm硬盤平均(60s/7200)*(1/2)=4.2ms。Transfer_Time數(shù)據(jù)傳輸時間=IOChunkSize/MaxTransferRate,實際測試順序度速度平均在140~150MB。IOPS=1/IO_Time=1/(SeekTime+60sec/RotationalSpeed/2+IOChunkSize/TransferRate)Seek_time和Rotaion_Delay實際和讀寫并發(fā)數(shù)以及數(shù)據(jù)存放是否連續(xù)有關。假設Seek_time和Rotaion_Delay按平均取值,給定不同的IO大小,IOPS:4K(1/8.73ms=114IOPS)4.5ms+4.2ms+4KB/140MB=4.5+4.2+0.03=8.73128K(1/9.6ms=104IOPS)

4.5ms+4.2ms+128KB/140MB=4.5+4.2+0.9

=9.6

512K(1/12.4ms=80IOPS)

4.5ms+4.2ms+512KB/140MB=4.5+4.2+3.7

=12.4

(512KB預讀依據(jù),傳輸時間和seek時間同一量級)1MB(1/15.8ms=63IOPS)

4.5ms+4.2ms+1MB/140MB=4.5+4.2+7.1=15.88MB(1/65.7ms=15IOPS)

4.5ms+4.2ms+MB/140MB=4.5+4.2+57=65.7SSD與機械盤IOPS/ThroughputCDNcacheserverIO性能瓶頸CDNcacheserver磁盤跑高iostat的通常情況(svctm正常磁盤沒壞)throughput遠遠沒有達到磁盤IO的最大吞吐量(100MB以上),而IOPS(r/s+w/s)基本上達到SATA機械盤的IOPS上限。結論是cacheserverIO的瓶頸是存儲的IOPS,IO性能優(yōu)化的主要方向是減少磁盤IOPS,減少上層應用/文件系統(tǒng)每個請求的引發(fā)磁盤IOseek的次數(shù)。IO性能優(yōu)化1-文件壓縮數(shù)據(jù)壓縮思想是通過CPU運算壓縮數(shù)據(jù),節(jié)省存儲空間,犧牲CPU時間來換空間。首要問題是,文本信息之外的cacheobject都很難壓縮(圖片、視頻),線上驗證過btrfs的數(shù)據(jù)壓縮的效果,壓縮率很低(~3%),IO總體情況沒有明顯的改善。其次ext4上實現(xiàn)太復雜,尤其文件不是一次性寫入的情況,比如分段緩存的情況(涉及到原來存儲的數(shù)據(jù)讀出解壓,再組合一起,然后壓縮寫入),如果文件原來的位置沒有預留合理的空間,會引發(fā)更多的文件碎片。另外,從機械盤的IO瓶頸來看,機械磁盤絕對的吞吐量還是夠強的,只要數(shù)據(jù)存儲物理上是連續(xù)的,性能還是夠高的。碎片引發(fā)的seek代價會更大。IO性能優(yōu)化2-shortstrokeShortstroking思想ShortstrokingisatermusedinenterprisestorageenvironmentstodescribeanHDDthatispurposelyrestrictedintotalcapacitysothattheactuatoronlyhastomovetheheadsacrossasmallernumberoftotaltracks.[17]Thislimitsthemaximumdistancetheheadscanbefromanypointonthedrivetherebyreducingitsaverageseektime,butalsorestrictsthetotalcapacityofthedrive.ThisreducedseektimeenablestheHDDtoincreasethenumberofIOPSavailablefromthedrive.大意是分區(qū)限制磁盤磁頭的最大可以移動的范圍,可以減少seektime,提高IOPS。另外一個就是機械磁盤的外道容量大,同樣的角速度掃過的面積更大,吞吐量越高。IO性能優(yōu)化2-shortstrokeShortstroking

主要靠分區(qū)實現(xiàn),比如分成兩個區(qū),并且第二個分區(qū)空置不用。對于那種只有一塊1T系統(tǒng)盤的有大量空間浪費的可以考慮。文件系統(tǒng)修改基本不管用,因為無法保證高LBA的扇區(qū)完全不被使用,除非完全屏蔽,這個和分區(qū)也沒多大區(qū)別了。ext4的維護者曾經(jīng)也發(fā)過類似的patch,但是很快被否決了:IO性能優(yōu)化3-減少ext4元數(shù)據(jù)寫入

ext4文件系統(tǒng)布局IO性能優(yōu)化3-減少ext4元數(shù)據(jù)寫入

Squid的目錄結構cache0cache1cache2cache3cache0...cache9000102...3F000102...FEFF2TDISK總共4*10*64*256=65萬個底層目錄65萬個底層目錄在磁盤中基本散開,每個子目錄下的文件也跟隨目錄在磁盤中散開:線上的機器實際存放文件個數(shù)200萬到-1000萬之間IO性能優(yōu)化3-減少ext4元數(shù)據(jù)寫入

ext4inode/block分配inode總體原則:數(shù)據(jù)局部性1.磁盤頂層目錄inode參考flex_bg的(avefreei/avefreeb/used_dirs)指標找一個的最優(yōu)(空文件系統(tǒng)可選flex_bg不止一個,隨機生成散開)2.子目錄inode從父目錄所在的flex_bg開始(優(yōu)先),找一個符合(min_blocks/min_inodes/max_dirs)指標范圍flex_bg3.文件inode盡可能分配在父目錄inode的所在的flex_bg(依據(jù)是同一個目錄下的文件是相關)文件數(shù)據(jù)塊分配1.delaywrite&基于extent的multi-block分配(減少碎片),vfswriteback每次最大觸發(fā)2048個block(8MB)的回寫2.從文件inode所在的blockgroup分配(減少seek),但這個hint會被下面3覆蓋。3.根據(jù)文件大小選擇groupprealloc或者inodeprealloc策略(減少碎片).3.1>64K(16block)的文件物理塊分配共享全局的EXT4_MB_STREAM_ALLOC游標,因此有多個并發(fā)寫入,會相互交叉,但是對于8MB大小的碎片認為可以忽略。3.2<=64K的文件使用percpu預分配的2MB的空間,用光了根據(jù)2來指定初始分配位置IO性能優(yōu)化3-減少ext4元數(shù)據(jù)寫入

activeinodespacktogether寫入/刪除涉及文件系統(tǒng)目錄信息及各種元數(shù)據(jù)的更新,包括目錄dentry/groupdesc/blockbitmap/inodebitmap/inodetable更新思路:需要寫入的inode盡可能放在一起,包括臟目錄以及文件的inode結果:沒明顯效果推測可能原因:aCDNcachedisk讀的量更多得多,

IOPS主要主要用在讀上b因為目錄是預先分配的,目錄創(chuàng)建后inode位置固定,而文件inode

根據(jù)目錄來分配,并且各個底層目錄inode寫入很難保持步調(diào)一致,無法達到預期IO性能優(yōu)化4-減少磁盤的IOPS

元數(shù)據(jù)/目錄/間接塊/小文件放入SSD/碎片1.CDNcache主要是讀,并且多個進程同時讀寫,因為目錄存放的文件沒有相關性,讀請求隨機(seek多),讀文件(內(nèi)存沒命中)至少三次磁盤查找:

a文件目錄項檢索(上級dentry不在內(nèi)存,則逐級查找讀盤)

b文件inode信息讀取(dentry->inode)

c文件數(shù)據(jù)讀入(是否有碎片),涉及訪問文件間接塊(index)思路:SSD的IOPS很強,正適合上述隨機信息的讀入,對于減緩機械盤的IOPS壓力應該比較有效果。2.減少碎片,盡可能順序讀寫,也能減輕磁

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論