dd只能提供一個大概的測試結果,並且是連續IO 而不是隨機IO ,理論上文件規模越大,測試結果越準確。
Linux下對文件的訪問和設備的訪問一般會被cache起來加快訪問速度,這個是系統的默認行爲centos
[root@centos-FI ~]# time dd oflag=direct,nonblock if=/dev/zero of=/opt/iotest bs=8k count=100000 100000+0 records in 100000+0 records out 819200000 bytes (819 MB) copied, 20.7926 s, 39.4 MB/s real 0m20.873s user 0m0.012s sys 0m7.226s
[root@centos-FI ~]# time dd if=/dev/zero of=/opt/iotest2 bs=8k count=100000 100000+0 records in 100000+0 records out 819200000 bytes (819 MB) copied, 11.9159 s, 68.7 MB/s real 0m11.948s user 0m0.028s sys 0m1.913s
[root@centos-FI ~]# time dd oflag=direct,nonblock iflag=direct,nonblock if=/opt/iotest2 of=/opt/iotest3 bs=8k count=100000 100000+0 records in 100000+0 records out 819200000 bytes (819 MB) copied, 114.291 s, 7.2 MB/s real 1m54.292s user 0m0.017s sys 0m14.401s
cmd | result |
---|---|
dd oflag=direct,nonblock if=/dev/zero of=/opt/iotest bs=8k count=100000 | 39.4 MB/s |
dd if=/dev/zero of=/opt/iotest2 bs=8k count=100000 | 68.7 MB/s |
dd oflag=direct,nonblock iflag=direct,nonblock if=/opt/iotest2 of=/opt/iotest3 bs=8k count=100000 | 7.2 MB/s緩存 |
讀性能測試性能
# time dd iflag=direct,nonblock if=/dev/sda2 of=/dev/null bs=8k count=100000
由於/dev/sda2是一個物理分區,對它的讀取會產生IO,/dev/null是僞設備,至關於黑洞,of到該設備不會產生IO,
因此,這個命令的IO只發生在/dev/sdb1上,也至關於測試磁盤的讀能力。測試
寫測試spa
# time dd oflag=direct,nonblock if=/dev/zero of=/opt/iotest bs=8k count=100000
由於/dev/zero是一個僞設備,它只產生空字符流,對它不會產生IO,
因此,IO都會集中在of文件中,of文件只用於寫,因此這個命令至關於測試磁盤的寫能力。操作系統
讀寫測試code
# time dd iflag=direct,nonblock oflag=direct,nonblock if=/dev/sda2 of=/opt/iotest bs=8k count=100000
說明:
bs是一次io讀的規模,理論上bs越大,所測得性能越高
count是讀多少個"bs",也能夠寫成count=16G
direct 模式就是把寫入請求直接封裝成io 指令發到磁盤
非direct 模式,就把數據寫入系統緩存,而後就認爲io 成功,並由操做系統決定緩存中的數據何時被寫入磁盤
參數oflag和iflag, 控制源文件和目標文件的讀寫方式爲direct IO,即讀或寫文件時越過操做系統的讀寫buffer。
若是指定oflag=direct,nonblock,寫文件時忽略cache的影響;
而若是指定iflag=direct,nonblock,讀文件時忽略cache的影響cmd