FIO是測試IOPS的非常好的工具,用來對硬件進行壓力測試和驗證。磁盤IO是檢查磁盤性能的重要指标,可以按照負載情況分成照順序讀寫,随機讀寫兩大類。
目前主流的第三方IO測試工具有fio、iometer 、 Orion,這三種工具各有千秋,在linux 下也可以使用dd 進行簡單的磁盤(文件系統)測試(文末補充)。
fio在Linux系統下使用比較方便,iometer在window系統下使用比較方便,Orion是oracle的IO測試軟件,可在沒有安裝oracle數據庫的情況下模拟oracle數據庫場景的讀寫。
Multithreaded IO generation tool , FIO 是一個多線程io生成工具,可以生成多種IO模式,用來測試磁盤設備的性能(也包含文件系統:如針對網絡文件系統 NFS 的IO測試); Description : fio is an I/O tool that will spawn a number of threads or processes doing : a particular type of io action as specified by the user. fio takes a : number of global parameters, each inherited by the thread unless : otherwise parameters given to them overriding that setting is given. : The typical use of fio is to write a job file matching the io load : one wants to simulate. |
測試磁盤之前,磁盤最好是空的,也就是格式化的,如果磁盤已經有了内容,
需要卸載-格式化-挂載
# 卸載磁盤
umount /mnt/datadir1
# 格式化磁盤
mkfs.ext4 /dev/sdd
# 挂載磁盤
mount -t ext4 /dev/sdd /mnt/datadir1
# 自動挂載,在裡面添加該盤
vim /etc/fstab (見下圖,可以在該文件下設置挂載)
安裝fio
yum install fio
使用簡介
從測試角度出發,一般有如下的測試設計:
序号 |
模塊 |
用例 |
結果 |
1 |
磁盤IO測試 |
1M順序寫吞吐量 |
IOPS=353, BW=353MiB/s (371MB/s)(50.0GiB/144874msec) |
2 |
磁盤IO測試 |
1M順序讀吞吐量 |
IOPS=1349, BW=1350MiB/s (1415 MB/s)(50.0GiB/37937msec) |
3 |
磁盤IO測試 |
4K随機寫IOPS |
IOPS=6057, BW=23.7MiB/s (24.8MB/s)(10.0GiB/432743msec) |
4 |
磁盤IO測試 |
4K随機讀IOPS |
IOPS=20.0k, BW=81.9MiB/s (85.9MB/s)(10.0GiB/125065msec) |
說明:
- IOPS IOPS(Input/Output Operations Per Second)每秒讀寫的次數
2. 50.0GiB/144874msec=353MiB/s=371MB/s
MiB/s的意思是每秒中傳輸2^20 byte的數據,不太常用,一般需要轉換成MB/S,MB/s=MiB/s *1.024
測試命令:
fio -direct=1 -iodepth=32 -rw=write -ioengine=libaio -bs=1024k -size=50G -numjobs=1 -runtime=600 -group_reporting -filename=/mnt/test/fiotest.txt -name=Write_BandWidth_Test fio -direct=1 -iodepth=32 -rw=read -ioengine=libaio -bs=1024k -size=50G -numjobs=1 -runtime=600 -group_reporting -filename=/mnt/test/fiotest.txt -name=Read_BandWidth_Test fio -direct=1 -iodepth=128 -rw=randwrite -ioengine=libaio -bs=4k -size=10G -numjobs=1 -runtime=600 -group_reporting -filename=/mnt/test/fiotest.txt -name=Rand_Write_IOPS_Test fio -direct=1 -iodepth=128 -rw=randread -ioengine=libaio -bs=4k -size=10G -numjobs=1 -runtime=600 -group_reporting -filename=/mnt/test/fiotest.txt -name=Rand_Read_IOPS_Test |
filename=/dev/sdb1 測試文件名稱,通常選擇需要測試的盤的data目錄。direct=1 是否使用directIO,測試過程繞過OS自帶的buffer,使測試磁盤的結果更真實。
rw=
bs=1024k 單次io的塊文件大小為1024kbsrange=512-2048 同上,提定數據塊的大小範圍 size=50G 每個線程讀寫的數據量是50GB。numjobs=1 每個job(任務)開1個線程,這裡用了幾,後面每個用-name指定的任務就開幾個線程測試。所以最終線程數=任務數(幾個name=jobx)* numjobs。name=job1:一個任務的名字,重複了也沒關系。如果fio -name=job1 -name=job2,建立了兩個任務,共享-name=job1之前的參數。-name之後的就是job2任務獨有的參數。thread 使用pthread_create創建線程,另一種是fork創建進程。進程的開銷比線程要大,一般都采用thread測試。runtime=1000 測試時間為1000秒,如果不寫則一直将5g文件分4k每次寫完為止。ioengine=libaio 指定io引擎使用libaio方式。libaio:Linux本地異步I/O。請注意,Linux可能隻支持具有非緩沖I/O的排隊行為(設置為“direct=1”或“buffered=0”);rbd:通過librbd直接訪問CEPH Radosiodepth=16 隊列的深度為16.在異步模式下,CPU不能一直無限的發命令到SSD。比如SSD執行讀寫如果發生了卡頓,那有可能系統會一直不停的發命令,幾千個,甚至幾萬個,這樣一方面SSD扛不住,另一方面這麼多命令會很占内存,系統也要挂掉了。這樣,就帶來一個參數叫做隊列深度。Block Devices(RBD),無需使用内核RBD驅動程序(rbd.ko)。該參數包含很多ioengine,如:libhdfs/rdma等rwmixwrite=30 在混合讀寫的模式下,寫占30%group_reporting 關于顯示結果的,彙總每個進程的信息。
此外lockmem=1g 隻使用1g内存進行測試。zero_buffers 用0初始化系統buffer。nrfiles=8 每個進程生成文件的數量。 磁盤讀寫常用測試點:
|
[root@docker ~]# dd if=/dev/zero of=test bs=8k count=10000 oflag=direct10000 0 records in10000 0 records out81920000 bytes (82 MB) copied, 0.876059 s, 93.5 MB/s |
[root@docker ~]# dd if=test of=/dev/null bs=8k count=10000 iflag=direct10000 0 records in10000 0 records out81920000 bytes (82 MB) copied, 5.06434 s, 16.2 MB/s |
/dev/null,它是空設備,也稱為位桶(bit bucket)、回收站、無底洞,可以向它輸出任何數據。任何寫入它的輸出都會被抛棄。如果不想讓消息以标準輸出顯示或寫入文件,那麼可以将消息重定向到位桶。
/dev/zero,是一個輸入設備,可用它來初始化文件。該設備無窮盡地提供0,可以使用任何需要的數目——設備提供的要多的多。他可以用于向設備或文件寫入字符串0。
if=file 輸入文件名,缺省為标準輸入。 從file讀取,如if=/dev/zero,該設備無窮盡地提供0,(不産生讀磁盤IO)
of=file 輸出文件名,缺省為标準輸出。 向file寫出,可以寫文件,可以寫裸設備。如of=/dev/null,"黑洞",
ibs=bytes 一次讀入 bytes 個字節(即一個塊大小為 bytes 個字節)。
obs=bytes 一次寫 bytes 個字節(即一個塊大小為 bytes 個字節)。
bs=bytes 同時設置讀寫塊的大小為 bytes ,可代替 ibs 和 obs。如bs=8k 每次讀或寫的大小,即一個塊的大小為8K。
cbs=bytes 一次轉換 bytes 個字節,即轉換緩沖區大小。
skip=blocks 從輸入文件開頭跳過 blocks 個塊後再開始複制。
seek=blocks 從輸出文件開頭跳過 blocks 個塊後再開始複制。(通常隻有當輸出文件是磁盤或磁帶時才有效)。
count=blocks 僅拷貝 blocks 個塊,塊大小等于 ibs 指定的字節數。