i/o 的概念,從字義來理解就是輸入輸出。作業系統從上層到底層,各個層次之間均存在 i/o。比如,cpu 有 i/o,記憶體有 i/o, vmm 有 i/o, 底層磁碟上也有 i/o,這是廣義上的 i/o。通常來講,乙個上層的 i/o 可能會產生針對磁碟的多個 i/o,也就是說,上層的 i/o 是稀疏的,下層的 i/o 是密集的。
磁碟的 i/o,顧名思義就是磁碟的輸入輸出。輸入指的是對磁碟寫入資料,輸出指的是從磁碟讀出資料。我們常見的磁碟型別有 ata、sata、fc、scsi、sas。這幾種磁碟中,伺服器常用的是 sas 和 fc 磁碟,一些高階儲存也使用 ssd 盤。每一種磁碟的效能是不一樣的。
san(storage area network, 儲存區域網路)和nas儲存(network attached storage,網路附加儲存)一般都具備2個評價指標:iops和頻寬(throughput,也叫吞吐量),兩個指標互相獨立又相互關聯。體現儲存系統效能的最主要指標是iops。下面,將介紹一下這兩個引數的含義。
簡而言之:
磁碟的 iops,也就是在一秒內,磁碟進行多少次 i/o 讀寫。
磁碟的吞吐量,也就是每秒磁碟 i/o 的流量,即磁碟寫入加上讀出的資料的大小。
iops可細分為如下幾個指標:
toatal iops,混合讀寫和順序隨機i/o負載情況下的磁碟iops,這個與實際i/o情況最為相符,大多數應用關注此指標。
random read iops,100%隨機讀負載情況下的iops。
random write iops,100%隨機寫負載情況下的iops。
sequential read iops,100%順序讀負載情況下的iops。
sequential write iops,100%順序寫負載情況下的iops。
每秒 i/o 吞吐量= iops* 平均 i/o size。從公式可以看出: i/o size 越大,iops 越高,那麼每秒 i/o 的吞吐量就越高。因此,我們會認為 iops 和吞吐量的數值越高越好。
對於同乙個磁碟(或者 lun),隨著每次 i/o 讀寫資料的大小不通,iops 的數值也不是固定不變的。例如,每次 i/o 寫入或者讀出的都是連續的大資料塊,此時 iops 相對會低一些;在不頻繁換道的情況下,每次寫入或者讀出的資料塊小,相對來講 iops 就會高一些。也就是說,iops 也取決與i/o塊的大小,採用不同i/o塊的大小測出的iops值是不同的。 對乙個具體的iops, 先了解它當時測試的i/o塊的尺寸,再做效能對比。並且iops都具有極限值,表1列出了各種磁碟的 iops 極限值。
總之,iops和資料吞吐量作為硬碟效能的兩個重要指標,我們對其的關注應該適用於不同的場合:比如
讀取10000個1kb檔案,用時10秒 throught(吞吐量)=1mb/s ,iops=1000 追求iops
讀取1個10mb檔案,用時0.2秒 throught(吞吐量)=50mb/s, iops=5 追求吞吐量
參考:關於磁碟效能測試,這裡使用兩個命令工具:dd和fio
dd:用指定大小的塊拷貝乙個檔案,並在拷貝的同時進行指定的轉換。
引數說明:
1. if=檔名:輸入檔名,預設為標準輸入。即指定原始檔。< if=input file >
2. of=檔名:輸出檔名,預設為標準輸出。即指定目的檔案。< of=output file >
3. ibs=bytes:一次讀入bytes個位元組,即指定乙個塊大小為bytes個位元組。
obs=bytes:一次輸出bytes個位元組,即指定乙個塊大小為bytes個位元組。
bs=bytes:同時設定讀入/輸出的塊大小為bytes個位元組。
4. cbs=bytes:一次轉換bytes個位元組,即指定轉換緩衝區大小。
5. skip=blocks:從輸入檔案開頭跳過blocks個塊後再開始複製。
6. seek=blocks:從輸出檔案開頭跳過blocks個塊後再開始複製。
注意:通常只用當輸出檔案是磁碟或磁帶時才有效,即備份到磁碟或磁帶時才有效。
7. count=blocks:僅拷貝blocks個塊,塊大小等於ibs指定的位元組數。
8. conv=conversion:用指定的引數轉換檔案。
ascii:轉換ebcdic為ascii
ebcdic:轉換ascii為ebcdic
ibm:轉換ascii為alternate ebcdic
block:把每一行轉換為長度為cbs,不足部分用空格填充
unblock:使每一行的長度都為cbs,不足部分用空格填充
lcase:把大寫字元轉換為小寫字元
ucase:把小寫字元轉換為大寫字元
swab:交換輸入的每對位元組
noerror:出錯時不停止
notrunc:不截短輸出檔案
sync:將每個輸入塊填充到ibs個位元組,不足部分用空(nul)字元補齊。
/dev/null和/dev/zero:
/dev/null,外號叫無底洞,你可以向它輸出任何資料,它通吃,並且不會撐著!它是空裝置,也稱為位桶(bit bucket)。任何寫入它的輸出都會被拋棄。如果不想讓訊息以標準輸出顯示或寫入檔案,那麼可以將訊息重定向到位桶。
/dev/zero,是乙個輸入裝置,你可你用它來初始化檔案。該裝置無窮盡地提供0,可以使用任何你需要的數目——裝置提供的要多的多。他可以用於向裝置或檔案寫入字串0。
測試硬碟的讀寫速度:
dd if=/dev/zero of=/root/test bs=8k count=100000 -- 寫
dd if=/root/test of=/dev/null bs=8k count=100000 -- 讀
通過以上兩個命令輸出的命令執行時間,可以計算出硬碟的寫、讀速度
發現把bs(每次讀寫的位元組數)改大一些,磁碟的讀寫速度會提高,理論上bs越大,測得的效能越高。
注意:dd 只能提供乙個大概的測試結果,而且是連續 i/o 而不是隨機 i/o,理論上檔案規模越大,測試結果越準確。 同時,iflag/oflag 提供 direct 模式,direct 模式是把寫入請求直接封裝成 i/o 指令發到磁碟,非 direct 模式只是把資料寫入到系統快取就認為 i/o 成功,並由作業系統決定快取中的資料什麼時候被寫入磁碟。
安裝:yum install libaio-devel fio(其中安裝libaio-devel的原因見下的引數說明ioengine)
fio引數說明:
fio -filename=/root/iotest -direct=1 -iodepth=1 -rw=randrw -ioengine=libaio -bs=16k -size=2g -numjobs=4 -runtime=30 -group_reporting -name=mytest
filename=/root/test 測試檔名稱,通常選擇需要測試的盤的data目錄。測試舉例:direct=1
測試過程繞過機器自帶的buffer。使測試結果更真實。
iodepth=1 佇列深度
rw=randwrite 測試隨機寫的i/o
rw=randrw 測試隨機寫和讀的i/o
ioengine=libaio io引擎,如果要使用libaio引擎,需要yum install libaio-devel包
bs=16k 單次io的塊檔案大小為4k
size=1g 本次的測試檔案大小為1g,以每次16k的io進行測試。
numjobs=4本次的測試執行緒為4.
runtime=30 測試時間為30秒,如果不寫則一直將1g檔案分16k每次寫完為止。
group_reporting 關於顯示結果的,彙總每個程序的資訊
dd if=/dev/zero of=/root/iotest bs=4k count=262144(建立1g的檔案)
read : io=139888kb, bw=4662.2kb/s, iops=291 , runt= 30005msec簡單說明:fio做了136mb的io總量,速率(吞吐量)為4.55mb/s,iops為291,執行時間30005msec
對fio輸出結果的詳細說明參考:
dd測試硬碟效能
下面直接介紹幾種常見的dd命令,先看一下他的區別 dd bs 64k count 4k if dev zero of test dd bs 64k count 4k if dev zero of test sync dd bs 64k count 4k if dev zero of test con...
linux 硬碟讀寫效能測試
dd是進行資料塊拷貝的命令,可以很好的測試硬碟讀寫效能,網上例子很多,但是有時候我們並沒有很好的理解它。我用單機單塊硬碟重新測試下。並且分析。寫效能測試 root localhost dd if dev zero bs 1024 count 1000000 of 1gb.file conv fdat...
SSD硬碟效能測試比較
由於公司最近需要上ssd,用於 mysql 資料庫伺服器,以下針對單塊480g ssd 接raid卡240g ssd 2 raid0,以及與普通硬碟sata硬碟以及sas raid10 做個比較 480g ssd intel ssdsc2bp480g4 sata wd6401aals 00j7b1 ...