一、引言
MPAM(Memory System Resource Partitioning and Monitoring)是 ARM v8 引入的新特性,对标 x86 的 RDT 特性,可以实现对 Cache、内存带宽、SMMU 等资源的分配及监控功能。该特性可以从硬件层面减少不同工作负载之间的性能干扰,确保高优先级任务性能的稳定性,在虚拟化、混部等业务中取得了良好的效果。
二、MPAM特性简介
2.1 MPAM整体框架
MPAM 特性的整体框架如图1所示。其中,MPAM 硬件上是通过 MSC(Memory System Component)实现的。MPAM 将提供资源管理功能组件称为 MSC,可以对资源请求进行处理。完整的系统模型中一般拥有多个 MSC,分别负责管理不同资源。MPAM 为资源访问请求添加了 PARTID 和 PMG 标识,MSC 可以对该标识进行区分处理,进而实现资源的隔离和监控功能。
根据 MPAM 手册的介绍,除了基本的 Cache 和内存带宽资源隔离和监控外,MPAM 可以实现比 Intel RDT 更为丰富的资源隔离和监控特性,包括:
- 提供对 SMMU 资源的支持
- 提供对 Cache 和内存带宽资源进行最大最小值限制
- 提供基于优先级的资源隔离支持
MPAM 驱动作为核心部分,对下完成了 MPAM 硬件功能的访问和设置,包括 MPAM 资源的获取和初始化、MPAM 中断初始化以及对 MPAM 相关寄存器的读写,对上则与 resctrl fs 用户态接口层进行交互。
resctrl fs 接口层以资源调配 group 为单位提供了资源隔离和监控的用户态接口,并通过 info 接口暴露 MPAM 硬件相关信息。此外,其底层还完成了 PARTID 和 PMG 的分配和回收。
2.2 MPAM资源隔离特性
MPAM 资源隔离特性的关键是由 MSC 组件维护的资源配置表。资源配置表中包含了不同 PARTID 和对应资源分配方案的映射。
对于每一次资源请求,该资源对应的 MSC 会通过请求中的 PARTID 查找自身的配置表,然后按照表中与该 PARTID 相对应的方案进行资源分配。这样,通过将不同业务应用或VM与不同PARTID相绑定,就可以达到资源隔离的目的。
通过图2左侧部分可以看到,不同资源分配方案的表示方法是有所区别的,这与资源的拆分方式不同有关。Cache 资源使用了 Bit Map,每一bit表示了对应的 Cache way 是否能够被分配;内存带宽资源则使用了百分比,表示该方案能够分配的内存带宽比例。
2.3 MPAM资源监控特性
资源监控可以看做是 MPAM 在支持资源隔离功能后的附加功能。MPAM 除了拥有资源隔离组件外,还拥有一定数目的资源 monitor。资源 monitor 可以实现对特定标识的资源使用情况的监控。
为了实现对使用同一个 PARTID 的不同 task 分别进行资源监控,MPAM引入了PMG(Performance Monitoring Group)的概念。资源监控接口通过选取对应的 PARTID 和 PMG,即可获取到对应的资源使用情况。
2.4 龙蜥 OS 对倚天 MPAM 特性的支持
龙蜥 OS 5.10.134-12.al8 版本基于 resctrl 文件系统实现了对倚天芯片的 MPAM 特性的支持,同时保证了对 x86 RDT 特性和鲲鹏的 MPAM 特性的兼容。对应的代码仓库在https://gitee.com/anolis/cloud-kernel中。其中,MPAM 支持相关代码路径包括:
- drivers/platform/mpam —— MPAM 驱动代码
- drivers/acpi/arm64 —— MPAM ACPI 解析代码
- fs/resctrl —— 用户态接口实现代码
- arch/x86/kernel/cpu/resctrl —— x86 RDT 特性架构相关代码
- drivers/staging/kunpeng/mpam —— 鲲鹏 MPAM 特性相关代码
目前,龙蜥 OS 针对倚天芯片提供了 L3 Cache 和内存带宽两种资源的资源隔离和监控接口。接口的主要特性如下:
- 提供最大 64 个 PARTID 支持
- 提供 4 个 monitor 支持
- 支持 per-numa 的 16 way L3 CAT(Cache Allocation Technology)特性
- 支持 per-numa 的 16 way L3 CDP(Code and Data Prioritization)特性
- 支持 per-numa 的 L3 Cache 资源监控特性
- 支持 per-numa 的粒度为 5% 的 MBA(Memory Bandwidth Allocation)特性(受硬件限制,该特性目前效果较差)
- 支持 per-numa 的内存带宽资源监控特性
- 支持 MPAM 寄存器错误中断检测
对应测试文档在https://openanolis.cn/sig/ARM\_ARCH\_SIG/doc/657742613244594693。
三、MPAM的使用
3.1 开启MPAM
- 首先需要确保当前内核支持 MPAM 功能,需要设置
CONFIG_ARM64_MPAM
和CONFIG_RESCTRL_FS
; - 在 cmdline 或 grub.cfg 文件中添加
mpam=acpi
,使能 MPAM 功能; - 系统启动后,需要手动挂载 resctrl 文件系统到 /sys/fs/resctrl 目录。
mount -t resctrl resctrl /sys/fs/resctrl
3.2 MPAM 用户态接口
MPAM 的用户态接口复用了 Intel RDT 功能的 resctrl 文件系统。resctrl 文件系统的目录结构如下图。
3.2.1 资源调配 group
开启 MPAM 功能后,操作系统中的每个进程(线程)都会与 resctrl 文件系统中的一个资源调配 group 相绑定。每个资源调配 group 在 MPAM 中对应着一个 PARTID。在 /sys/fs/resctrl 下新创建的每个目录将分别对应一个新的资源调配 group,每个资源调配 group 中会自动添加以下文件和目录:
|-- cpus
|-- cpus_list
|-- id
|-- mode
|-- mon_data
|-- mon_groups
|-- schemata
|-- size
`-- tasks
其中各文件和目录的作用为:
schemata:表示该 group 对各个资源的分配方案,可读写。
mon_data:该目录中各个文件包含了对各个资源的监控值,只读。
cpus:以 bitmask 的形式表示该 group 所控制的逻辑 CPU,可读写。
cpus_list: 与 cpus 含义一致,但以 range 的形式(如0-63)表示该 group 所控制的逻辑 CPU,可读写。
tasks:表示该 group 所控制的 task pid,可读写。
id:创建 group 时随机生成,用于唯一标识一个 group,只读。
mode:表示当前 group 的分配方式,目前仅支持 shareable 方式。
mon_groups: 该目录用于创建仅用于监控功能的子 group,暂不可用。
size:表示该 group 下各个资源所能使用的资源大小,只读。
观察 /sys/fs/resctrl 目录可以发现,该目录自带了一个资源调配 group。这个 group 是作为 MPAM 开启后各 cpu 和 task 使用的默认 group 使用的。该 group 默认可以实现对各资源 100% 的占用。
3.2.2 资源隔离与schemata文件
使用资源隔离特性的关键是 schemata 文件,schemata 中包含了对该 group 的资源分配方案。其基本格式为如下:
MB:0= 100;1= 80
L3:0=ffff;1=fff0
其中,
- L3 cache 资源的分配以 bit mask 进行表示,
L3:0=ffff;1=fff0
表示所属该 group 的 cpu 和 task 可以分配到 NUMA 0 的 L3 cache 的完整 16 way,NUMA 1 的 L3 cache 的高 12 way。 - 内存带宽资源的分配以百分比进行表示,
MB:0=100;1=80
表示所属该 group 的 cpu 和 task 可以分配到 NUMA 0 最多 100% 的内存带宽,NUMA 1 最多 80% 的内存带宽。
3.2.3 资源监控与mon_data目录
mon_data 目录下相关文件完成了 MPAM 的资源监控特性,倚天中 mon_data 目录结构如下:
mon_data
|-- mon_L3_00
| `-- llc_occupancy
|-- mon_L3_01
| `-- llc_occupancy
|-- mon_MB_00
| `-- mbm_local_bytes
`-- mon_MB_01
`-- mbm_local_bytes
其中,
- L3 cache 资源监控对应着 mon_L3_<id> 目录,该目录下包含了对应 NUMA 节点下 L3 cache 资源的当前使用情况。目前该目录下只有 llc_occupancy 一个文件,该文件以byte为单位显示了当前 group 各个 task 的 L3 cache 用量。
- 内存带宽资源监控对应着 mon_MB_<id> 目录,该目录下包含了对应 NUMA 节点下内存带宽资源的当前使用情况。目前该目录下只有 mbm_local_bytes 一个文件,该文件以 byte/s 为单位显示了当前 group 各个 task 的内存带宽统计值。
3.2.4 info目录
/sys/fs/resctrl 目录下除了包含一个默认 group 所需要的相关文件和目录外,还有一个 info 目录。info 目录中包含了当前机器能够支持 MPAM 扩展中资源分配和监测功能的详细信息。目前倚天机器上该目录中有以下内容:
info/
|-- L3
| |-- bit_usage
| |-- cbm_mask
| |-- min_cbm_bits
| |-- num_closids
| `-- shareable_bits
|-- L3_MON
| |-- max_threshold_occupancy
| |-- mon_features
| `-- num_rmids
|-- MB
| |-- bandwidth_gran
| |-- delay_linear
| |-- min_bandwidth
| `-- num_closids
|-- MB_MON
| |-- mon_features
| `-- num_rmids
`-- last_cmd_status
- L3 目录包含了 L3 cache 资源隔离特性的相关信息,其中各文件及其含义为
- bit_usaged:以 bitmask 的形式表示 L3 各 way 当前的使用情况,在倚天机器中,默认为
0=XXXXXXXXXXXXXXXX;1=XXXXXXXXXXXXXXXX
。 - cbm_mask:对应着 L3 cache 资源可以设置的最大 bitmask,同时该 mask 也对应着 100% 的 cache 资源占用。
- min_cbm_bit:对 L3 cache 资源可以设置的最小 bit 数。
- num_closids:L3 cache 资源所能够创建的最大 group 数目,该值包含了 resctrl 文件系统挂载后自带的默认group。
- shareable_bits:以 bitmask 的形式表示 L3 cache 资源与其他实体(例如I/O)的共享情况。
- bit_usaged:以 bitmask 的形式表示 L3 各 way 当前的使用情况,在倚天机器中,默认为
- L3_MON 目录包含了 L3 cache 资源监控特性的相关信息,其中各文件及其含义为
- max_threshold_occupancy:资源监控 monitor 被释放之后可能无法立即使用,因为之前的 cache 占用会影响 monitor 结果的准确性。max_threshold_occupancy 用于配置可以真正释放 monitor 的 cache占用。
- mon_features:显示 L3 cache 有哪些资源监控特性,与 mon_data/mon_L3_xx 中文件相对应。
- num_rmids:可用的 monitor 数目,倚天机器该值为 4。
- MB 目录包含了内存带宽资源隔离特性相关信息,其中各文件及其含义为:
- bandwidth_gran:内存带宽设置的百分比粒度,倚天机器该值为 5。
- delay_linear:与 Intel 机器中内存带宽资源隔离特性相关的值,倚天机器中默认为 true,即 1。
- min_bandwidth:内存带宽百分比设置的最小值,与 bandwidth_gran 相等,倚天机器中该值为 5。
- num_closids:内存带宽资源所能够创建的最大 group,该数目包含了 resctrl 文件系统的默认 group。
- MB_MON 目录包含了内存带宽资源监控特性相关信息,其中各文件及其含义为:
- mon_features:显示内存带宽有哪些资源监控特性,与 mon_data/mon_MB_xx 中文件相对应。
- num_rmids:可用的 monitor 数目,倚天机器该值为 4。
- last_cmd_status:文件中包含了相关指令所出现的问题,可以通过读取该指令获取 resctrl 文件系统中相关操作失败的原因。
3.3 MPAM 使用示例
3.3.1 配置两个资源调配 group
mount -t resctrl resctrl /sys/fs/resctrl
cd /sys/fs/resctrl
# 创建两个资源调配group p0和p1
mkdir p0 p1
# 令p0使用Node0的高12路L3 Cache,Node1的低12路L3 Cache
echo "L3:0=0xfff0;1=0x0fff" > /sys/fs/resctrl/p0/schemata
# 令p1使用Node0的低12路L3 Cache,Node1的高12路L3 Cache
echo "L3:0=0x0fff;1=0xfff0" > /sys/fs/resctrl/p1/schemata
# 限制p0和p1的MB上限不超过50%
echo "MB:0=50;1=50" > /sys/fs/resctrl/p0/schemata
echo "MB:0=50;1=50" > /sys/fs/resctrl/p1/schemata
# 读取两个文件
cat /sys/fs/resctrl/p0/schemata
cat /sys/fs/resctrl/p1/schemata
此时 /sys/fs/resctrl/p0/schemata 和 /sys/fs/resctrl/p1/schemata 两个文件中的内容分别为:
MB:0=50;1=50
L3:0=fff0;1=0fff
MB:0=50;1=50
L3:0=0fff;1=fff0
3.3.2 为指定进程/线程分配资源调配 group
以 3.3.1 中已创建的 p0 资源调配 group 为例,此处限制 pid 为 12345 的进程/线程使用 p0 资源调配 group 所限定的资源。需要注意的是,新创建的子进程将继承父进程的 PARTID 和 PMG 信息,但已创建的子进程将不受影响。
# 将pid 12345加入p0资源调配group
echo 12345 > /sys/fs/resctrl/p0/tasks
之后,pid 为 12345 的进程/线程将自动从 /sys/fs/resctrl/tasks 移动到 /sys/fs/resctrl/p0/tasks 文件中。
3.3.3 为指定cpu分配资源调配 group
# 将cpu 99、100、101移入p1资源调配group
echo "99-101" > /sys/fs/resctrl/p1/cpus_list
# 或者
echo "38,00000000,00000000,00000000" > /sys/fs/resctrl/p1/cpus_list
之后,cpu 99-101 将从 /sys/fs/resctrl/cpus_list 中移动到 /sys/fs/resctrl/p1/cpus_list 中。
3.3.4 读取 cache/内存带宽 的 monitor 值
仍然以 3.3.1 中创建的 p0 资源调配group为例,要获取 p0 资源组各进程的资源占用值,通过 cat 即可得到实时监控结果。
cat /sys/fs/resctrl/p0/mon_data/mon_L3_0*/llc_occupancy
cat /sys/fs/resctrl/p0/mon_data/mon_MB_0*/mbm_local_bytes
3.4 模拟混部L3 cache隔离
混部是 MPAM 资源隔离的一个重要应用场景。此处分别以 SPECjbb 2015 和 stress-ng 程序分别模拟云环境上广泛使用的 java 类在线作业上和离线作业,对 MPAM 的 L3 cache 隔离功能进行验证。
在前 40s 的时间内,两个程序共享L3 cache所有资源。在约 40s 后,开始隔离在线和离线L3 cache资源的使用,在离线任务 L3 cache 的配比分别为 0xffff 和 0xf。
通过实验结果可以看到,在 L3 cache 资源共享的情况下,离线资源对在线资源干扰明显,L3 cache 竞争激烈,波动幅度很大;在对 L3 cache 资源进行隔离后,一方面离线得到了持续有效的压制,L3 cache 占有率大幅下降,另一方面在线性能提升明显,平均 L3 cache 占用提升了约 78%,且波动幅度变小,L3 cache 占用更加稳定。
文章来源:龙蜥社区
推荐阅读
更多Arm服务器相关技术及移植干货请关注Arm服务器专栏。如要加入Arm Server微信群,请添加极术小姐姐(微信id:aijishu20)备注Arm服务器邀请加入。