摘要:本文就將通過(guò)對(duì)磁盤(pán)性能測(cè)試指標(biāo)及參數(shù)的介紹陌宿,來(lái)理解以上兩個(gè)原因?yàn)槭裁磿?huì)對(duì)測(cè)試結(jié)果有影響串远。
近日工作中遇到了一個(gè)磁盤(pán)壓測(cè)時(shí)性能上不去的問(wèn)題,經(jīng)排查,發(fā)現(xiàn)原因有以下幾個(gè)方面:
1 測(cè)試參數(shù)的選擇
2 業(yè)務(wù)邏輯未關(guān)閉
本文就將通過(guò)對(duì)磁盤(pán)性能測(cè)試指標(biāo)及參數(shù)的介紹托享,來(lái)理解以上兩個(gè)原因?yàn)槭裁磿?huì)對(duì)測(cè)試結(jié)果有影響。
首先來(lái)介紹一下磁盤(pán)性能的測(cè)試指標(biāo)浸赫。
最常用的磁盤(pán)性能評(píng)價(jià)指標(biāo)有兩個(gè):IOPS和吞吐量(throughput)闰围。IOPS是Input/Output Per Second的縮寫(xiě),它表示單位時(shí)間內(nèi)系統(tǒng)能處理的I/O請(qǐng)求數(shù)量既峡,即每秒鐘系統(tǒng)能處理的讀寫(xiě)次數(shù)羡榴。
吞吐量衡量單位時(shí)間內(nèi)系統(tǒng)能處理的數(shù)據(jù)的體量,即每秒鐘磁盤(pán)上能讀寫(xiě)出的數(shù)據(jù)量的大小运敢,通常以kB/s或MB/s為單位校仑。
兩個(gè)指標(biāo)相互獨(dú)立忠售,又相互關(guān)聯(lián),在不同業(yè)務(wù)場(chǎng)景下迄沫,側(cè)重關(guān)注的指標(biāo)也有所不同稻扬。
對(duì)于文件尺寸小,隨機(jī)讀寫(xiě)比較多的場(chǎng)合羊瘩,比如在線交易處理系統(tǒng)泰佳,我們傾向于更關(guān)注IOPS,因?yàn)槲覀兏诤醯氖敲棵腌娔芴幚矶嗌贄l交易尘吗。
而對(duì)于文件尺寸較大逝她,順序讀寫(xiě)比較多的場(chǎng)合,比如視頻播放服務(wù)睬捶,數(shù)據(jù)吞吐量將會(huì)成為我們主要的考量指標(biāo)黔宛。
舉個(gè)例子來(lái)幫助我們更好的理解這兩個(gè)指標(biāo)。磁盤(pán)IO就相當(dāng)于我們有貨物(數(shù)據(jù))需要從A處(系統(tǒng))與B處(磁盤(pán))之間往返擒贸。貨物(數(shù)據(jù)量)有多有少宁昭,因此運(yùn)貨車(chē)也有大有小。B處有裝卸工人負(fù)責(zé)將貨物卸載到倉(cāng)庫(kù)的指定位置酗宋,或者從倉(cāng)庫(kù)指定位置提取貨物裝載到貨車(chē)上积仗。
每次貨車(chē)運(yùn)輸一趟貨物就相當(dāng)于處理一個(gè)IO請(qǐng)求,工人裝卸貨物就相當(dāng)于磁盤(pán)對(duì)IO的讀寫(xiě)處理蜕猫。在工人數(shù)量和工人裝卸貨物速度(磁盤(pán)數(shù)據(jù)處理速度)保持一定的情況下寂曹,裝卸大車(chē)上貨物的時(shí)間一定會(huì)比小車(chē)上的時(shí)間長(zhǎng),裝卸一大車(chē)貨物的時(shí)間回右,可能已經(jīng)夠小車(chē)運(yùn)輸若干趟貨物(IOPS高)隆圆。但是小車(chē)由于多次往返,其花在路上的時(shí)間要比大車(chē)多翔烁,同時(shí)每次裝卸貨物工人需要尋找正確的位置存取貨物(磁盤(pán)尋址時(shí)間)渺氧,比起大車(chē)的一次尋址,小車(chē)運(yùn)貨就也浪費(fèi)了更多時(shí)間蹬屹。因此在相同時(shí)間內(nèi)侣背,采用大車(chē)運(yùn)輸?shù)呢浳锟偭渴潜刃≤?chē)要多的(吞吐量高)。
這也是為什么我們?cè)谧龃疟P(pán)性能測(cè)試的時(shí)候慨默,通常一次只關(guān)注一個(gè)指標(biāo)贩耐,追求IOPS,就用小車(chē)運(yùn)輸少量貨物厦取,多次往返潮太。追求吞吐量,就用大車(chē)運(yùn)送大量貨物,節(jié)省路上及尋址所花費(fèi)的時(shí)間铡买。
下面再說(shuō)一下磁盤(pán)測(cè)試的影響因素更鲁。
實(shí)際測(cè)量中,IOPS會(huì)受到很多因素的影響奇钞,比如:
1 數(shù)據(jù)塊大小
相當(dāng)于我們前面說(shuō)的大車(chē)和小車(chē)運(yùn)貨的情況
2 順序和隨機(jī)
順序就是我們的貨物都按順序安排在倉(cāng)庫(kù)的一處岁经,隨機(jī)則意味著貨物隨機(jī)的分配在倉(cāng)庫(kù)的不同地點(diǎn),可以想見(jiàn)蛇券,貨物地點(diǎn)存放比較隨機(jī)的情況下缀壤,存取貨物一定是更費(fèi)時(shí)間的。
3 隊(duì)列深度
如果我們每次只發(fā)一輛貨車(chē)在AB之間往返纠亚,那么當(dāng)貨車(chē)在A處處理貨物或者在AB之間的路上跑的時(shí)候塘慕,B處的工人就處于閑置的狀態(tài),壓力測(cè)試時(shí)蒂胞,我們絕對(duì)不希望這種情況發(fā)生图呢,我們需要工人(磁盤(pán))一直工作,從而得出磁盤(pán)的最高性能骗随。想實(shí)現(xiàn)這一點(diǎn)蛤织,我們可以通過(guò)一次發(fā)多輛車(chē)來(lái)解決,保持始終有車(chē)輛在等待處理的隊(duì)伍里鸿染,這樣裝卸工人就一直有工作可做了指蚜。
隊(duì)列深度就是等待處理的隊(duì)伍里的貨車(chē)以及正在被裝卸的貨車(chē)的總數(shù)量。
4 線程數(shù)
測(cè)試時(shí)涨椒,增加線程數(shù)也可以增加并發(fā)度摊鸡,從而使裝卸工人一直處于有工作可做的狀態(tài)。
5 讀寫(xiě)比例
讀操作相當(dāng)于我們將貨從B中的倉(cāng)庫(kù)取出來(lái)蚕冬,運(yùn)到A處就結(jié)束了免猾。而寫(xiě)操作意味著貨物在A處經(jīng)過(guò)一番處理之后還要再運(yùn)回B處并存儲(chǔ)在倉(cāng)庫(kù)中。因此不同的讀寫(xiě)比例也會(huì)造成測(cè)試結(jié)果的不同囤热。
正是由于這些不同影響因素的存在猎提,我們?cè)趯?duì)磁盤(pán)進(jìn)行性能測(cè)試時(shí),需要仔細(xì)選擇測(cè)試參數(shù)旁蔼,否則將無(wú)法測(cè)出磁盤(pán)的最優(yōu)性能锨苏。同時(shí)應(yīng)將測(cè)試參數(shù)和方法定性定量,否則測(cè)試結(jié)果將失去比較的價(jià)值牌芋。
以 云盤(pán)參數(shù)和性能測(cè)試方法:
https://help.aliyun.com/document_detail/25382.html
一文中介紹的測(cè)試IOPS的方法為例蚓炬,我們來(lái)看一下linux常用測(cè)試工具fio的參數(shù)如何體現(xiàn)以上影響因素松逊。
測(cè)試隨機(jī)寫(xiě)IOPS:fio-direct=1-iodepth=128-rw=randwrite-ioengine=libaio-bs=4k-size=1G-numjobs=1-runtime=1000-group_reporting-filename=/dev/[device]-name=Rand_Write_Testing測(cè)試隨機(jī)讀IOPS:fio-direct=1-iodepth=128-rw=randread-ioengine=libaio-bs=4k-size=1G-numjobs=1-runtime=1000-group_reporting-filename=/dev/[device]-name=Rand_Read_Testing測(cè)試寫(xiě)吞吐量:fio-direct=1-iodepth=64-rw=write-ioengine=libaio-bs=1024k-size=1G-numjobs=1-runtime=1000-group_reporting-filename=/dev/[device]-name=Write_PPS_Testing測(cè)試讀吞吐量:fio-direct=1-iodepth=64-rw=read-ioengine=libaio-bs=1024k-size=1G-numjobs=1-runtime=1000-group_reporting-filename=/dev/[device]-name=Read_PPS_Testing
其中:
iodepth:隊(duì)列深度躺屁。異步引擎下起作用。
rw: 讀寫(xiě)模式经宏,可選模式有順序?qū)憌rite犀暑、順序讀read驯击、隨機(jī)寫(xiě)randwrite、隨機(jī)讀randread耐亏、混合隨機(jī)讀寫(xiě)randrw徊都。
ioengine: 負(fù)載引擎。libaio引擎用于發(fā)起異步IO請(qǐng)求广辰。
bs: IO塊大小暇矫。
numjobs 測(cè)試線程數(shù)。
對(duì)比四個(gè)測(cè)試方法的參數(shù)我們可以看到择吊,測(cè)試IOPS時(shí)我們采用小數(shù)據(jù)塊(bs=4k)李根,測(cè)試吞吐量時(shí)則用大數(shù)據(jù)塊(bs=1024k)。這和我們前面說(shuō)到的大貨車(chē)小貨車(chē)的選擇原理是一致的几睛。
隊(duì)列深度對(duì)IOPS的影響要大于對(duì)吞吐量的影響房轿,因?yàn)槲覀儨y(cè)試IOPS時(shí)選擇的iodepth更大。但iodepth也不是越大越好所森,因?yàn)楫?dāng)裝卸工人數(shù)量囱持、裝卸貨物速度、倉(cāng)庫(kù)尋址時(shí)間一定之后焕济,單位時(shí)間內(nèi)所能處理的最大貨物量也就確定了纷妆,即磁盤(pán)的能力確定了。一味增加隊(duì)列深度晴弃,增加的只能是貨物在隊(duì)列里的等待時(shí)間凭需,即平均IO響應(yīng)時(shí)間。
我們可以通過(guò)查看裝卸工人的忙碌程度來(lái)決定是否要增加隊(duì)列深度肝匆。如果磁盤(pán)的busy%為100%粒蜈,那就表示所有工人都在一刻不停歇的裝卸貨物了,已經(jīng)不再有提升的空間旗国,此時(shí)再增加隊(duì)列深度或是數(shù)據(jù)量大小對(duì)測(cè)試結(jié)果都將是徒勞枯怖。反之,則表示磁盤(pán)壓力尚未到極限能曾,得出的數(shù)據(jù)不能代表磁盤(pán)性能最高水平度硝。
磁盤(pán)壓測(cè)時(shí)如果有其他業(yè)務(wù)邏輯在運(yùn)行會(huì)怎樣呢?這種情況就相當(dāng)于有一部分貨車(chē)裝運(yùn)的是業(yè)務(wù)邏輯的數(shù)據(jù)寿冕,而這些貨車(chē)也會(huì)占用我們的隊(duì)列和裝卸工人蕊程,測(cè)試引擎將無(wú)法百分之百的使用全部隊(duì)列和裝卸工人,那么我們的測(cè)試結(jié)果將不能體現(xiàn)整個(gè)磁盤(pán)的能力驼唱。尤其是當(dāng)業(yè)務(wù)邏輯所涉及的IO是同步(synchronous)請(qǐng)求的時(shí)候藻茂,對(duì)測(cè)試結(jié)果的影響將更大,因?yàn)橥絀O就相當(dāng)于前面說(shuō)到的一次只讓一輛車(chē)在路上跑,只有等它跑完才會(huì)發(fā)下一輛車(chē)辨赐。因此在壓力測(cè)試的時(shí)候优俘,我們需要將業(yè)務(wù)邏輯關(guān)閉的。