磁盘IO性能优化方式
在linux中 fio(Flexible I/O Tester)是最常用的文件系统和磁盘 I/O 性能基准测试工具。它提供了大量的可定制化选项,可以用来测试,裸盘或者文件系统在各种场景下的 I/O 性能,包g括了不同块大小、不同 I/O 引擎以及是否使用缓存等场景。
# Ubuntu
> apt-get install -y fio
# CentOS
> yum install -y fio
# 随机读
> fio -name=randread -direct=1 -iodepth=64 -rw=randread -ioengine=libaio -bs=4k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=/dev/sdb
# 随机写
> fio -name=randwrite -direct=1 -iodepth=64 -rw=randwrite -ioengine=libaio -bs=4k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=/dev/sdb
# 顺序读
> fio -name=read -direct=1 -iodepth=64 -rw=read -ioengine=libaio -bs=4k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=/dev/sdb
# 顺序写
> fio -name=write -direct=1 -iodepth=64 -rw=write -ioengine=libaio -bs=4k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=/dev/sdb
direct
,表示是否跳过系统缓存。上面示例中,我设置的 1 ,就表示跳过系统缓存。iodepth
,表示使用异步 I/O(asynchronous I/O,简称 AIO)时,同时发出的 I/O 请求上限。在上面的示例中,我设置的是 64。rw
,表示 I/O 模式。我的示例中, read/write 分别表示顺序读 / 写,而randread/randwrite
则分别表示随机读 / 写。ioengine
,表示 I/O 引擎,它支持同步(sync)、异步(libaio)、内存映射(mmap)、网络(net)等各种 I/O 引擎。上面示例中,我设置的 libaio 表示使用异步 I/O。bs
,表示 I/O 的大小。示例中,我设置成了 4K(这也是默认值)。filename
,表示文件路径,当然,它可以是磁盘路径(测试磁盘性能),也可以是文件路径(测试文件系统性能)。示例中,我把它设置成了磁盘 /dev/sdb。不过注意,用磁盘路径测试写,会破坏这个磁盘中的文件系统,所以在使用前,你一定要事先做好数据备份。
磁盘优化
磁盘优化的方法:
- 最简单有效的优化方法,就是换用性能更好的磁盘,比如用 SSD 替代 HDD。
- 其次是我们可以使用
RAID
,把多块磁盘组合成一个逻辑磁盘,构成冗余独立磁盘阵列。这样做既可以提高数据的可靠性,又可以提升数据的访问性能。 - 对于磁盘和应用程序
I/O
模式的特征,我们可以选择最适合的I/O
调度算法。比方说,SSD 和虚拟机中的磁盘,通常用的是noop
调度算法。而数据库应用,我更推荐使用deadline
算法。 - 可以对应用程序的数据,进行磁盘级别的隔离。比如,我们可以为日志、数据库等 I/O 压力比较重的应用,配置单独的磁盘。
- 在顺序读比较多的场景中,我们可以增大磁盘的预读数据,比如,你可以通过下面两种方法,调整
/dev/sdb
的预读大小。调整内核选项/sys/block/sdb/queue/read_ahead_kb
,默认大小是 128 KB,单位为 KB。使用blockdev
工具设置,比如blockdev --setra 8192 /dev/sdb
,注意这里的单位是 512B(0.5KB),所以它的数值总是 read_ahead_kb 的两倍。 - 除了上面的还可以优化内核块设备 I/O 的选项。比如,可以调整磁盘队列的长度
/sys/block/sdb/queue/nr_requests
,适当增大队列长度,可以提升磁盘的吞吐量(当然也会导致I/O
延迟增大)。