Linux存储--磁盘I/O调优方法

磁盘I/O性能是决定计算机整体性能的关键因素之一,磁盘I/O性能瓶颈常常会影响文件系统、数据库、虚拟化平台等应用的响应时间,因此磁盘I/O调优是计算机系统运维工作中的重要任务。

一、硬件调优

1. 使用固态硬盘SSD,这种类型的硬盘较传统机械硬盘具有更快的随机I/O性能和更高的IOPS,较适合在数据库、虚拟化、高并发等应用场景。

2.配置硬件RAID(磁盘冗余阵列),提高磁盘I/O性能。

3.增加硬件层面的缓存,比如存储控制器的缓存可以有效提升读写性能;配置服务器RAM作为I/O缓存,减少直接访问磁盘的频率。

二、文件系统调优

不同文件系统具有不同的I/O性能特点,选择适合的文件系统对于优化磁盘I/O也是非常关键的,一些主要的文件系统如下:

1. ext4:是linux系统通用并且常见的一种文件系统,支持大文件和日志功能,其在大量小文件的场景也非常出色,使用于操作系统盘、文件共享等应用场景。

2. xfs:适合处理大文件、大容量、高并发的场景,其写性能也非常出色,尤其适用于操作系统盘、审数据库、流媒体、虚拟化等场景。

3. Btrfs:具有快照、压缩、卷管理功能,适合现代存储应用。

三、文件系统挂载选项调优

在使用mount命令挂载磁盘分区文件系统或者在/etc/fstab文件持久化磁盘分区挂载配置的时候,可以通过配置挂载参数提升文件系统的I/O性能。比如一些参数:

1. Noatime:禁用文件访问时间更新,减少笔不要的磁盘写操作。

2. Nodiratime:不更新目录访问时间,搭配noatime 使用

3. async(默认):数据写操作前先放入缓存,后台异步数据落盘,性能高;但又断电丢数据风险。

4. Barrier=0:禁用写障碍,可以提高性能,但有数据损坏风险,最好配合UPS / 电池RAID 卡。

5. ro:只读挂载,适合没有写I/O的场景,比如数据备份盘等。

6. nodev:挂载文件系统不识别块设备,提升文件系统安全性及业务目录使用。

四、操作系统内核参数调优

1.结合业务场景,优化和配置适合的内核块层I/O调度器在前期的《Linux存储-内核存储框架概念》讲述linux文件系统架构提到内核块层的作用,通过调整I/O调度优化磁盘性能。

可以使用命令:Cat /sys/block/sdb/queue/scheduler查看(sdb结合实际修改)

内核老版本的可能有如下输出:

内核新版本的可能有如下输出:

  • Noop:适合固态SSD,因为SSD不需要机械寻道;适合SSD、NVMe、数据库等场景。

  • Deadline:适合低延时、高负载的系统,适合数据库应用场景。

  • mq-deadline:拆分读/ 写双队列,为每个IO 设置超时时间;适合机械HDD、数据库、随机读写业务等场景。

  • cfq:完全公平队列为所有进程分配相等的磁盘I/O宽带;适合通用的场景都可以,但性能较为一般。

  • anticipatory:预期调度,在cfq 基础上会短暂等待相邻IO,适合单进程顺序读写机械盘,现在基本淘汰。

  • kyber:轻量化多队列调度,分读/写优先级,控制队列深度,延迟比mq-deadline 更低;适合高速NVMe、 SSD、低延迟的时序数据库、日志记录等业务。

配置块层I/O调度器有临时方法和持久化方法:

临时方法:

#切换为none(SSD/NVMe推荐)echo“none” > /sys/block/sda/queue/scheduler#切换为kyber(高速SSD低延迟)echo“kyber” > /sys/block/sda/queue/scheduler

持久化方法:​​​​​​​

修改grub配置,内核启动参数添加:elevator=mq-deadline重新编译grub:grub2-mkconfig -o /boot/grub2/grub.cfg

也可以通过创建udev规则文件,比如在/etc/udev/rules.d/目录创建文件:XX-自定义名称.rules(比如60-disk-scheduler.rules,可以自取名称,但udev规则建议前两位数字块设备配置在60-70之间)。

在udev规则文件中添加如下内容,比如:​​​​​​​

#机械盘sdb使用mq-deadlineACTION=="add|change", KERNEL=="sdb", SUBSYSTEM=="block", RUN+="/bin/sh -c 'echo mq-deadline > /sys/$devpath/queue/scheduler'"# SSD盘sdd使用noneACTION=="add|change", KERNEL=="sdd", SUBSYSTEM=="block", RUN+="/bin/sh -c 'echo none > /sys/$devpath/queue/scheduler'"

2.调整swap的swappiness值

内核参数swappiness值是控制系统倾向使用交换分区swap的程度,取值范围0 ~ 100。值越小表示系统尽量使用物理内存,减少内存和swap之间的数据交换;值越大,反之,操作系统默认配置的值为60。如果内存足够大(32G以上),建议将swappiness值修改该为10。​​​​​​​

临时修改方法:echo“10” > /proc/sys/vm/swappiness永久修改该方法:修改内核文件/etc/sysctl.confecho “vm.swappiness= 10” >> /etc/sysctl.confsysctl-p (不用重启系统)

五、总结

以上内容大概讲述了提升linux系统磁盘性能的一些常用的思路和方法,主要是结合业务需求场景选择磁盘和文件系统类型以及从内核的一些通用参数适配做些修改。但是计算机系统的I/O提升所需的优化方法不限于这几种,比如内存缓存的配置、RAID存储、分布式存储等,还需要具体结合实际场景进行规范化、系统化的优化配置。