aio 接口在高并发场景下的系统调用开销过高,难以支撑低延迟需求。mq-deadline 调度器,完整支持 cgroup v2 IO 带宽/IOPS 限制,并提供 io_uring 异步 IO 接口。通过合理调整 IO 调度器、文件系统挂载选项和 cgroup IO 限制,可以让关键业务在共享存储上获得稳定的 QoS。none 调度器以获得最佳延迟,机械硬盘推荐 bfq 以获得公平调度。ext4 data=writeback 模式在系统崩溃时可能丢失最近写入的数据,数据库等强一致性业务应使用默认的 ordered 模式。io.max 限制只对设备繁忙时生效,设为 max 表示不限制对应维度。/sys 只读而失败。调度器 | 适用场景 | 说明 |
mq-deadline | NVMe / SSD | 基于截止时间的多队列调度,默认选项 |
none | NVMe(高性能) | 直通模式,无调度,适用于低延迟设备 |
bfq | 机械硬盘 / 混合 | 公平队列调度,适合交互式场景 |
kyber | NVMe | 自适应调度,适合高并发 |
接口文件 | 取值范围 | 默认值 | 读写含义 |
io.max | MAJ:MIN rbps=<N> wbps=<N> riops=<N> wiops=<N> | 无限制( max) | 读写:设置设备读写带宽和 IOPS 上限 |
io.weight | default 1-10000 | default 100 | 读写:设置 IO 权重,仅在设备繁忙时生效 |
io.stat | 只读 | — | 读:查看当前 IO 统计(字节/IOPS) |
参数 | 取值 | 默认值 | 说明 |
noatime | 挂载选项 | 未启用 | 不更新访问时间,减少写入 |
data=writeback | ordered/writeback/journal | ordered | 写回模式,性能优先。 注意: 系统崩溃时可能导致数据丢失,仅适用于可容忍数据丢失的场景。 |
discard | 挂载选项 | 未启用 | 启用 TRIM(SSD/NVMe) |
sysctl -a 查看当前系统可用参数。参数 | 推荐值 | 默认值 | 说明 |
vm.dirty_ratio | 10-20 | 20 | 脏页占比阈值,触发同步写入 |
vm.dirty_background_ratio | 5-10 | 10 | 脏页占比阈值,触发异步写入 |
vm.dirty_expire_centisecs | 3000 | 3000 | 脏页过期时间(单位:1/100 秒,3000=30秒) |
vm.swappiness | 10-20 | 60 | swap 倾向度,值越低越倾向于回收内存页 |
vm.dirty_writeback_centisecs | 500 | 500 | 脏页回写间隔(单位:1/100 秒,500=5秒) |
none(低延迟)或保持 mq-deadline(默认均衡);机械硬盘推荐 bfq(公平调度)。lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTSvda 253:0 0 50G 0 disk└─vda1 253:1 0 50G 0 part /
# 查看当前调度器(将 <设备名> 替换为上一步获取的实际设备名)# 输出中方括号 [ ] 内为当前生效的调度器,其余为系统支持的可用调度器# 不同设备和内核版本支持的调度器列表可能不同cat /sys/block/<设备名>/queue/scheduler
none [mq-deadline] kyber bfq
none 调度器以获得最佳延迟,机械硬盘推荐 bfq 以获得公平调度。echo none > /sys/block/<设备名>/queue/scheduler
cat /sys/block/<设备名>/queue/scheduler
none [none] kyber bfq
echo 'ACTION=="add|change", KERNEL=="nvme[0-9]*n[0-9]*", ATTR{queue/scheduler}="none"' > /etc/udev/rules.d/60-io-scheduler.rules
udevadm trigger --type=devices --action=change
lsblk -o NAME,MAJ:MIN
NAME MAJ:MINnvme0n1 259:0
259:0 替换为上一步获取的实际设备号,写操作执行成功时均无输出:io.max 限制仅在设备繁忙时生效,设为 max 表示不限制对应维度。mkdir /sys/fs/cgroup/io_limitedecho "259:0 rbps=10485760 wbps=10485760 riops=500 wiops=500" > /sys/fs/cgroup/io_limited/io.maxecho $PID > /sys/fs/cgroup/io_limited/cgroup.procs
cat /sys/fs/cgroup/io_limited/io.max
259:0 rbps=10485760 wbps=10485760 riops=500 wiops=500
noatime 会关闭访问时间记录,依赖 atime 的应用(如 tmpwatch、部分备份和监控工具)可能受影响。mount -o remount,noatime,nodiratime /
mkfs.ext4 格式化操作会清除目标设备上的全部数据,执行前务必用 lsblk 确认设备名正确,避免误格式化系统盘。对根文件系统执行 remount 操作可能影响依赖访问时间(atime)的应用程序。data=writeback 模式在系统崩溃时可能导致数据丢失,仅适用于可容忍数据丢失的场景。请您先确认业务无 atime 依赖且无强一致性要求后再操作。mkfs.ext4 -O has_journal /dev/vdb1mount -o noatime,data=writeback,discard /dev/vdb1 /data
mount | grep /data
/dev/vdb1 on /data type ext4 (rw,noatime,data=writeback,discard)
grep CONFIG_IO_URING=y /boot/config-$(uname -r)
CONFIG_IO_URING=y
kernel.io_uring_disabled 控制 io_uring 可用性:0=全部启用,1=仅特权用户可用,2=完全禁用:sysctl -a | grep io_uring
kernel.io_uring_disabled = 0
kernel.io_uring_disabled 修改后立即生效:1 后普通用户进程将无法使用 io_uring;2 将完全禁用 io_uring,导致依赖 io_uring 的数据库、网络服务等应用无法正常工作。sysctl -w kernel.io_uring_disabled=1
kernel.io_uring_disabled = 1
echo "kernel.io_uring_disabled = 1" > /etc/sysctl.d/99-io-uring.confsysctl --system
sysctl --system 会列出所加载的配置文件及参数值):* Applying /etc/sysctl.d/99-io-uring.conf ...kernel.io_uring_disabled = 1
# 安装 fiodnf install -y fio
--size 和 --numjobs 参数应根据实际硬件规格调整,过大可能消耗过多内存。rm -f seqread.* randrw_*)。fio --name=seqread --rw=read --bs=1M --size=1G --numjobs=1 --time_based --runtime=60 --group_reporting
seqread: (g=0): rw=read, bs=(R) 1024KiB-1024KiB, (W) 1024KiB-1024KiB, (T) 1024KiB-1024KiB, io=60.0GiB...read: IOPS=18.2k, BW=18.2GiB/s (19.6GB/s)(60.0GiB/60001msec)
fio --name=randrw --rw=randrw --bs=4k --size=1G --numjobs=4 --time_based --runtime=60 --group_reporting --rwmixread=70
randrw: (g=0): rw=randrw, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, io=3364MiB...read: IOPS=71.8k, BW=280MiB/s (294MB/s)(42.0GiB/60001msec)write: IOPS=30.7k, BW=120MiB/s (126MB/s)(18.0GiB/60001msec)
read: IOPS=xxx 和 write: IOPS=xxx 为关键指标行,可据此对比调优前后效果。# 1. 确认 root 权限sudo -i# 2. 查看设备支持的调度器cat /sys/block/<设备名>/queue/scheduler# 3. 若目标调度器不在列表中,说明内核未编译该调度器
# 查看设备队列深度cat /sys/block/<设备名>/device/queue_depth# 检查文件系统挂载参数mount | grep <设备名>
# 1. 确认 cgroup v2 已启用mount | grep cgroup2# 2. 确认 io 控制器可用cat /sys/fs/cgroup/cgroup.controllers | grep io# 3. 确认限制值已写入cat /sys/fs/cgroup/<cgroup_name>/io.max
ordered 模式,避免切换为 writeback 模式。/sys 目录通常以只读方式挂载,容器内进程无权限修改块设备调度策略等内核参数。--privileged)启动以获取 /sys 的写入权限。文档反馈