登录
推荐 文章 Go 技术 课程 下载 专题 AI
首页 >  文章 >  linux

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 控制具有独立配置和启用条件,不能假定机器默认已经启用。

同一slice中两个服务权重与共享块设备的静态关系
原创结构图:同层服务属于共同父级,权重影响共享设备上的竞争关系;连线不代表执行顺序或带宽实测。

给同层服务设置持久权重

使用 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。

参考:systemd资源控制文档、Linux cgroup v2文档。

声明:本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>