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. Barrier0禁用写障碍可以提高性能但有数据损坏风险最好配合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调度器有临时方法和持久化方法临时方法#切换为noneSSD/NVMe推荐echo“none” /sys/block/sda/queue/scheduler#切换为kyber高速SSD低延迟echo“kyber” /sys/block/sda/queue/scheduler持久化方法修改grub配置内核启动参数添加elevatormq-deadline重新编译grubgrub2-mkconfig -o /boot/grub2/grub.cfg也可以通过创建udev规则文件比如在/etc/udev/rules.d/目录创建文件XX-自定义名称.rules比如60-disk-scheduler.rules可以自取名称但udev规则建议前两位数字块设备配置在60-70之间。在udev规则文件中添加如下内容比如#机械盘sdb使用mq-deadlineACTIONadd|change, KERNELsdb, SUBSYSTEMblock, RUN/bin/sh -c echo mq-deadline /sys/$devpath/queue/scheduler# SSD盘sdd使用noneACTIONadd|change, KERNELsdd, SUBSYSTEMblock, RUN/bin/sh -c echo none /sys/$devpath/queue/scheduler2.调整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存储、分布式存储等还需要具体结合实际场景进行规范化、系统化的优化配置。