Linux systemd.resource-control IOWeight 怎样分配服务之间的 IO 权重
来源:17golang原创
时间:2026-10-27 14:05:20 102浏览 收藏
给同一 slice 中的服务设置不同 IOWeight,可以表达共享块设备繁忙时的相对 IO 分配倾向。取值为 1 到 10000,内核默认权重为 100。它不是固定带宽承诺,也不是百分比;配置被 systemd 接受,还要看 cgroup v2、内核 IO 控制机制和设备是否支持相应分配。
这里以交互查询服务 search-api.service 与后台归档服务 archive-worker.service 为例。我会先把两个服务的父级和设备查清,再考虑提高查询权重。以下是配置示例与判断方法,没有在本文环境执行或测得性能数据。
先明确竞争范围与可用条件
权重比较发生在 cgroup 层级中的同级节点。示例假设两个服务均位于 system.slice,且争用同一块底层设备。如果服务分属不同 slice,应先看父 slice 之间的分配;叶子服务的较大数字不能绕过父级约束。若访问不同设备,或者一个任务主要命中页缓存,也不能用两个权重直接预测吞吐。
IOWeight 对应统一层级的 io.weight。不要把它与旧 cgroup v1 的设置名称混用。还要检查发行版内核和实际设备采用的权重控制实现;仅看到配置项不代表设备正在按它分配。内核文档中的 IO cost 控制具有独立配置和启用条件,不能假定机器默认已经启用。

给同层服务设置持久权重
使用 drop-in 保存修改,不直接编辑发行版提供的主 unit 文件。运行下列编辑命令时,把服务名替换为实际名称:
# 为交互查询服务打开持久覆盖文件 sudo systemctl edit search-api.service # 为归档服务分别打开持久覆盖文件 sudo systemctl edit archive-worker.service
查询服务的覆盖文件写入:
# 查询服务的资源设置 [Service] # 开启块IO统计,便于后续观察 IOAccounting=yes # 表达相对较高的竞争权重 IOWeight=400
归档服务的覆盖文件写入:
# 归档服务的资源设置 [Service] # 开启块IO统计 IOAccounting=yes # 保留较低的相对竞争权重 IOWeight=100
400 与 100 表达 4:1 的相对权重关系,不表示查询必得磁盘峰值的80%,更不表示响应时间缩短四倍。其他同级任务、设备控制实现与负载形态都会改变结果。确认覆盖文件保存后,可显式重新读取配置,并在合适的维护窗口重启服务:
# 重新读取unit和覆盖文件 sudo systemctl daemon-reload # 维护窗口内重新启动示例服务,使配置重新应用 sudo systemctl restart search-api.service archive-worker.service
把权重与启动阶段、设备限制分开
IOWeight 面向常规运行阶段;StartupIOWeight 用于系统启动与关机阶段,未设置后者时沿用前者。这里的“启动”不是每次手动启动某个服务都自动进入一套独立服务启动权重。
需要单独覆盖某个设备的权重时使用 IODeviceWeight。路径与底层设备的映射必须正确,复杂 RAID、卷管理等场景不能照搬简单设备路径的推断。若目标是归档任务即使磁盘空闲也不超过某个写入速率,应研究 IOWriteBandwidthMax;读方向则对应 IOReadBandwidthMax。这些设备带宽上限与相对权重承担不同任务。

观察配置与实际 IO 的差别
# 阅读合并后的服务文件,确认覆盖内容 systemctl cat search-api.service # 获取实际父级、控制组路径和资源属性 systemctl show search-api.service -p Slice -p ControlGroup -p IOWeight -p IOAccounting # 检查内核提供的cgroup控制器列表 cat /sys/fs/cgroup/cgroup.controllers
配置读取结果只能说明管理器看到什么。进一步定位 ControlGroup 对应目录,在当前 cgroup v2 挂载点下读取其 io.weight、io.stat,结合设备控制机制判断。io.stat 是累计计数,不是实时速率;间隔采样才有可比较的增量。不要把 shell 输出模板当作本文实测结果。
进行实际比较时,应保持相同设备、相近请求形态与持续竞争条件,并同时关注查询延迟和归档完成时间。缓冲写入可能延后落盘,文件系统对 cgroup writeback 的支持也影响 IO 归属;应用写入字节数与当时块层统计不必一致。
按场景选择并保留回退
| 目标 | 优先考虑 | 注意事项 |
|---|---|---|
| 繁忙时调整同层服务倾向 | IOWeight | 先确认层级与设备支持 |
| 启动关机阶段另设倾向 | StartupIOWeight | 区别于单服务启动事件 |
| 某设备单独分配 | IODeviceWeight | 确认底层设备映射 |
| 约束绝对读写速率 | 设备带宽上限 | 空闲时也可能限制吞吐 |
只修改本次新增 drop-in 中的权重或删除该条配置,再重新加载并在维护窗口重启,即可回到原有设置;保留该文件中其他资源配置。不要为了回退 IOWeight 清空整个服务的覆盖目录。
IOWeight 设置很大却看不出差别?
依次看是否同设备竞争、是否同级、控制机制是否有效以及请求是否真正到达块设备。没有竞争时,不应期待权重凭空增加硬件能力。
是否一定要设置 IOAccounting?
它用于统计。本文显式开启便于观察;不能把统计开关视作设备比例控制已经有效的证明。
把归档设成1能保证查询延迟吗?
不能。极低权重仍不等于延迟保证,甚至可能导致后台任务积压。需要根据业务目标观察并调整,而不是只追求数字差距。
官方文档入口:https://www.freedesktop.org/software/systemd/man/latest/systemd.resource-control.html;内核说明:https://docs.kernel.org/admin-guide/cgroup-v2.html。
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
432 收藏
-
236 收藏
-
390 收藏
-
225 收藏
-
452 收藏
-
469 收藏
-
195 收藏
-
304 收藏
-
488 收藏
-
106 收藏
-
106 收藏
-
490 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习