#IOPS計(jì)算方法
傳統(tǒng)磁盤本質(zhì)上一種機(jī)械裝置,如FC, SAS, SATA磁盤,轉(zhuǎn)速通常為5400/7200/10K/15K rpm不等。影響磁盤的關(guān)鍵因素是磁盤服務(wù)時(shí)間,即磁盤完成一個(gè)I/O請(qǐng)求所花費(fèi)的時(shí)間,它由尋道時(shí)間、旋轉(zhuǎn)延遲和數(shù)據(jù)傳輸時(shí)間三部分構(gòu)成。
尋道時(shí)間Tseek是指將讀寫磁頭移動(dòng)至正確的磁道上所需要的時(shí)間。尋道時(shí)間越短,I/O操作越快,目前磁盤的平均尋道時(shí)間一般在3-15ms。
旋轉(zhuǎn)延遲Trotation是指盤片旋轉(zhuǎn)將請(qǐng)求數(shù)據(jù)所在扇區(qū)移至讀寫磁頭下方所需要的時(shí)間。旋轉(zhuǎn)延遲取決于磁盤轉(zhuǎn)速,通常使用磁盤旋轉(zhuǎn)一周所需時(shí)間的1/2表示。比如,7200 rpm的磁盤平均旋轉(zhuǎn)延遲大約為60*1000/7200/2 = 4.17ms,而轉(zhuǎn)速為15000 rpm的磁盤其平均旋轉(zhuǎn)延遲約為2ms。
數(shù)據(jù)傳輸時(shí)間Ttransfer是指完成傳輸所請(qǐng)求的數(shù)據(jù)所需要的時(shí)間,它取決于數(shù)據(jù)傳輸率,其值等于數(shù)據(jù)大小除以數(shù)據(jù)傳輸率。目前IDE/ATA能達(dá)到133MB/s,SATA II可達(dá)到300MB/s的接口數(shù)據(jù)傳輸率,數(shù)據(jù)傳輸時(shí)間通常遠(yuǎn)小于前兩部分時(shí)間。因此,理論上可以計(jì)算出磁盤的大IOPS,即IOPS = 1000 ms/ (Tseek + Troatation),忽略數(shù)據(jù)傳輸時(shí)間。假設(shè)磁盤平均物理尋道時(shí)間為3ms, 磁盤轉(zhuǎn)速為7200,10K,15K rpm,則磁盤IOPS理論大值分別為,
IOPS = 1000 / (3 + 60000/7200/2) = 140
IOPS = 1000 / (3 + 60000/10000/2) = 167
IOPS = 1000 / (3 + 60000/15000/2) = 200
固態(tài)硬盤SSD是一種電子裝置, 避免了傳統(tǒng)磁盤在尋道和旋轉(zhuǎn)上的時(shí)間花費(fèi),存儲(chǔ)單元尋址開銷大大降低,因此IOPS可以非常高,能夠達(dá)到數(shù)萬(wàn)甚至數(shù)十萬(wàn)。實(shí)際測(cè)量中,IOPS數(shù)值會(huì)受到很多因素的影響,包括I/O負(fù)載特征(讀寫比例,順序和隨機(jī),工作線程數(shù),隊(duì)列深度,數(shù)據(jù)記錄大小)、系統(tǒng)配置、操作系統(tǒng)、磁盤驅(qū)動(dòng)等等。因此對(duì)比測(cè)量磁盤IOPS時(shí),必須在同樣的測(cè)試基準(zhǔn)下進(jìn)行,即便如何也會(huì)產(chǎn)生一定的隨機(jī)不確定性。通常情況下,IOPS可細(xì)分為如下幾個(gè)指標(biāo):
Toatal IOPS,混合讀寫和順序隨機(jī)I/O負(fù)載情況下的磁盤IOPS,這個(gè)與實(shí)際I/O情況最為相符,大多數(shù)應(yīng)用關(guān)注此指標(biāo)。
1、Random Read IOPS,100%隨機(jī)讀負(fù)載情況下的IOPS。
2、Random Write IOPS,100%隨機(jī)寫負(fù)載情況下的IOPS。
3、Sequential Read IOPS,100%順序負(fù)載讀情況下的IOPS。
4、Sequential Write IOPS,100%順序?qū)懾?fù)載情況下的IOPS。
IOPS的測(cè)試benchmark工具主要有Iometer, IoZone, FIO等,可以綜合用于測(cè)試磁盤在不同情形下的IOPS。對(duì)于應(yīng)用系統(tǒng),需要首先確定數(shù)據(jù)的負(fù)載特征,然后選擇合理的IOPS指標(biāo)進(jìn)行測(cè)量和對(duì)比分析,據(jù)此選擇合適的存儲(chǔ)介質(zhì)和軟件系統(tǒng)。
#下載http://freshmeat.net/projects/fio/
#安裝fio-2.0.13.tar.gz之前需要安裝開發(fā)工具包、libaio和libaio-devel
yum installgroup "Development tools" OR:yum install gccyum install libaio-0.3.107-10.el6.x86_64.rpm libaio-devel-0.3.107-10.el6.x86_64.rpm
#fio參數(shù)
filename=/dev/sdb1 測(cè)試文件名稱,通常選擇需要測(cè)試的盤的data目錄。
direct=1 測(cè)試過(guò)程繞過(guò)機(jī)器自帶的buffer。使測(cè)試結(jié)果更真實(shí)。
rw=randwrite 測(cè)試隨機(jī)寫的I/O
rw=randrw 測(cè)試隨機(jī)寫和讀的I/O
bs=16k 單次io的塊文件大小為16k
bsrange=512-2048 同上,提定數(shù)據(jù)塊的大小范圍
size=5g 本次的測(cè)試文件大小為5g,以每次4k的io進(jìn)行測(cè)試。
numjobs=30 本次的測(cè)試線程為30.
runtime=1000 測(cè)試時(shí)間為1000秒,如果不寫則一直將5g文件分4k每次寫完為止。
ioengine=psync io引擎使用pync方式
rwmixwrite=30 在混合讀寫的模式下,寫占30%
group_reporting 關(guān)于顯示結(jié)果的,匯總每個(gè)進(jìn)程的信息。
此外
lockmem=1g 只使用1g內(nèi)存進(jìn)行測(cè)試。
zero_buffers 用0初始化系統(tǒng)buffer。
nrfiles=8 每個(gè)進(jìn)程生成文件的數(shù)量。
bssplit=512/20:1k/20:2k/10:4k/40:8k/10
#2成512B,1KB,1成2KB,4成4KB,1成8KB的小文件進(jìn)行測(cè)試
rw=randrw
rwmixread=80 #8成讀,2成寫
direct=1 #不使用io設(shè)備buffer
size=4g
numjobs=16 #產(chǎn)生16個(gè)進(jìn)程
nrfiles=8 #每1個(gè)進(jìn)程生成文件數(shù)量
ioengine=libaio
#IO engine,種類豐富,測(cè)試nfs,cpu,nic使用不同的引擎。
directory=/mnt
# IOMeter defines the server loads as the following:
# iodepth=1 Linear
# iodepth=4 Very Light
# iodepth=8 Light
# iodepth=64 Moderate
# iodepth=256 Heavy
iodepth=64 #每個(gè)文件io隊(duì)列長(zhǎng)度
lockmem=1g #fio只使用1g內(nèi)存進(jìn)行測(cè)試
zero_buffers 用0初始化系統(tǒng)buffer
一般fio配置文件和參數(shù)都是支持k/m/g的標(biāo)識(shí)
#dd測(cè)試
1. dd if=/dev/zero of=test bs=64k count=16k
這個(gè)很不準(zhǔn)確的,因?yàn)槊罱Y(jié)束的時(shí)候數(shù)據(jù)還沒有真正寫到磁盤上去
2. dd if=/dev/zero of=test bs=64k count=16k conv=fsync
這個(gè)還算準(zhǔn)確,數(shù)據(jù)已經(jīng)寫入磁盤
3. dd if=/dev/zero of=test bs=64k count=4k oflag=dsync
這個(gè)可以當(dāng)成是模擬數(shù)據(jù)庫(kù)插入操作,所以很慢
接著讓我們來(lái)看看buyvm的磁盤性能
dd if=/dev/zero of=test bs=64k count=16k
1073741824 bytes (1.1 GB) copied, 2.99687 seconds, 358 MB/s
第一種方式得到的結(jié)果貌似很快
dd if=/dev/zero of=test bs=64k count=16k conv=fsync
1073741824 bytes (1.1 GB) copied, 13.9241 seconds, 77.1 MB/s
這次慢了很多,這個(gè)數(shù)據(jù)才有參考價(jià)值
dd if=/dev/zero of=test bs=64k count=2k oflag=dsync
134217728 bytes (134 MB) copied, 177.813 seconds, 755 kB/s
這是buyvm的真正實(shí)力,我在84的vps上測(cè)可是有20M/s的
#HP DL2000 兩塊300G的SAS盤做成RAID1
1、直接讀塊設(shè)備,fio和dd測(cè)試吞吐量和IOPS
[root@localhost ~]# cat test.cfg
[global]
bs=1024k
ioengine=libaio
iodepth=4
size=1g
direct=1
filename=/dev/sda4
zero_buffers
[seq-read]
rw=read
stonewall
測(cè)試結(jié)果:
read : io=1024.0MB, bw=183735KB/s, iops=179 , runt= 5707msec
[root@localhost ~]# dd if=/dev/zero of=/dev/sda4 bs=16k count=65536 conv=fsync
65536+0 records in65536+0 records out
1073741824 bytes (1.1 GB) copied, 5.85287 s, 183 MB/s
2、通過(guò)讀ext4文件系統(tǒng),fio和dd測(cè)試吞吐量和IOPS
[root@localhost ~]# cat test.cfg
[global]
bs=1024k
ioengine=libaio
iodepth=4
size=1g
direct=1
filename=file
directory=/mnt
zero_buffers
[seq-read]
rw=read
stonewall
測(cè)試結(jié)果:
read : io=1024.0MB, bw=167264KB/s, iops=163 , runt= 6269msec
[root@localhost ~]# dd if=/dev/zero of=/mnt/file bs=16k count=65536 conv=fsync
65536+0 records in65536+0 records out
1073741824 bytes (1.1 GB) copied, 6.66798 s, 161 MB/s
#一起測(cè)試順序讀、隨機(jī)讀、順序?qū)憽㈦S機(jī)寫
[seq-read]
rw=read
stonewall
[rand-read]
rw=randread
stonewall
[seq-write]
rw=write
stonewall
[rand-read]
rw=randwrite
stonewall
[read-write]
rw=randrw
stonewall