Skip to main content
Version: v25.03

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分配

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

无筛选行为:

  • none:可调度
  • best-effort:可调度
  • restricted:可调度
  • single-numa-node:可调度
-
best-effort

筛选拓扑策略同样为“best-effort”的节点:

  • none:不可调度
  • best-effort:可调度
  • restricted:不可调度
  • single-numa-node:不可调度
尽可能满足策略要求进行调度:
优先调度至单NUMA节点,如果单NUMA节点无法满足CPU申请值,允许调度至多个NUMA节点。
restricted

筛选拓扑策略同样为“restricted”的节点:

  • none:不可调度
  • best-effort:不可调度
  • restricted:可调度
  • single-numa-node:不可调度

严格限制的调度策略:

  • 单NUMA节点的CPU容量上限大于等于CPU的申请值时,仅允许调度至单NUMA节点。此时如果单NUMA节点剩余的CPU可使用量不足,则Pod无法调度。
  • 单NUMA节点的CPU容量上限小于CPU的申请值时,可允许调度至多个NUMA节点。
single-numa-node

筛选拓扑策略同样为“single-numa-node”的节点:

  • none:不可调度
  • best-effort:不可调度
  • restricted:不可调度
  • 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调度

Volcano的调度策略,是集群级的,各种调度策略可保证将负载调度到最优的节点上。但是节点上具体给工作负载分配哪个NUMA上的资源,是由节点上的Kubelet完成的,Volcano并未参与。所以,即使分配到了最优节点,却并不一定是最优NUMA。本方案在Volcano集群级调度的基础上,将容器分配到节点上之后,优化了节点内NUMA的分配。

与相关特性的关系

依赖资源管理模块提供CRD和CR查看的接口,依赖Prometheus提供监控能力。

相关实例

代码链接:openFuyao/volcano-config-service (gitcode.com)

安装

前提条件

  • 已部署Kubernetes v1.21及以上。
  • 已部署Prometheus。
  • 已部署Containerd v1.7及以上。

开始安装

openFuyao平台

  1. 在openFuyao平台的左侧导航栏选择“应用市场 > 应用列表”,进入“应用列表”界面。

  2. 勾选左侧类型“扩展组件”,查看所有扩展组件。或在搜索框中输入“volcano”。

  3. 单击“volcano-config-service”卡片,进入调度扩展组件“详情”界面。

  4. 单击“部署”进入“部署”界面。

  5. 输入应用名称、选择安装版本和命名空间。

  6. 在参数配置的“Values.yaml”中输入要部署的values信息。

  7. 单击“部署”完成安装。

  8. 在左侧导航栏单击“扩展组件管理”,管理调度组件。

    说明:
    部署后会修改节点上的Kubelet配置项,此过程会重启Kubelet,现网环境谨慎使用。

独立部署

相比于应用市场安装部署,本组件提供了独立部署功能,步骤如下:

  1. 拉取镜像。

    helm pull oci://harbor.openfuyao.com/openfuyao-catalog/charts/volcano-config-service --version xxx

    将其中的xxx替换成需要拉取的helm镜像版本,例如:0.0.0-latest

  2. 解压安装包。

    tar -zxvf volcano-config-service-xxx.tgz
  3. 关闭openFuyao及Oauth开关。

    vim volcano-config-service/charts/volcano-config-website/values.yaml

    将enableOAuth以及openFuyao选项改为false。

  4. 独立安装。

    helm install volcano-config-service ./
  5. 对接prometheus。

    参考NUMA亲和调度开发指南任务场景2任务场景3

  6. 访问独立前端。

    可通过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”角色。

背景信息

对已部署的调度扩展组件进行修改调度策略。

使用限制

需要已部署可支持配置调度策略的调度扩展组件。

操作步骤

  1. 在openFuyao平台界面的左侧导航栏“算力优化中心”中选择“NUMA亲和调度 > 亲和策略配置”,进入“亲和策略配置”界面。调度策略配置界面展示调度策略配置界面。

  2. 单击各个调度策略下的开关,开启/关闭此调度策略。单击调度策略后的帮助,可查看该策略的详细介绍。

使用集群NUMA监控

在openFuyao平台界面的左侧导航栏“算力优化中心”中选择“NUMA亲和调度 > 集群NUMA监控”,进入“集群NUMA监控”界面。

集群NUMA监控界面展示了集群中所有节点的“NUMA节点总数”、“CPU总数”、“内存总数”、“CPU分配率”、“内存分配率”、“拓扑策略”、“容器数”以及“跨NUMA容器数”。

图 7 集群NUMA监控

集群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

查看容器NUMA分配信息

前提条件

已在应用市场部署“volcano-config-service”扩展组件。

背景信息

查看容器NUMA详细分配信息。

使用限制

仅支持有NUMA架构的节点。

操作步骤

  1. 单击“节点名称”列的任意一个节点。

  2. 单击“容器NUMA分配”页签。

    • 该界面展示了概览数据,如“容器数量”、“跨NUMA容器数量”、“占据CPU”以及“占据内存总量”。
    • 表格中展示了“容器名称”、“容器所在Pod”、“容器的CPU映射”、“是否跨NUMA”、“容器CPU所在NUMA”以及“拓扑”。并且支持按照“Pod名称”搜索查看。
    • 单击“拓扑”列容器NUMA分配可查看容器信息图。信息图的说明请参见信息图说明

    图 9 容器NUMA分配

    亲和性优化pod

查看亲和性优化Pod

前提条件

已在应用市场部署“volcano-config-service”扩展组件。

背景信息

查看亲和性优化Pod调度情况。

使用限制

仅支持有NUMA架构的ARM节点,操作系统为openEuler 22.03 LTS SP4,将未独占资源且具有网络亲缘关系的Pod调整至同一NUMA上。

操作步骤

  1. 单击“节点名称”列的任意一个节点。

  2. 单击“亲和性优化Pod”页签。

    • 表格中展示了节点下每个NUMA中亲和Pod数目及网络亲和Pod名称。

    图 10 亲和性优化Pod

    亲和性优化pod