news 2026/6/16 9:40:12

cfs调度类深入解刨——RDT科普篇

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
cfs调度类深入解刨——RDT科普篇

上一篇《cfs调度类深入解刨——cfs任务状态统计细节篇》讲述了kernel中cfs任务阻塞、睡眠等统计逻辑及作用。
本篇文章详细分析RDT的实现背景及设计方案。


RDT
设计方案
资源控制(resctrl)的用户界面
相关结构
系列文章列表


RDT

在Linux内核 4.10版本中正式增加了对Intel RDT(资源导向技术)的官方原生支持,并引入了专门用于操控RDT资源的resctrl虚拟文件系统。
针对不同的内核演进阶段,其配置与子功能增加的时间节点如下:

  1. 内核配置编译选项的演进
    随版本更新,内核中开启RDT的编译宏(Configuration Option)发生过几次更名:
    Linux 4.10 - 4.13 版本:使用 CONFIG_INTEL_RDT_A
    Linux 4.14+ 版本:更名为CONFIG_INTEL_RDT
    Linux 5.0+ 及至今:为了兼容AMD的类似技术(如 AMD Platform QoS),该功能被抽象并彻底更名为 CONFIG_X86_CPU_RESCTRL。

https://lwn.net/Articles/694800/

  1. 具体子功能的加入版本
    Intel RDT是一个技术组合,各子功能是分批次合入Linux内核的:
    Linux 4.10:首次加入,支持基础的L3 CAT(三级缓存分配)和监测基础框架。
    Linux 4.12:增加了MBA(内存带宽分配)支持。
    Linux 4.14:通过resctrl文件系统正式支持CMT(缓存占用监测)和MBM(内存带宽监测)。
    Linux 4.16:增加了L2 CDP(二级缓存数据/指令隔离)支持。
    Linux 4.18:增加了高级的MBA软件控制器 (mba_sc),允许管理员直接以绝对值(如MB/s)限制带宽,而不仅是百分比。

设计方案

在传统的多核处理器中,OS可以通过进程调度很好地隔离CPU算力(时间片),通过虚拟内存很好地隔离内存空间(物理地址)。但是,多个CPU核心之间共享的末级缓存(LLC,通常是L3 Cache)和系统内存带宽(Memory Bandwidth),在硬件层面上是一个“大通铺”。
这导致了一个致命问题:“嘈杂邻居(Noisy Neighbor)效应”。一个高吞吐但对延迟不敏感的“流媒体/大数据”应用,可能会疯狂刷新缓存并挤占带宽,导致旁边一个极度敏感的“硬实时/数据库”应用的缓存被全部踢出,引发性能剧烈抖动(Tail Latency飙升)。
Intel RDT(Resource Director Technology,资源导向技术)的整体设计思路就是:引入硬件级的“标签与配额”机制,将原本不可控的共享资源变的可视、可控,从而在硬件层面实现真正的多租户、多应用的服务质量(QoS)隔离。

Intel RDT在硬件设计上不直接对“进程PID”或“内核线程”进行识别,而是通过抽象出两个核心硬件ID,作为连接“软件策略”与“硬件限制”的桥梁:

CLOSID (Class of Service ID,服务等级标识符)
控制标签:硬件预设了有限个(通常为8到32个)服务等级。
作用:每个CLOSID对应一套资源分配规则(比如CLOSID 1可以使用50%缓存,CLOSID 2只能使用10%)。

RMID (Resource Monitoring ID,资源监测标识符)
监控标签:硬件提供的更细粒度的计数器ID(数量通常比CLOSID多得多)。
作用:硬件通过RMID来独立统计不同业务实体的缓存占用量和内存带宽消耗。

动态切换机制:在CPU核心进行进程切换(Context Switch)时,内核会读取当前进程绑定的rdtgroup,并将其中的closid和rmid写入该核心的特定特征寄存器MSR_IA32_PQR_AS(0xc8f)。从此,该核心发出的每一次内存请求,都会携带这两个标签。


