NUMA亲和调度
特性介绍
在现代高性能计算和大规模分布式系统中,非统一内存访问(NUMA)架构越来越普遍。NUMA架构通过将内存划分到不同的节点(NUMA节点),每个节点有其自己的局部内存和CPU,旨在减少内存访问延迟,提高系统性能。然而,NUMA架构的复杂性增加了系统资源管理的难度,特别是在多任务、多线程环境中。为了充分利用NUMA架构的优势,必须对系统资源进行精细化管理和监控。NUMA资源监控可视化旨在通过直观的图形界面,实时展示系统中NUMA资源的分配和使用情况,帮助用户更好地理解和管理NUMA资源,从而提升系统性能和资源利用率。在容器集群中,丰富多样的调度器提供了资源调度能力。本特性提供了调度器的统一管理能力,例如Volcano。
应用场景
用户在部署工作负载时,需要提供集群级的调度能力。或负载分配到节点上之后,想查看负载的分配情况,根据负载的分布情况,选用不同调优手段。
能力范围
- NUMA拓扑图:直观展示系统中各NUMA节点的拓扑结构,包括每个节点的CPU和内存分布。显示各节点之间的连接关系和访问延迟。
- 实时资源监控:实时显示各NUMA节点的CPU使用情况,包括使用率和空闲状态。实时显示各NUMA节点的内存使用情况,包括总内存、已用内存和空闲内存。
- 详细资源信息:显示每个NUMA节点的详细资源信息,如CPU列表、内存大小。支持查看每个容器在NUMA节点上的CPU和内存分配情况。
亮点特征
- 可视化NUMA拓扑:提供系统NUMA节点的拓扑可视化展示,清晰呈现各NUMA节点间的物理连接关系。
- 实时资源监控:秒级更新NUMA节点的CPU和内存使用情况,提供实时性能监控。
- 容器资源精细化管理:精确定位每个容器在NUMA节点上的资源分配情况。
- 多调度器兼容管理:支持Volcano等主流容器编排调度器,提供统一的NUMA资源管理接口。
使用限制
本特性与NPU Oprator都使用到了volcano,但是组件版本不同造成冲突,暂时无法同时使用。
实现原理
Kubernetes和采集器可感知底层拓扑,并可配置采用集群中的调度器进行资源调度。用户可在前台界面进行调度策略的配置,以及通过监控查看当前拓扑情况。逻辑视图如下图所示。
图 1 NUMA亲和调度实现原理
Kubernetes在引入拓扑管理器之前,Kubernetes中的CPU和设备管理器相互独立地做出资源分配决策。会导致CPU和设备是从不同的NUMA节点分配的,因此会导致额外的延迟。拓扑管理器为Kubernetes提供了一个名为Hint Provider的接口,以发送和接收拓扑信息,并根据策略得到最优解。
图 2 NUMA分配
Kubernetes支持CPU和Memory的NUMA亲和设置,需要设置CPU管理策略、拓扑管理策略。通过Topologymanager的hint算法,保证分配的CPU和内存在同一NUMA上。
拓扑管理器提供了两种不同的对齐配置:Scope和Policy。Scope定义了资源对齐粒度为Pod或container。Policy定义了对齐时实际使用的策略为best-effort、restricted、single-numa-node、none。
表 1 拓扑调度行为预期
Volcano拓扑策略 | 节点调度行为 | |
---|---|---|
1.筛选具有相同策略的节点 | 2.节点的CPU拓扑满足该策略的要求 | |
none | 无筛选行为:
| - |
best-effort | 筛选拓扑策略同样为“best-effort”的节点:
| 尽可能满足策略要求进行调度: 优先调度至单NUMA节点,如果单NUMA节点无法满足CPU申请值,允许调度至多个NUMA节点。 |
restricted | 筛选拓扑策略同样为“restricted”的节点:
| 严格限制的调度策略:
|
single-numa-node | 筛选拓扑策略同样为“single-numa-node”的节点:
| 仅允许调度至单NUMA节点。 |
Kubernetes调度器无法感知拓扑,没有在调度层面保证给Pod选择的节点有空闲的单NUMA,可能会导致Pod启动失败。Volcano为了解决这个问题,支持了NUMA调度,保证Kubelet在开启拓扑调策略时,调度到节点的Pod一定可以找到合适的NUMA。
Volcano NUMA亲和调度的流程如下图所示。
图 3 调度流程
在创建工作负载并将调度器设置为Volcano后,首先会检查配置的拓扑策略是否正确,再将拓扑策略加入到注解中。之后NUMA感知组件会判断即将调度的节点上的NUMA是否有空闲,最后调度器根据NUMA感知组件的结果及注解中的拓扑策略进行NUMA调度。在跨NUMA的调度上,调度器会根据调度原则:
score = weight × (100 - 100 × numaNodeNum / maxNumaNodeNum)
尽可能把Pod调度到需要跨NUMA节点最少的工作节点上。
图 4 volcano调度
Volcano的调度策略,是集群级的,各种调度策略可保证将负载调度到最优的节点上。但是节点上具体给工作负载分配哪个NUMA上的资源,是由节点上的Kubelet完成的,Volcano并未参与。所以,即使分配到了最优节点,却并不一定是最优NUMA。本方案在Volcano集群级调度的基础上,将容器分配到节点上之后,优化了节点内NUMA的分配。
与相关特性的关系
依赖资源管理模块提供CRD和CR查看的接口,依赖Prometheus提供监控能力。
相关实例
代码链接:openFuyao/volcano-config-service (gitcode.com)
安装
前提条件
- 已部署Kubernetes v1.21及以上。
- 已部署Prometheus。
- 已部署Containerd v1.7及以上。
开始安装
openFuyao平台
-
在openFuyao平台的左侧导航栏选择“应用市场 > 应用列表”,进入“应用列表”界面。
-
勾选左侧类型“扩展组件”,查看所有扩展组件。或在搜索框中输入“volcano”。
-
单击“volcano-config-service”卡片,进入调度扩展组件“详情”界面。
-
单击“部署”进入“部署”界面。
-
输入应用名称、选择安装版本和命名空间。
-
在参数配置的“Values.yaml”中输入要部署的values信息。
-
单击“部署”完成安装。
-
在左侧导航栏单击“扩展组件管理”,管理调度组件。
说明:
部署后会修改节点上的Kubelet配置项,此过程会重启Kubelet,现网环境谨慎使用。
独立部署
相比于应用市场安装部署,本组件提供了独立部署功能,步骤如下:
-
拉取镜像。
helm pull oci://harbor.openfuyao.com/openfuyao-catalog/charts/volcano-config-service --version xxx
将其中的xxx替换成需要拉取的helm镜像版本,例如:0.0.0-latest
-
解压安装包。
tar -zxvf volcano-config-service-xxx.tgz
-
关闭openFuyao及Oauth开关。
vim volcano-config-service/charts/volcano-config-website/values.yaml
将enableOAuth以及openFuyao选项改为false。
-
独立安装。
helm install volcano-config-service ./
-
对接prometheus。
-
访问独立前端。
可通过http://管理面的客户端登录IP地址:30881 访问独立前端。
查看概览页
在openFuyao平台界面的左侧导航栏“算力优化中心”中选择“NUMA亲和调度 > 概览”,进入“概览”界面。
概览界面展示了NUMA亲和调度的工作流。
图 5 概览
前提条件
已在应用市场部署“volcano-config-service”扩展组件。
背景信息
查看NUMA亲和调度的工作流,包括环境准备、亲和策略配置、工作负载部署、集群NUMA监控。
使用限制
无。
操作步骤
单击“NUMA亲和调度 > 概览”,进入“概览”界面。
- “环境准备”包含了节点级NUMA资源分配需要修改Kubernetes配置,以开启节点拓扑策略及最优Distance开关,单击
展示配置方法。
- “亲和策略配置”可单击说明后的“配置亲和策略”跳转至亲和策略配置页。
- “工作负载部署”是实际使用调度功能进行工作负载调度,单击“部署工作负载”可跳转至工作负载部署界面。
- “集群NUMA监控”展示了集群中的NUMA信息,单击“查看NUMA监控”可跳转至集群NUMA监控界面。
使用亲和策略配置
在openFuyao平台界面的左侧导航栏“算力优化中心”中选择“NUMA亲和调度 > 亲和策略配置”,进入“亲和策略配置”界面。
图 6 亲和策略配置
配置亲和策略
前提条件
登录用户具有“platform admin”或“cluster admin”角色。
背景信息
对已部署的调度扩展组件进行修改调度策略。
使用限制
需要已部署可支持配置调度策略的调度扩展组件。
操作步骤
-
在openFuyao平台界面的左侧导航栏“算力优化中心”中选择“NUMA亲和调度 > 亲和策略配置”,进入“亲和策略配置”界面。调度策略配置界面展示调度策略配置界面。
-
单击各个调度策略下的开关,开启/关闭此调度策略。单击调度策略后的
,可查看该策略的详细介绍。
使用集群NUMA监控
在openFuyao平台界面的左侧导航栏“算力优化中心”中选择“NUMA亲和调度 > 集群NUMA监控”,进入“集群NUMA监控”界面。
集群NUMA监控界面展示了集群中所有节点的“NUMA节点总数”、“CPU总数”、“内存总数”、“CPU分配率”、“内存分配率”、“拓扑策略”、“容器数”以及“跨NUMA容器数”。
图 7 集群NUMA监控
查看NUMA信息
前提条件
已在应用市场部署“volcano-config-service”扩展组件。
背景信息
查看具体NUMA的信息,包括CPU、内存资源,以了解节点的NUMA分配情况。
使用限制
仅支持有NUMA架构的节点,且通过numactl指令读取NUMA情况。
操作步骤
单击“节点名称”列的任意一个节点,进入节点“NUMA信息”界面。
- NUMA信息界面展示“NUMA节点总数”、“CPU总数”、“内存总数”、“CPU分配率”、“内存分配率”、“拓扑策略”以及“节点NUMA信息图”。
- 节点NUMA信息图中展示了每个NUMA节点的CPU号,其中红色代表CPU已被占用,绿色代表CPU未被占用。每个NUMA节点都有一块本地内存,浅绿色代表空闲,红色代表被占用。
- Distance表格所展示的内容表示NUMA节点间访问延迟,数据越大,则实际使用时延迟越高。
图 8 节点NUMA
查看容器NUMA分配信息
前提条件
已在应用市场部署“volcano-config-service”扩展组件。
背景信息
查看容器NUMA详细分配信息。
使用限制
仅支持有NUMA架构的节点。
操作步骤
-
单击“节点名称”列的任意一个节点。
-
单击“容器NUMA分配”页签。
- 该界面展示了概览数据,如“容器数量”、“跨NUMA容器数量”、“占据CPU”以及“占据内存总量”。
- 表格中展示了“容器名称”、“容器所在Pod”、“容器的CPU映射”、“是否跨NUMA”、“容器CPU所在NUMA”以及“拓扑”。并且支持按照“Pod名称”搜索查看。
- 单击“拓扑”列
可查看容器信息图。信息图的说明请参见信息图说明。
图 9 容器NUMA分配
查看亲和性优化Pod
前提条件
已在应用市场部署“volcano-config-service”扩展组件。
背景信息
查看亲和性优化Pod调度情况。
使用限制
仅支持有NUMA架构的ARM节点,操作系统为openEuler 22.03 LTS SP4,将未独占资源且具有网络亲缘关系的Pod调整至同一NUMA上。
操作步骤
-
单击“节点名称”列的任意一个节点。
-
单击“亲和性优化Pod”页签。
- 表格中展示了节点下每个NUMA中亲和Pod数目及网络亲和Pod名称。
图 10 亲和性优化Pod