当前位置:首页 > 文章列表 > 文章 > linux > Linux systemd.resource-control IOWeight 怎样分配服务之间的 IO 权重

Linux systemd.resource-control IOWeight 怎样分配服务之间的 IO 权重

来源:17golang原创 2026-10-27 14:05:20 0浏览 收藏

给同一 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删除
Linux systemd.exec LoadCredential 怎样向服务传入文件凭据Linux systemd.exec LoadCredential 怎样向服务传入文件凭据
上一篇
Linux systemd.exec LoadCredential 怎样向服务传入文件凭据
Linux systemd.kill KillMode 怎样控制停止服务时的进程范围
下一篇
Linux systemd.kill KillMode 怎样控制停止服务时的进程范围
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • PubMedQA数据集详解:生物医学问答基准、功能与应用指南
    PubMedQA
    深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
    734次使用
  • H2O EvalGPT:开源LLM大模型评估与排行榜工具
    H2O EvalGPT
    H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
    736次使用
  • LMArena是什么?伯克利AI模型评估平台使用指南与功能解析
    LMArena
    LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
    815次使用
  • 斯坦福HELM:大语言模型Holistic Evaluation整体评估框架详解
    HELM
    深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
    776次使用
  • MMBench详解:多模态大模型基准测试、功能特点与使用指南
    MMBench
    MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
    611次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议 和 隐私政策
返回登录
  • 重置密码