当前位置:首页 > 文章列表 > 文章 > linux > systemd 怎样给指定块设备设置 IOWeight

systemd 怎样给指定块设备设置 IOWeight

来源:17golang原创 2026-11-10 07:55:11 0浏览 收藏

systemd 怎样给指定块设备设置 IOWeight

如果一个服务同时访问 NVMe 盘和 SATA 盘,直接设置 IOWeight= 会影响这个服务在所有块设备上的整体 I/O 权重。需要只调整某一块设备时,应使用 IODeviceWeight=,把设备路径和权重写在同一行。权重范围是 1 到 10000,默认值为 100;同一 slice 中参与竞争的 unit 会按相对权重分配可用 I/O 带宽。

官方地址:https://www.freedesktop.org/software/systemd/man/latest/systemd.resource-control.html

最小可用配置是把 IODeviceWeight=/dev/nvme0n1 800 写入目标服务的 [Service] 区段。它只表达该服务在这块设备上的相对权重,不是固定带宽,也不会限制服务访问其他磁盘。

先分清 IOWeight 和 IODeviceWeight

这次排障中最容易混淆的是两个名字相近的选项。IOWeight= 设置服务的整体块 I/O 权重,IODeviceWeight= 则为指定设备设置单独的权重。两者最终都对应统一 cgroup 层级中的 io.weight,区别在于写入的粒度不同。

设置作用范围典型写法适合解决的问题
IOWeight=服务使用的整体块设备 I/OIOWeight=300服务整体应让出或获得更多 I/O 份额
IODeviceWeight=指定的一块设备IODeviceWeight=/dev/nvme0n1 800只调整某个磁盘上的竞争关系
systemd IOWeight 与 IODeviceWeight 作用范围和 cgroup io.weight 关系说明图
图1:说明图,对比整体 IOWeight 与按设备设置的 IODeviceWeight;这是原创结构图,不是运行截图或实测证据。

权重是比例,不是吞吐量承诺。假设同一竞争层级中两个 unit 在同一设备上的权重分别为 800 和 200,它们表达的是大约 4:1 的相对份额;实际吞吐还会受到设备能力、I/O 调度器、父级 cgroup 和其他工作负载影响。

确认目标服务和块设备的层级关系

systemd 的资源控制建立在 cgroup 树上。服务通常挂在某个 slice 下,而 I/O 资源会在同一层级的 unit 之间按权重分配。因此,先确认服务归属和设备节点,再决定配置写在哪个 unit,比盲目修改全局设置更稳妥。

# 查看服务属于哪个 slice,以及 systemd 当前记录的整体和设备权重
systemctl show backup.service \
  -p Slice -p ControlGroup -p IOWeight -p IODeviceWeight

# 查看挂载点对应的设备;把 /var/lib/backup 换成实际数据目录
findmnt -no SOURCE /var/lib/backup

# 用 cgroup 树确认服务没有被放到意外的 slice 或模板实例下
systemd-cgls --all --unit backup.service

设备参数可以写块设备节点,也可以写一个普通文件或目录,让 systemd 尝试推断其背后的块设备。对于复杂 RAID、卷管理或多层存储,这种推断并不覆盖所有情况;若目标明确,优先使用实际物理设备节点或稳定的设备路径。不要把分区、loopback 设备误当成有独立 I/O 调度器的物理设备。

systemd service、slice、IODeviceWeight 与两个物理块设备的层级关系结构图
图2:结构图,展示服务位于 slice 中,并对 nvme 与 sda 分别设置设备权重;这是原创说明图,不是运行截图。

用 drop-in 给指定设备设置权重

不要直接编辑发行版提供的 unit 文件。为目标服务创建 drop-in,可以把本地策略与软件包文件分开,并且方便撤销。下面假设服务名为 backup.service,希望它在 NVMe 盘上优先于普通构建任务,在 SATA 盘上保持较低份额:

# 创建目标服务的 drop-in;保存后只覆盖本地资源控制配置
sudo systemctl edit backup.service

# 在编辑器中写入 [Service] 区段
[Service]
# NVMe 盘上的备份 I/O 使用较高相对权重
IODeviceWeight=/dev/nvme0n1 800
# SATA 盘上的备份 I/O 使用较低相对权重
IODeviceWeight=/dev/sda 200

# 让 systemd 重新读取 drop-in;这一步不会自动重启服务
sudo systemctl daemon-reload

# 需要让运行中的 unit 与新配置完全一致时再重启服务
sudo systemctl restart backup.service

IODeviceWeight= 可以重复出现,用于多个设备。示例中的数值只是表达配置关系,不代表任何机器上的推荐带宽;真正的优先级要和同一 slice 中其他 unit 的对应权重一起看。

检查 unit 属性是否已经落地

