I/O輸入/輸出(Input/Output),讀和寫,提高緩存(cache)和做磁盤陣列(RAID)能提高存儲IO性能。
IOPS (英文:Input/Output Operations Per Second),即每秒進行讀寫(I/O)操作的次數,多用於數據庫、存儲等場合,衡量隨機訪問的性能。
存儲端的IOPS性能和主機端的IO是不同的,IOPS是指存儲每秒可接受多少次主機發出的訪問,主機的一次IO需要三次訪問存儲纔可以完成。例如,主機寫入一個最小的數據塊,也要經過“發送寫入請求、寫入數據、收到寫入確認”等三個步驟,也就是3個存儲端訪問。
Linux下常用Fio、dd工具, Windows下常用IOMeter。
FIO是測試IOPS的非常好的工具,用來對硬件進行壓力測試和驗證,支持13種不同的I/O引擎,包括:sync,mmap, libaio, posixaio, SG v3, splice, null, network, syslet, guasi, solarisaio 等等。
linux下安裝使用流程
一,FIO安裝
下載源碼包: wget http://brick.kernel.dk/snaps/fio-2.0.7.tar.gz
安裝依賴軟件:yum install libaio-devel 我們一般使用libaio,發起異步IO請求。
解壓: tar -zxvf fio-2.0.7.tar.gz
安裝: cd fio-2.0.7
編譯: make
安裝: make install
上部流程中如果沒有找到wget你需要先安裝
yum install wget
二.使用
下面的語句是我用來測試磁盤隨機讀寫的命令
強調:!!!測試文件名稱,通常選擇需要測試的盤的data目錄。只能是分區,不能是目錄,會破壞數據。!!!
fio -filename=/dev/sda1 -direct=1 -iodepth 1 -thread -rw=randrw -ioengine=psync -bs=16k -size=500M -numjobs=10 -runtime=10 -group_reporting -name=mytest
具體參數說明
說明:
filename=/dev/sdb1 測試文件名稱,通常選擇需要測試的盤的data目錄。只能是分區,不能是目錄,會破壞數據。
direct=1 測試過程繞過機器自帶的buffer。使測試結果更真實。
iodepth 1 隊列深度,只有使用libaio時纔有意義,這是一個可以影響IOPS的參數,通常情況下爲1。
rw=randwrite 測試隨機寫的I/O
rw=randrw 測試隨機寫和讀的I/O
ioengine=psync io引擎使用pync方式
bs=4k 單次io的塊文件大小爲4k
bsrange=512-2048 同上,提定數據塊的大小範圍
size=50G 本次的測試文件大小爲50g,以每次4k的io進行測試,此大小不能超過filename的大小,否則會報錯。
numjobs=10 本次的測試線程爲10.
runtime=1000 測試時間爲1000秒,如果不寫則一直將5g文件分4k每次寫完爲止。
rwmixwrite=30 在混合讀寫的模式下,寫佔30%
group_reporting 關於顯示結果的,彙總每個進程的信息。
此外
lockmem=1g 只使用1g內存進行測試。
zero_buffers 用0初始化系統buffer。
nrfiles=8 每個進程生成文件的數量。
read 順序讀
write 順序寫
rw,readwrite 順序混合讀寫
randwrite 隨機寫
randread 隨機讀
randrw 隨機混合讀寫
其他常用語句
順序讀:
fio -filename=/dev/sdb1 -direct=1 -iodepth 1 -thread -rw=read -ioengine=psync -bs=4k -size=50G -numjobs=30 -runtime=1000 -group_reporting -name=mytest
隨機寫:
fio -filename=/dev/sdb1 -direct=1 -iodepth 1 -thread -rw=randwrite -ioengine=psync -bs=4k -size=50G -numjobs=30 -runtime=1000 -group_reporting -name=mytest
順序寫:
fio -filename=/dev/sdb1 -direct=1 -iodepth 1 -thread -rw=write -ioengine=psync -bs=4k -size=50G -numjobs=30 -runtime=1000 -group_reporting -name=mytest
混合隨機讀寫:
fio -filename=/dev/sdb1 -direct=1 -iodepth 1 -thread -rw=randrw -rwmixread=70 -ioengine=psync -bs=4k -size=50G -numjobs=30 -runtime=100 -group_reporting -name=mytest -ioscheduler=noop
三.測試結果
下面是我用虛擬機中linux執行測試隨機讀寫命令的結果
[root@localhost dev]# fio -filename=/dev/sda1 -direct=1 -iodepth 1 -thread -rw=randrw -ioengine=psync -bs=16k -size=500M -numjobs=10 -runtime=10
-group_reporting -name=mytest mytest: (g=0): rw=randrw, bs=16K-16K/16K-16K, ioengine=psync, iodepth=1
...
mytest: (g=0): rw=randrw, bs=16K-16K/16K-16K, ioengine=psync, iodepth=1
fio 2.0.7
Starting 10 threads
Jobs: 10 (f=10): [mmmmmmmmmm] [100.0% done] [1651K/1831K /s] [100 /111 iops] [eta 00m:00s]
mytest: (groupid=0, jobs=10): err= 0: pid=4075
read : io=28976KB, bw=2854.6KB/s, iops=178 , runt= 10151msec
clat (usec): min=49 , max=525390 , avg=35563.60, stdev=69691.20
lat (usec): min=49 , max=525390 , avg=35563.72, stdev=69691.20
clat percentiles (usec):
| 1.00th=[ 65], 5.00th=[ 70], 10.00th=[ 92], 20.00th=[ 116],
| 30.00th=[ 137], 40.00th=[ 151], 50.00th=[ 175], 60.00th=[ 286],
| 70.00th=[14144], 80.00th=[69120], 90.00th=[138240], 95.00th=[197632],
| 99.00th=[280576], 99.50th=[301056], 99.90th=[452608], 99.95th=[528384],
| 99.99th=[528384]
bw (KB/s) : min= 16, max= 1440, per=12.25%, avg=349.55, stdev=236.44
write: io=29616KB, bw=2917.6KB/s, iops=182 , runt= 10151msec
clat (usec): min=64 , max=2030.4K, avg=19768.52, stdev=155468.56
lat (usec): min=64 , max=2030.4K, avg=19768.86, stdev=155468.56
clat percentiles (usec):
| 1.00th=[ 70], 5.00th=[ 83], 10.00th=[ 93], 20.00th=[ 115],
| 30.00th=[ 131], 40.00th=[ 141], 50.00th=[ 151], 60.00th=[ 161],
| 70.00th=[ 177], 80.00th=[ 209], 90.00th=[ 310], 95.00th=[ 532],
| 99.00th=[700416], 99.50th=[1056768], 99.90th=[2007040], 99.95th=[2023424],
| 99.99th=[2023424]
bw (KB/s) : min= 21, max= 1392, per=11.98%, avg=349.49, stdev=253.50
lat (usec) : 50=0.03%, 100=13.11%, 250=58.60%, 500=7.76%, 750=1.34%
lat (usec) : 1000=0.38%
lat (msec) : 2=0.87%, 4=0.74%, 10=0.38%, 20=1.37%, 50=3.63%
lat (msec) : 100=2.57%, 250=6.80%, 500=1.64%, 750=0.33%, 1000=0.14%
lat (msec) : 2000=0.27%, >=2000=0.05%
cpu : usr=0.04%, sys=1.52%, ctx=45844, majf=0, minf=798
IO depths : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0%
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
issued : total=r=1811/w=1851/d=0, short=r=0/w=0/d=0
Run status group 0 (all jobs):
READ: io=28976KB, aggrb=2854KB/s, minb=2854KB/s, maxb=2854KB/s, mint=10151msec, maxt=10151msec
WRITE: io=29616KB, aggrb=2917KB/s, minb=2917KB/s, maxb=2917KB/s, mint=10151msec, maxt=10151msec
Disk stats (read/write):
sda: ios=1818/1846, merge=0/5, ticks=63776/33966, in_queue=104258, util=99.84%
其中
bw:磁盤的吞吐量,這個是順序讀寫考察的重點,類似於下載速度。
iops:磁盤的每秒讀寫次數,這個是隨機讀寫考察的重點
io總的輸入輸出量
runt:總運行時間
lat (msec):延遲(毫秒)
msec: 毫秒
usec: 微秒
藍色方框裏面的是測出的IOPS 182, 綠色方框裏面是每個IO請求的平均響應時間,大約是19ms。黃色方框表示95%的IO請求的響應時間是小於等於0.5 ms。橙色方框表示該硬盤的利用率已經達到了99.84%。
當然這上面是用虛擬機模擬測試,和實際環境還是有偏差的 主要記錄上面各項指標代表什麼含義