如何调整Ubuntu的磁盘I/O限制
导读:Ubuntu磁盘I/O限制与优化实用指南 一、按设备限速 cgroups blkio(带宽与IOPS) 适用场景:需要对某个磁盘(如**/dev/sdb**)对指定进程或一组进程的读写进行硬限速(带宽B/s或IOPS)。 关键要点: 传...
Ubuntu磁盘I/O限制与优化实用指南
一、按设备限速 cgroups blkio(带宽与IOPS)
- 适用场景:需要对某个磁盘(如**/dev/sdb**)对指定进程或一组进程的读写进行硬限速(带宽B/s或IOPS)。
- 关键要点:
- 传统 blkio 的 throttle 限制对Direct I/O生效;对Buffered I/O(经 PageCache)通常不直接生效。
- 通过写入/sys/fs/cgroup/blkio 的接口设置,值为0表示不限制。
- 操作步骤:
- 确认目标磁盘的主次设备号(示例为8:16)
- ls -l /dev/block/ | grep sdb
- 创建 cgroup(可选,便于管理)
- sudo mkdir -p /sys/fs/cgroup/blkio/myapp
- 设置限速(示例:限制对 sdb 的写入带宽为1MB/s)
- echo “8:16 1048576” | sudo tee /sys/fs/cgroup/blkio/myapp/blkio.throttle.write_bps_device
- 将进程加入该 cgroup(示例 PID=12345)
- echo 12345 | sudo tee /sys/fs/cgroup/blkio/myapp/tasks
- 验证与解除
- 验证:cat /sys/fs/cgroup/blkio/myapp/blkio.throttle.write_bps_device
- 解除:echo “8:16 0” | sudo tee /sys/fs/cgroup/blkio/myapp/blkio.throttle.write_bps_device
- 确认目标磁盘的主次设备号(示例为8:16)
- 常用接口与单位
- blkio.throttle.read_bps_device(读带宽,单位B/s)
- blkio.throttle.write_bps_device(写带宽,单位B/s)
- blkio.throttle.read_iops_device(读 IOPS)
- blkio.throttle.write_iops_device(写 IOPS)
- 示例命令汇总
- 查看设备号:ls -l /dev/block/ | grep sdb
- 限速写 1MB/s:echo “8:16 1048576” | sudo tee /sys/fs/cgroup/blkio/myapp/blkio.throttle.write_bps_device
- 加入进程:echo 12345 | sudo tee /sys/fs/cgroup/blkio/myapp/tasks
- 解除限速:echo “8:16 0” | sudo tee /sys/fs/cgroup/blkio/myapp/blkio.throttle.write_bps_device
- 提示:若要对文件写入限速且希望 throttle 生效,使用O_DIRECT或工具参数开启 Direct I/O(如 dd 的 oflag=direct)。
二、按权重分配 I/O(CFQ/BFQ 场景)
- 适用场景:不设定固定带宽/IOPS,而是按权重在多个 cgroup 之间分配磁盘时间,适合多业务共存、强调“相对公平”的场景。
- 使用前提:blkio 的权重控制依赖CFQ/BFQ调度器;若设备使用none/mq-deadline/kyber等调度器,权重可能不生效。
- 操作步骤:
- 创建 cgroup 并设置权重(示例:两组各权重500)
- sudo mkdir -p /sys/fs/cgroup/blkio/groupA /sys/fs/cgroup/blkio/groupB
- echo 500 | sudo tee /sys/fs/cgroup/blkio/groupA/blkio.weight
- echo 500 | sudo tee /sys/fs/cgroup/blkio/groupB/blkio.weight
- 将进程加入对应 cgroup
- echo < PID_A> | sudo tee /sys/fs/cgroup/blkio/groupA/tasks
- echo < PID_B> | sudo tee /sys/fs/cgroup/blkio/groupB/tasks
- 如需持久化或集中配置,可使用 libcgroup 的配置文件方式(/etc/cgconfig.conf)定义 group 与 blkio.weight 等策略,并启动 cgconfig 服务。
- 创建 cgroup 并设置权重(示例:两组各权重500)
三、I/O调度器选择与切换(优化而非严格限速)
- 适用场景:通过选择更合适的调度器来降低延迟、提升吞吐或改善交互性,常用于 SSD/NVMe、HDD、虚拟化等场景。
- 查看与临时切换
- 查看:cat /sys/block/sdX/queue/scheduler(方括号为当前)
- 临时切换(示例将 sda 设为 deadline):echo deadline | sudo tee /sys/block/sda/queue/scheduler
- 永久生效(GRUB)
- 编辑:/etc/default/grub,在GRUB_CMDLINE_LINUX_DEFAULT中添加 elevator=deadline
- 更新并重启:sudo update-grub & & sudo reboot
- 按设备使用 udev 规则(示例:SSD 使用 noop)
- 新建:/etc/udev/rules.d/99-scheduler.rules
- 内容:ACTION==“add|change”, KERNEL==“sd[a-z]”, ATTR{ queue/rotational} ==“0”, ATTR{ queue/scheduler} =“noop”
- 生效:sudo udevadm control --reload-rules & & sudo udevadm trigger
- 调度器简要建议
- SSD/NVMe:noop / kyber(低开销、并行度高)
- HDD:deadline(兼顾吞吐与响应)
- 桌面/交互式:bfq(公平性、低延迟)
- 注意:较新内核中 cfq 已不推荐,很多发行版默认使用 bfq 或 deadline。
四、文件系统与挂载参数优化(减少不必要写入)
- 常用挂载选项
- noatime:不更新访问时间,显著降低写负载(多数场景推荐)
- discard:启用TRIM(SSD 长期维护性能与寿命,建议开启)
- 示例(/etc/fstab)
- UUID=xxx / ext4 defaults,noatime,discard 0 1
- 提示:某些场景会权衡关闭barrier来提升性能,但会降低断电等异常时的数据一致性保障,生产环境需谨慎评估。
五、验证与监控工具
- 基准与压测
- 顺序吞吐:hdparm -tT /dev/sdX
- 灵活压测:fio(可自定义4k/8k随机/顺序、并发、runtime等)
- 运行时观测
- iostat:iostat -x 1(关注await、r/s、w/s、util)
- iotop:实时查看进程级 I/O(iotop -o)
- 使用建议
- 在“限速/调优”前后分别跑相同基准,验证带宽/IOPS/延迟变化是否符合预期。
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: 如何调整Ubuntu的磁盘I/O限制
本文地址: https://pptw.com/jishu/776529.html
