首页主机资讯如何调整Ubuntu的磁盘I/O限制

如何调整Ubuntu的磁盘I/O限制

时间2025-12-19 19:05:04发布访客分类主机资讯浏览1061
导读:Ubuntu磁盘I/O限制与优化实用指南 一、按设备限速 cgroups blkio(带宽与IOPS) 适用场景:需要对某个磁盘(如**/dev/sdb**)对指定进程或一组进程的读写进行硬限速(带宽B/s或IOPS)。 关键要点: 传...

Ubuntu磁盘I/O限制与优化实用指南

一、按设备限速 cgroups blkio(带宽与IOPS)

  • 适用场景:需要对某个磁盘(如**/dev/sdb**)对指定进程或一组进程的读写进行硬限速(带宽B/sIOPS)。
  • 关键要点:
    • 传统 blkio 的 throttle 限制对Direct I/O生效;对Buffered I/O(经 PageCache)通常不直接生效。
    • 通过写入/sys/fs/cgroup/blkio 的接口设置,值为0表示不限制。
  • 操作步骤:
    1. 确认目标磁盘的主次设备号(示例为8:16
      • ls -l /dev/block/ | grep sdb
    2. 创建 cgroup(可选,便于管理)
      • sudo mkdir -p /sys/fs/cgroup/blkio/myapp
    3. 设置限速(示例:限制对 sdb 的写入带宽为1MB/s
      • echo “8:16 1048576” | sudo tee /sys/fs/cgroup/blkio/myapp/blkio.throttle.write_bps_device
    4. 将进程加入该 cgroup(示例 PID=12345)
      • echo 12345 | sudo tee /sys/fs/cgroup/blkio/myapp/tasks
    5. 验证与解除
      • 验证: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
  • 常用接口与单位
    • 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等调度器,权重可能不生效。
  • 操作步骤:
    1. 创建 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
    2. 将进程加入对应 cgroup
      • echo < PID_A> | sudo tee /sys/fs/cgroup/blkio/groupA/tasks
      • echo < PID_B> | sudo tee /sys/fs/cgroup/blkio/groupB/tasks
    3. 如需持久化或集中配置,可使用 libcgroup 的配置文件方式(/etc/cgconfig.conf)定义 group 与 blkio.weight 等策略,并启动 cgconfig 服务。

三、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
如何通过ulimit防止Ubuntu过载 Debian系统中TigerVNC的错误日志分析

游客 回复需填写必要信息