linux中io_priority由ionice控制,分实时(-c1)、尽力而为(-c2)、空闲(-c3)三类:-c1立即服务但需root权限且风险高;-c2为默认,用-n0–7调节相对权重;-c3仅在无其他i/o时运行,无-n参数。

在 Linux 中,io_priority(I/O 优先级)由 ionice 命令控制,其底层对应的是内核的 ioprio 接口。它不调控 CPU,只影响进程向块设备(如 HDD/SSD)发起读写请求时被 I/O 调度器(如 CFQ、BFQ、deadline)处理的顺序和频次。核心调度策略分为三类:实时(RT)、尽力而为(BE)、空闲(Idle),分别对应 -c1、-c2、-c3。
实时类(-c1):最高保障,慎用
该类进程的 I/O 请求会被立即服务,抢占所有其他 I/O 资源。适用于极少数对延迟极度敏感、且能完全掌控系统负载的场景(如实时音视频采集直写磁盘)。普通用户默认无权限使用;需 root 或 CAP_SYS_ADMIN 权限。
- 指定优先级时,
-n后跟 0–7(数值越小,实际带宽占比越高;但与 BE 类的“0–7”语义不同,它更接近“每轮服务时间配额”) - 示例:
sudo ionice -c1 -n0 dd if=/dev/zero of=/tmp/test bs=4K count=10000 - ⚠️ 风险:一个持续刷盘的
-c1进程可能导致 SSH 登录卡顿、系统日志无法写入、甚至 UI 冻结
尽力而为类(-c2):默认通用策略
绝大多数用户进程属于此类,也是未显式设置时的默认值。它通过 0–7 的 nice 级别(0 最高,7 最低)调节相对权重,与 CPU 的 nice 值存在近似换算关系:ioprio_nice = (cpu_nice + 20) / 5(向下取整)。
- 例如:CPU
nice = -10→ 对应 I/O nice ≈ 2;nice = 10→ I/O nice ≈ 6 - 启动新进程:
ionice -c2 -n5 find /var/log -name "*.log" -exec gzip {} \; - 调整运行中进程:
ionice -c2 -n7 -p $(pgrep -f "rsync --backup")
空闲类(-c3):后台任务专用
该类进程仅在系统无其他 I/O 活动时才被允许执行磁盘操作。没有 -n 参数(即无子优先级),适合不影响响应性的维护任务,如日志轮转、离线备份、索引重建等。
- 典型用法:
ionice -c3 logrotate -f /etc/logrotate.conf - 配合
renice更彻底降载:ionice -c3 renice 19 -p $(pgrep backup.sh) - 注意:即使设为
-c3,若磁盘长时间空闲,它仍会获得完整带宽;它不保证“慢”,只保证“不争抢”
查看与验证当前设置
用 ionice -p PID 可查看任意进程当前的 I/O 类别与级别。例如:
-
ionice -p 1234输出io priority = 2:nice = 4表示 BE 类、优先级 4 - 输出
io priority = 3表示 Idle 类(无冒号后数值) - 搭配
iotop -o可实时观察各进程 I/O 带宽占用是否符合预期











