首先总结一下几个概念:Buffered IO、UnBuffered IO、DirectIO 分别是什么意思。
Buffeedr IO,主要是应用与文件系统之间的缓存。
UnBuffered IO,主要是应用与文件系统之间没有缓存,但是文件系统和操作系统是有 Page Cache 缓存的。
Direct IO,会绕过操作系统 Page Cache 页缓存(但还是会文件系统这一层)。这里有点复杂,借用下网上的图。
Linux IO 测试主要有:hdparam、dd、fio 几个工具。
hdparm 工具
hdparm 工具比较简单,主要用来测试磁盘读速度,并且还比较局限,只能测试几秒。主要有两个参数:
从 Linux buffer cache 读取数据速度,实际没有经过磁盘(本质是处理器,高速缓存,内存吞吐量),随便测结果都是 G/s 级别
显示从 buffer cache 读取硬盘的速度,(应该可以理解为通过操作系统 Page Cache 操作),没有文件系统开销
1
| hdparm -t --direct /dev/sdb
|
使用内核 O_DIRECT 进行 -t 测试,绕过了操作系统 Page Cache,直接进入磁盘的缓冲区(对于块设备的测试更逼真)
dd 工具
dd 工具可以进行写入测试,但主要是顺序写,并且会经过操作系统的 Page Cache。
以 4k 大小为单位,写 1000000 次,一共大概 4G 大小。
1
| time dd if=/dev/zero of=/xxx/test.4k bs=4k count=1000000 conv=fsync
|
conv=fsync 带上这个参数会进行刷盘操作。
fio 工具
fio 工具相对而言功能比较强大,比较类似 Windows 上的那种硬盘测速软件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| # 顺序读 fio -name=read -direct=1 -iodepth 1 -thread -rw=read -ioengine=libaio -bs=4k -size=2G -numjobs=1 -group_reporting fio -name=read -direct=1 -iodepth 32 -thread -rw=read -ioengine=libaio -bs=4k -size=4G -numjobs=1 -group_reporting fio -name=read -direct=1 -iodepth 32 -thread -rw=read -ioengine=libaio -bs=64k -size=16G -numjobs=1 -group_reporting
# 顺序写 fio -name=write -direct=1 -iodepth 1 -thread -rw=write -ioengine=libaio -bs=4k -size=2G -numjobs=1 -group_reporting fio -name=write -direct=1 -iodepth 32 -thread -rw=write -ioengine=libaio -bs=4k -size=4G -numjobs=1 -group_reporting fio -name=write -direct=1 -iodepth 32 -thread -rw=write -ioengine=libaio -bs=64k -size=16G -numjobs=1 -group_reporting fio -name=write -direct=1 -iodepth 32 -thread -rw=write -ioengine=libaio -bs=4k -size=4G -numjobs=1 -group_reporting -end_fsync=1
# 随机读 fio -name=randread -direct=1 -iodepth 1 -thread -rw=randread -ioengine=libaio -bs=4k -size=2G -numjobs=1 -group_reporting fio -name=randread -direct=1 -iodepth 32 -thread -rw=randread -ioengine=libaio -bs=4k -size=4G -numjobs=1 -group_reporting fio -name=randread -direct=1 -iodepth 32 -thread -rw=randread -ioengine=libaio -bs=64k -size=16G -numjobs=1 -group_reporting fio -name=randread -direct=1 -iodepth 64 -thread -rw=randread -ioengine=libaio -bs=256k -size=16G -numjobs=1 -group_reporting
|
测试结果参考
RAID 除了具有磁盘冗余的特性以外,还可以提高服务器的整体 IOPS, 并且对 SATA SSD 同样有效。
因此顺序读写可以通过堆机器磁盘来提高,但是随机读永远是硬伤。
单块 SATA SSD 硬盘
还是比较接近真实结果的。
1 2 3 4 5 6 7 8 9 10
| hdparm -t --direct 480MB/s
fio 顺序读4k,4G, 300MB/s (32 iodepth) fio 顺序读64k,16G, 620MB/s (32 iodepth) fio 顺序写4k,4G,340MB/s (32 iodepth) fio 顺序写64k,16G, 420MB/s (32 iodepth) fio 随机读4k, 360MB/s(32 iodepth) fio 随机读64k, 16G 640MB/s(32 iodepth) fio 随机读64k, 16G 790MB/s(64 iodepth) fio 随机读256k, 16G 800MB/s(64 iodepth)
|
4块 SSD RAID5
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| hdparm -t 1450MB/s hdparm -t --direct 970MB/s
dd 4K 测试 4G 写入 559M/s dd 16K 测试 16G 写入 900M/s
fio 顺序读4k,4G,280MB/s(32 iodepth) fio 顺序读64k,16G, 1600MB/s (32 iodepth) fio 顺序写4k,4G, 280MB/s (32 iodepth) fio 顺序写64k,16G,1600MB/s (32 iodepth) fio 随机读4k, 360MB/s(32 iodepth) fio 随机读64k, 16G 1000MB/s(32 iodepth) fio 随机读64k, 16G 1400MB/s(64 iodepth) fio 随机读256k, 16G 1800MB/s(64 iodepth)
|
4块 7.2K 3.5寸 RAID5
1 2 3 4 5 6 7 8 9 10 11 12
| hdparm -t 420MB/s hdparm -t --direct 420MB/s
dd 4K 测试 4G 写入 430M/s,
fio 顺序读4k,4G,100MB/s fio 顺序读4k,4G,340MB/s(32 iodepth) fio 顺序读64k,16G, 500MB/s (32 iodepth) fio 顺序写4k,1G, 70MB/s fio 顺序写4k,4G, 280MB/s (32 iodepth) fio 顺序写64k,16G,480MB/s (32 iodepth) fio 随机读4k, 6MB/s(32 iodepth)
|