配置文件写入后,先通过 systemd 查看 unit 属性,再沿着 ControlGroup 路径读取 cgroup v2 的接口。这样能把“文件写对了”和“运行中的 cgroup 正在使用它”分开判断。

# 查看 unit 的 slice、cgroup 路径和设备权重
systemctl show backup.service \
  -p Slice -p ControlGroup -p IOWeight -p IODeviceWeight

# 读取 systemd 返回的 cgroup 相对路径,避免手写实例目录
cg=$(systemctl show -p ControlGroup --value backup.service)

# 查看统一层级中的 io.weight;每行通常对应一个设备及其权重
sudo sh -c "cat /sys/fs/cgroup${cg}/io.weight"

# 查看统一 cgroup v2 挂载点的文件系统类型
stat -fc %T /sys/fs/cgroup

如果 systemctl show 能看到配置,但 cgroup 接口没有预期内容,优先检查系统是否使用 unified cgroup hierarchy、服务是否已经重新加载,以及 ControlGroup 是否为空或指向了另一个实例。不要只凭服务日志里“启动成功”就判断 I/O 权重已经生效。

为什么设置了 IODeviceWeight 仍然感觉没有变化

这类问题通常不是语法错误,而是比较对象或生效条件不对:

  1. 比较错设备:服务实际写入的目录可能在另一块盘上,先用 findmnt 确认挂载来源。
  2. 权重没有共同竞争层级:权重是相对值,只有在相同设备、相互竞争的 unit 之间才有可观察的份额差异。
  3. 设备节点不合适:分区、loopback 或复杂卷管理路径可能无法映射到预期的物理 I/O 调度对象。
  4. 把权重当成限速:IODeviceWeight= 不提供固定的 MB/s 上限;要限制读写带宽,应评估 IOReadBandwidthMax= 或 IOWriteBandwidthMax=。
  5. 只改配置没有检查运行路径:模板服务、实例服务和自定义 slice 可能让你查看了错误的 unit 或 cgroup 目录。

systemd 文档说明这些资源控制项在统一 cgroup 层级上工作。即使 unit 文件语法正确,如果系统环境、内核控制器或存储拓扑不满足条件,也不能把一个权重值解释成稳定的吞吐保证。

一份可以复用的配置清单

  • 先用 IOWeight= 还是 IODeviceWeight= 表达清楚资源范围。
  • 用 findmnt 确认业务目录真实落在哪个块设备。
  • 用 drop-in 保存配置,不覆盖软件包自带的 unit 文件。
  • 重复写 IODeviceWeight= 时,为每个设备使用明确的设备路径和 1–10000 范围内的权重。
  • 执行 daemon-reload 后,检查 systemctl show、ControlGroup 和 io.weight。
  • 若目标是硬性带宽上限,改看 bandwidth/IOPS 类设置,不要继续调大或调小权重。

相关问题

IODeviceWeight 和 IOWeight 能同时配置吗?

可以分别表达整体和按设备的策略,但应先明确各自的作用范围。按设备设置不会自动变成服务所有磁盘的统一权重。

权重 800 是否意味着能得到 800 MB/s?

不是。它是相对权重,表示在相同竞争关系中比权重 200 的 unit 获得更大的 I/O 份额,不是吞吐量单位。

能不能把目录直接写给 IODeviceWeight?

可以写普通文件或目录,systemd 会尝试找出其文件系统背后的块设备,但复杂 RAID、卷管理等拓扑不一定能正确推断。需要确定性更高时应先确认实际设备。

如何限制某块盘的最大读写速度?

使用 IOReadBandwidthMax=、IOWriteBandwidthMax= 或 IOPS 类控制项评估硬上限;IODeviceWeight= 只负责竞争优先级。

参考资料

systemd 资源控制:https://www.freedesktop.org/software/systemd/man/latest/systemd.resource-control.html

版本声明
本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
Range.extractContents 怎样移动选中的部分 DOM 内容Range.extractContents 怎样移动选中的部分 DOM 内容
上一篇
Range.extractContents 怎样移动选中的部分 DOM 内容
服装门店进货时怎样核对纤维成分标识与合格证明
下一篇
服装门店进货时怎样核对纤维成分标识与合格证明
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之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模型性能。
    966次使用
  • H2O EvalGPT:开源LLM大模型评估与排行榜工具
    H2O EvalGPT
    H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
    967次使用
  • LMArena是什么?伯克利AI模型评估平台使用指南与功能解析
    LMArena
    LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
    1077次使用
  • 斯坦福HELM:大语言模型Holistic Evaluation整体评估框架详解
    HELM
    深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
    1058次使用
  • MMBench详解:多模态大模型基准测试、功能特点与使用指南
    MMBench
    MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
    889次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议 和 隐私政策
返回登录
  • 重置密码