Linux systemd.resource-control IOWeight 怎样分配服务之间的 IO 权重
给同一 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。
Linux systemd.exec LoadCredential 怎样向服务传入文件凭据
- 上一篇
- Linux systemd.exec LoadCredential 怎样向服务传入文件凭据
- 下一篇
- Linux systemd.kill KillMode 怎样控制停止服务时的进程范围
-
- 文章 · linux | 28分钟前 |
- Linux systemd.timer FixedRandomDelay 怎样保持随机延迟的稳定性
- 432浏览 收藏
-
- 文章 · linux | 32分钟前 |
- Linux systemd.unit AssertPathExists 怎样区分启动断言与启动条件
- 236浏览 收藏
-
- 文章 · linux | 33分钟前 | Linux · 服务管理 · Linux Type=notify READY=1 systemd.service sd_notify 服务初始化
- Linux systemd.service Type=notify 怎样声明服务初始化完成
- 390浏览 收藏
-
- 文章 · linux | 36分钟前 |
- Linux systemd.slice 怎样给同组服务设置资源父级
- 225浏览 收藏
-
- 文章 · linux | 36分钟前 |
- Linux systemd.mount 怎样让挂载单元等待网络可用
- 452浏览 收藏
-
- 文章 · linux | 38分钟前 | Linux ·
- Linux systemd.time 怎样区分时长表达式与时间点表达式
- 469浏览 收藏
-
- 文章 · linux | 39分钟前 |
- Linux systemd.kill KillMode 怎样控制停止服务时的进程范围
- 195浏览 收藏
-
- 文章 · linux | 44分钟前 |
- Linux systemd.exec LoadCredential 怎样向服务传入文件凭据
- 304浏览 收藏
-
- 文章 · linux | 48分钟前 |
- Linux systemd.automount TimeoutIdleSec 怎样卸载空闲自动挂载点
- 488浏览 收藏
-
- 文章 · linux | 48分钟前 |
- Linux systemd.socket Accept 怎样选择每连接服务实例
- 106浏览 收藏
-
- 文章 · linux | 53分钟前 |
- Linux systemd.path PathChanged 怎样监视目录项变化
- 106浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 734次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 736次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 815次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 776次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 611次使用
-
- Linux vmstat 如何分辨内存抖动与磁盘等待:si、so、wa 与复测顺序
- 2026-08-30 501浏览
-
- Linux搭建vsftpdFTP服务器教程
- 2026-04-30 501浏览
-
- Shell脚本安装教程:.sh一键安装指南
- 2026-03-16 501浏览
-
- Linux清空文件内容的几种方法
- 2025-12-01 501浏览
-
- Linux命令行下载文件技巧
- 2025-11-23 501浏览

