0%

Linux 磁盘 IO 测试

首先总结一下几个概念:Buffered IO、UnBuffered IO、DirectIO 分别是什么意思。

Buffeedr IO,主要是应用与文件系统之间的缓存。

UnBuffered IO,主要是应用与文件系统之间没有缓存,但是文件系统和操作系统是有 Page Cache 缓存的。

Direct IO,会绕过操作系统 Page Cache 页缓存(但还是会文件系统这一层)。这里有点复杂,借用下网上的图。

linux-io-test

Linux IO 测试主要有:hdparam、dd、fio 几个工具。

hdparm 工具

hdparm 工具比较简单,主要用来测试磁盘读速度,并且还比较局限,只能测试几秒。主要有两个参数:

1
hdparm -T /dev/sdb

从 Linux buffer cache 读取数据速度,实际没有经过磁盘(本质是处理器,高速缓存,内存吞吐量),随便测结果都是 G/s 级别

1
hdparm -t /dev/sdb

显示从 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)