1. 选择合适的I/O调度算法
I/O调度算法决定了内核处理磁盘请求的顺序,不同算法适用于不同场景。对于SSD/NVMe,推荐使用noop(无调度)或mq-deadline(兼顾延迟与吞吐),因其无需磁头寻道,简单FIFO队列即可满足需求;对于HDD,推荐deadline(避免请求饥饿,适合数据库等高并发场景)或cfq(公平分配带宽,适合桌面多任务)。
临时修改(重启失效):echo noop > /sys/block/sda/queue/scheduler;永久修改(CentOS 7+):编辑/etc/default/grub,在GRUB_CMDLINE_LINUX中添加elevator=noop,然后执行grub2-mkconfig -o /boot/grub2/grub.cfg并重启。
2. 优化文件系统配置
XFS(支持16TB以上分区、高并发随机读写),适合数据库、存储服务等场景;ext4(支持文件系统收缩)适合普通文件存储。noatime,nodiratime(禁用访问时间戳更新,减少不必要的磁盘写操作),例如:/dev/sda1 / ext4 defaults,noatime,nodiratime 0 0。journal(完整日志);对于普通文件存储,使用ordered(默认,平衡性能与一致性);writeback(最快,但可能丢失部分日志)仅用于非关键场景。3. 调整内核缓存参数
dirty_expire_centisecs(脏页存活时间,默认3000厘秒=30秒)和dirty_writeback_centisecs(刷新间隔,默认500厘秒=5秒)控制脏页写入磁盘的时机。增大这两个值可减少写入次数(提升吞吐量),但会增加数据丢失风险(如系统崩溃);减小则相反。例如:echo 6000 > /proc/sys/vm/dirty_expire_centisecs、echo 1000 > /proc/sys/vm/dirty_writeback_centisecs。dirty_background_ratio(后台刷新阈值,默认10%,内存的10%为脏页时触发后台刷新)、dirty_ratio(强制刷新阈值,默认20%,内存的20%为脏页时阻塞进程写入)。增大阈值可提升写入性能,但会增加内存占用。例如:echo 20 > /proc/sys/vm/dirty_background_ratio、echo 40 > /proc/sys/vm/dirty_ratio。vfs_cache_pressure(回收目录项/索引节点缓存的倾向,默认100,数值越大越容易回收)。设置为50可减少缓存回收,提升文件访问性能。4. 使用缓存与分层存储
/dev/sdb作为缓存设备)、原始卷(如/dev/sda作为后端设备),然后合并为缓存逻辑卷(lvcreate -L 100G -n cache vg0,lvconvert --type cache --cachevol vg0/cache vg0/lv_root)。bcache-tools后,执行make-bcache -B /dev/sda -C /dev/sdb(绑定后端与缓存设备),格式化并挂载/dev/bcache0。/tmp、/var/tmp)挂载到内存中(mount -t tmpfs -o size=4G tmpfs /tmp),避免磁盘I/O(适合频繁读写的临时文件)。5. 磁盘硬件与隔离优化
/dev/sdb专门用于数据库数据目录),避免多个应用竞争同一磁盘资源,减少I/O等待时间。6. 监控与诊断I/O性能
使用工具定期监控磁盘I/O状态,及时发现瓶颈:
iostat -x 1(每秒刷新,%util接近100%表示磁盘繁忙,await超过20ms表示延迟高)。vmstat 1(bi/bo分别表示块设备读入/写出量,数值过高表示I/O压力大)。dstat -d(实时查看磁盘读写速率)。fio --name=randread --ioengine=libaio --rw=randread --bs=4k --numjobs=4 --size=1G --runtime=60(测试4K随机读性能,评估磁盘IOPS上限)。