磁盘I/O性能是服务器运维中影响数据库、文件服务、日志写入等场景的关键瓶颈。Linux内核提供多种I/O调度器、队列深度调节、预读缓存等可调参数,针对SSD固态硬盘和机械硬盘的物理特性差异进行针对性配置,可使IOPS提升数倍并显著降低延迟。本文从I/O调度器选型、块设备参数调优、文件系统层面优化三个维度给出具体配置方案。
I/O调度器类型与选型策略
Linux内核支持多种I/O调度器,每种调度器的合并、排序、延迟策略不同。通过/sys/block/{device}/queue/scheduler可查看和切换当前调度器。
# 查看当前调度器
cat /sys/block/sda/queue/scheduler
# 输出: [mq-deadline] kyber none bfq
# 切换调度器(运行时生效)
echo none > /sys/block/sda/queue/scheduler
# 永久生效:通过udev规则
cat > /etc/udev/rules.d/60-io-scheduler.rules << 'EOF'
# NVMe SSD使用none调度器
ACTION=="add|change", KERNEL=="nvme[0-9]*n[0-9]*", ATTR{queue/scheduler}="none"
# SATA SSD使用mq-deadline
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}="0", ATTR{queue/scheduler}="mq-deadline"
# 机械硬盘使用bfq
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}="1", ATTR{queue/scheduler}="bfq"
EOF
udevadm control --reload-rules
udevadm trigger
各调度器适用场景:none(noop)跳过排序直接下发,适合NVMe SSD等设备自身已有FIFO队列的低延迟存储;mq-deadline多队列版本截止时间调度,保证请求在指定时间内处理,适合SATA SSD和通用场景;bfq公平排队调度器,按进程分配I/O带宽,适合机械硬盘和桌面交互场景;kyber基于完成时间自适应调整,适合NVMe高并发场景。
块设备队列参数调优
块设备队列参数控制内核I/O栈的并发度和预读行为,直接影响吞吐量和延迟表现。
# 队列深度:控制同时下发给设备的I/O请求数量
# NVMe设备默认值通常较低,可适当提高
echo 1024 > /sys/block/nvme0n1/queue/nr_requests
# 读写预读量:增加顺序读预读
# SSD默认128KB,可提升到512KB-1MB
echo 512 > /sys/block/nvme0n1/queue/read_ahead_kb
# 旋转标识:确保SSD被正确识别为非旋转设备
cat /sys/block/nvme0n1/queue/rotational
# 应输出0,若为1需修正
echo 0 > /sys/block/nvme0n1/queue/rotational
# I/O统计:高I/O场景可关闭以减少开销
echo 0 > /sys/block/nvme0n1/queue/iostats
# RQAffinity:多队列I/O请求亲和性
# 2表示跨NUMA节点分发,适合多NUMA环境
echo 2 > /sys/block/nvme0n1/queue/rq_affinity
nr_requests参数过大可能导致内存占用增加和延迟波动。对于数据库等高IOPS场景,建议值设为512-1024;对于文件服务器等吞吐优先场景,配合较大read_ahead_kb提升顺序读性能。SSD的rotational参数必须设为0,否则内核会错误应用旋转设备的优化策略。
SSD TRIM与NVMe多队列配置
TRIM指令通知SSD回收已删除数据的闪存块,维持写入性能稳定。定期执行TRIM对SSD长期性能至关重要。
# 启用挂载时持续TRIM(ext4/xfs)
mount -o discard /dev/nvme0n1p1 /data
# 或通过fstrim定时器周期性执行
systemctl enable fstrim.timer
systemctl start fstrim.timer
# 手动执行TRIM
fstrim -v /data
# 输出: /data: 999.9 GiB (1073738259456 bytes) trimmed
# NVMe多队列配置
# 查看硬件队列数
cat /sys/block/nvme0n1/queue/nr_hw_queues
# 查看每个CPU的队列分配
cat /sys/block/nvme0n1/queue/nr_hw_queues
持续TRIM(discard挂载选项)会在每次删除时实时下发TRIM指令,可能引入微小延迟。对于高频删除场景,推荐使用fstrim定时器按周执行批量TRIM,在性能和SSD寿命之间取得平衡。NVMe设备天然支持多队列(Multi-Queue),每个CPU核心可绑定独立硬件队列,避免锁竞争。
文件系统层面I/O优化
文件系统挂载参数和配置直接影响I/O路径效率。ext4和XFS是Linux服务器最常用的两种文件系统,针对SSD有各自的优化选项。
# XFS文件系统创建与挂载优化
mkfs.xfs -f -d agcount=32 /dev/nvme0n1p1
mount -o noatime,nodiratime,largeio,swalloc /dev/nvme0n1p1 /data
# ext4文件系统创建与挂载优化
mkfs.ext4 -O ^has_journal,extent /dev/nvme0n1p1
mount -o noatime,nodiratime,data=writeback,barrier=0 /dev/nvme0n1p1 /data
# /etc/fstab持久化配置
/dev/nvme0n1p1 /data xfs noatime,nodiratime,largeio,swalloc 0 0
noatime和nodiratime禁用文件访问时间更新,减少元数据写操作。data=writeback模式(仅ext4)允许延迟写入元数据,提升写入性能但降低崩溃恢复能力,适用于可容忍数据丢失的缓存场景。barrier=0关闭写入屏障,在配备BBU(电池备份单元)的RAID控制器环境下安全使用。
# 内核I/O相关参数调优
# vm.dirty_ratio:脏页占内存百分比触发同步写入
sysctl -w vm.dirty_ratio=10
# vm.dirty_background_ratio:脏页占内存百分比触发异步写入
sysctl -w vm.dirty_background_ratio=5
# vm.dirty_expire_centisecs:脏页过期时间(百分秒)
sysctl -w vm.dirty_expire_centisecs=3000
# 永久生效
cat >> /etc/sysctl.d/99-io-tune.conf << 'EOF'
vm.dirty_ratio = 10
vm.dirty_background_ratio = 5
vm.dirty_expire_centisecs = 3000
vm.dirty_writeback_centisecs = 500
EOF
sysctl --system
dirty_ratio设为10%可防止突发写入占用过多内存导致系统卡顿,dirty_background_ratio设为5%让后台写入更早启动平滑刷盘。对于SSD高IOPS场景,适当降低dirty_ratio减少批量刷盘对延迟的影响。
I/O性能基准测试与瓶颈定位
调优前后应通过基准测试量化性能变化,使用fio工具分别测试顺序读写和随机读写性能。
# 顺序读测试
fio --name=seqread --filename=/data/testfile \
--rw=read --bs=1M --size=10G --numjobs=1 \
--iodepth=32 --runtime=60 --time_based \
--group_reporting
# 随机写测试(SSD真实写入瓶颈)
fio --name=randwrite --filename=/data/testfile \
--rw=randwrite --bs=4k --size=10G --numjobs=4 \
--iodepth=64 --runtime=60 --time_based \
--group_reporting --norandommap
# 混合读写测试(70%读30%写)
fio --name=mixed --filename=/data/testfile \
--rw=randrw --rwmixread=70 --bs=4k --size=10G \
--numjobs=4 --iodepth=32 --runtime=60 --time_based \
--group_reporting
fio测试中iodepth参数控制并发I/O深度,SSD场景建议设为32-64以充分利用设备并行能力。numjobs模拟多进程并发I/O,4-8个job能更好反映真实负载。通过iostat工具可实时监控各设备的IOPS、吞吐量、await延迟和%util利用率,定位瓶颈设备。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/linux-fu-wu-qi-ci-pan-io-xing-neng-diao-you-shi-zhan-io/