Intel RDT将能力拆分为“监测(Monitoring)”和“控制(Allocation)”两个维度,覆盖了缓存和内存两条主线:

  1. CMT (Cache Monitoring Technology) - 缓存占用监测
    思路:硬件根据请求携带的RMID,在LLC内部进行细粒度的计数。
    价值:让管理员知道“到底是谁用光了我的L3缓存”。

  2. CAT (Cache Allocation Tech) - 缓存分配技术
    思路:引入CBM (Capacity Bitmask,容量位图)。将L3缓存水平切分为若干个Bit(如 111111111111 对应 12 个 Way)。
    配置方式:
    CLOSID 0 → 0xFFF (111111111111) → 可以使用100%缓存。
    CLOSID 1 → 0x00F (000000001111) → 只能使用低4位的缓存空间。
    高级模式 CDP (Code and Data Prioritization):将缓存进一步两分,允许对代码段(指令)和数据段应用不同的位图。例如防止数据流的大规模读写把关键的动态链接库指令挤出缓存。

  3. MBM (Memory Bandwidth Monitoring) - 内存带宽监测
    思路:统计每个RMID通过内存控制器(IMC)的本地(Local)和总(Total)物理内存流量。
    价值:精确定位内存密集型(Memory-bound)应用。

  4. MBA (Memory Bandwidth Allocation) - 内存带宽分配
    思路:在CPU核心与网格网络(Mesh/Ring)之间引入一个请求速率调节器(Throttler)。通过引入人工延迟(Delay),降低特定CLOSID向内存控制器发送请求的频率。
    内核增强 (mba_sc):原生硬件通常只支持百分比(如限制到50%延迟级别)。Linux内核在此基础上开发了软件控制器(Software Controller),通过MBM闭环反馈,允许用户直接设定绝对值(如10GB/s)。

在极度苛刻的实时计算中,即使把缓存隔离出来,CPU的正常驱逐机制(Eviction)仍可能因为某些突发读取将关键代码冲刷掉。RDT由此衍生出了伪锁定(Pseudo-Locking)思路:
圈地:通过CAT划出一块独占的缓存片(Way)。
锁死:内核通过特殊的汇编指令(如clflush结合prefetch)把关键代码或数据强制拉入该缓存片,然后关闭该片区的驱逐功能。
效果:这部分缓存直接变成了类似SRAM(片上静态存储器)极其快速且响应时间绝对固定(绝对零Cache Miss带来的延迟抖动)。


Intel RDT的成功之处在于其软硬件协同的闭环设计:


资源控制(resctrl)的用户界面

https://docs.kernel.org/filesystems/resctrl.html

英特尔将此功能称为英特尔资源管理器技术(Intel® RDT)。AMD 将此功能称为AMD平台服务质量(AMD QoS)。
此功能由CONFIG_X86_CPU_RESCTRL和x86 /proc/cpuinfo标志位启用:

名称标志
RDT(资源导向技术)分配“rdt_a”
CAT(缓存分配技术)“cat_l3”、“cat_l2”
CDP(代码和数据优先级)“cdp_l3”、“cdp_l2”
CQM(缓存服务质量监控)“cqm_llc”,“cqm_ocup_llc”
MBM(内存带宽监控)“cqm_mbm_total”,“cqm_mbm_local”
MBA(内存带宽分配)“mba”
SMBA(慢速内存带宽分配)“”
BMEC(带宽监控事件配置)“”
ABMC(可分配带宽监控计数器)“”
SDCIAE(智能数据缓存注入分配强制执行)“”

通过“cat /proc/cpuinfo”查看是否支持以上特性,如“cat /proc/cpuinfo | grep rdt_a”查看是否支持RDT分配。

要使用此功能,请挂载文件系统:

mount-t resctrl resctrl[-o cdp[,cdpl2][,mba_MBps][,debug]]/sys/fs/resctrl

相关结构
structrdtgroup{内核的资源控制(resctrl)子系统中直接对应用户空间挂载的/sys/fs/resctrl目录下的一个控制组(CTRL Group)或监测组(MON Group)structkernfs_node*kn;该资源组在 kernfs 虚拟文件系统中的节点structlist_headrdtgroup_list;系统中所有的rdtgroup实例串联成一个全局双向链表 u32 closid;类分配标识符(Class of Service ID),直接对应CPU硬件控制寄存器(MSR)的 ID。Intel/AMD处理器硬件只能识别有限个(例如8个、16个或32个)CLOSID。当某个CPU核心运行属于该 rdtgroup的进程时,内核会将这个 closid 写入该核心的特定MSR寄存器,硬件据此执行缓存或内存带宽的限制structcpumaskcpu_mask;记录当前属于该资源组的CPU掩码intflags;存储该组的运行期内部状态标志。例如RDT_DELETED标志。当用户rmdir删除一个目录时,内核可能不会立刻销毁结构体(因为还有进程在引用),此时会先将flags标记为已删除,阻止新进程加入atomic_twaitcount;等待机制引用计数,保证多线程/多核并发访问时的安全。例如,防止一个CPU正在读取该组的监控数据时,另一个管理员线程并发将其删除enumrdt_group_typetype;标识该组的类型 主要分为两大类: RDTCTRL_GROUP:控制组(有独立的资源分配策略,如特定的L3缓存大小) RDTMON_GROUP:纯监测组(作为控制组的子目录存在,仅用来监控更细粒度的流量/缓存占用,不涉及分配)structmongroupmon;管理该组对应的硬件监测资源(RMID,Resource Monitoring ID)。内嵌的mongroup结构体中包含硬件级的rmid。CPU硬件通过rmid来统计诸如LLC(末级缓存)占用量(CMT)以及内存总线带宽(MBM)enumrdtgrp_modemode;该资源组中缓存分配(CAT)的模式。 定义了缓存切片(Bit级)的共享与独占属性: RDT_MODE_SHAREABLE:分配的缓存可以和其他组共享 RDT_MODE_EXCLUSIVE:独占模式。此组分配的缓存切片,其他任何组都不能占用,用于极高实时性要求的场景 RDT_MODE_PSEUDO_LOCKED:伪锁定模式enumresctrl_event_idmba_mbps_event;在开启高级内存带宽控制(mba_sc软件控制器)时,指定要监控的事件类型。例如,映射为QOS_MBM_LOCAL_EVENT(本地内存带宽)或 QOS_MBM_TOTAL_EVENT(总内存带宽)。内核的软件控制器会周期性读取该事件的带宽数据,然后动态调整硬件的 MBA 限制级别,以维持用户设定的绝对带宽上限(如1000MB/s)structpseudo_lock_region*plr;指向内核**“伪锁定”(Pseudo-locking)**区域的指针。这是RDT技术的高级特性。当mode被设为伪锁定后,内核会锁定一块特定的L3缓存,使其永远不会被刷回内存。然后通过该指针管理该内存区域,允许特定的极端低延迟应用(如自动驾驶控制软件、硬实时通信)直接将数据常驻L3缓存,彻底消除了缓存未命中(Cache Miss)带来的延迟抖动。};structrftype{内核的资源控制(resctrl)子系统中,structrftype是用于定义和构建控制组文件(Resctrl Files)的模板结构体。rftype 代表的就是/sys/fs/resctrl目录下自动生成的各个配置文件,例如cpus、schemata、tasks和mode等char*name;定义该文件在用户空间显示的名称(如"schemata""tasks"umode_tmode;定义该文件的标准 Linux 文件权限(如0644代表读写,0444代表只读)conststructkernfs_ops*kf_ops;虚拟文件系统操作,提供诸如open、release、mmap等更底层的VFS 回调。通常情况下,标准的resctrl文件不需要直接实现这个字段,而是留空,并交由resctrl核心层统一提供通用的kernfs_ops,然后再分发给下面介绍的seq_show和write回调unsignedlongflags;全局控制标志。用来决定该文件应该在哪些类型的目录中显示 RFTYPE_CTRL_BASE:只在基础控制组(CTRL Group)目录中显示 RFTYPE_MON_BASE:只在监测组(MON Group)目录中显示 RFTYPE_TOP_INFO:只在全局根目录的 info/文件夹中显示unsignedlongfflags;功能依赖标志(Feature Flags)。用于根据当前CPU硬件实际支持的功能,动态决定是否显示该文件。例如,如果CPU支持L3 CAT,带有RFTYPE_FFA_CMT标志的文件(如监测数据文件)才会被创建;如果硬件不支持MBA,相关的带宽配置文件就不会显示int(*seq_show)(structkernfs_open_file*of,structseq_file*sf,void*v);当用户在用户空间执行cat读取该文件内容时,内核会触发这个回调,用来输出多行、格式化的文本数据/* * write是一个通用的写入回调函数,它直接对应于内核的写入操作,并覆盖所有其他操作。最大写入大小由->max_write_len确定 */ssize_t(*write)(structkernfs_open_file*of,char*buf,size_tnbytes,loff_toff);用户执行 echo"xxx">修改配置时,内核会触发这个回调,内核在实现具体的write函数时,会解析buf中的字符串(如解析新的CPU掩码或缓存位图),进行合法性检查,然后更新对应的structrdtgroup结构,并最终通过修改CPU的MSR寄存器将策略应用到硬件};

系列文章列表

《cfs调度类深入解刨——核心结构的用意》
《cfs调度类深入解刨——核心结构细节分析》
《cfs调度类深入解刨——最新内核细节分析1》
《cfs调度类深入解刨——最新内核细节分析2》
《cfs调度类深入解刨——最新内核细节分析3》
《cfs调度类深入解刨——最新内核细节分析4》
《cfs调度类深入解刨——最新内核细节分析5》
《cfs调度类深入解刨——最新内核细节分析6》
《cfs调度类深入解刨——MMU科普篇》
《cfs调度类深入解刨——irq科普篇》
《cfs调度类深入解刨——EAS科普篇》
《cfs调度类深入解刨——clock科普篇》
《cfs调度类深入解刨——HZ科普篇》
《cfs调度类深入解刨——psi科普篇》
《cfs调度类深入解刨——pelt细节篇》
《cfs调度类深入解刨——cfs任务状态统计细节篇》

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/16 9:38:58

AI持久化记忆中间件:构建具备跨会话认知能力的智能体

1. 项目概述:为什么AI应用突然需要“记住自己做过什么”最近在给一个智能客服系统做二次开发时,客户提了个让我愣住的需求:“能不能让机器人记得上周三帮张经理查过服务器日志,这次他一开口问‘上次那个日志’,就直接调…

作者头像 李华
网站建设 2026/6/16 9:38:55

MYD1蛋白详解

MYD1蛋白MYD1(Myeloid Differentiation primary response protein 1)是髓样分化初级应答基因编码的关键调控蛋白,属于MYD88家族成员。该蛋白由296个氨基酸组成,分子量约为33.8kDa,其基因定位于人类染色体3p21.3区域。从…

作者头像 李华
网站建设 2026/6/16 9:37:51

信用卡欺诈检测实战:不平衡数据处理与XGBoost可解释性

1. 项目概述:为什么信用卡欺诈检测是机器学习落地的“黄金练兵场” 如果你刚学完 Pandas 和 Scikit-learn,正发愁找不到一个既真实、又可控、还能立刻看到业务价值的实战项目——那信用卡欺诈检测就是你此刻最该打开的笔记本。它不是 Kaggle 上那种纯为…

作者头像 李华
网站建设 2026/6/16 9:36:51

计算机Java毕设实战-基于 SpringBoot 的健身俱乐部综合管理平台研发与实践 健身房会员与课程管理系统的设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华