一、引言
在现代云原生架构中,非统一内存访问(NUMA)架构已经成为高性能计算和大规模分布式系统的标准配置。NUMA架构通过将内存划分到不同的节点,每个节点拥有独立的局部内存和CPU资源,从而有效减少内存访问延迟,显著提升系统整体性能。然而,NUMA架构的复杂性也为容器集群的资源管理带来了前所未有的挑战。
传统的Kubernetes调度机制在面对NUMA架构时存在明显的局限性。由于CPU管理器和设备管理器相互独立地做出资源分配决策,往往导致CPU和设备被分配到不同的NUMA节点上,从而产生额外的跨节点访问延迟,严重影响应用性能。特别是在高性能计算、数据库、AI训练等对延迟敏感的场景中,这种跨NUMA访问可能导致性能下降30%甚至更多。
openFuyao NUMA亲和调度特性正是为解决这一痛点而设计的智能优化方案。该方案通过三层优化架构——集群级智能调度、节点内最优分配、运行时动态优化——实现了从调度决策到资源分配再到运行时优化的全生命周期管理。它不仅能够在调度阶段就为Pod选择最优的NUMA节点,还能在节点内进行精细化的NUMA资源分配,甚至在运行时动态调整Pod的NUMA亲和性,确保应用始终运行在最优的NUMA配置下。
openFuyao NUMA亲和调度的核心价值体现在三个方面:首先,通过可视化的NUMA拓扑展示和实时资源监控,让运维人员能够直观了解集群的NUMA资源使用情况;其次,通过智能的调度算法和评分机制,确保工作负载被调度到最合适的节点和NUMA上;最后,通过多调度器兼容管理和灵活的策略配置,满足不同业务场景的差异化需求。这些能力的结合,使得openFuyao能够充分发挥NUMA架构的性能优势,为企业构建真正高性能的容器集群提供坚实保障。
二、设计理念篇
2.1 传统Kubernetes的NUMA调度痛点
传统Kubernetes在NUMA资源管理方面存在三个核心痛点,这些问题严重制约了容器集群在NUMA架构上的性能表现。
跨 NUMA 资源分配问题是最为突出的痛点。在Kubernetes引入拓扑管理器之前,CPU管理器和设备管理器各自独立运作,缺乏统一的协调机制。这导致在为Pod分配资源时,CPU可能来自NUMA节点0,而内存却分配在NUMA节点1,设备资源又可能位于NUMA节点2。这种资源分散分配的模式完全违背了NUMA架构的设计初衷,使得应用在运行时需要频繁进行跨NUMA访问。
额外访问延迟影响是跨NUMA分配直接带来的性能损失。当CPU需要访问远程NUMA节点的内存时,访问延迟可能是本地访问的2-3倍甚至更高。对于内存密集型应用,这种延迟累积会导致显著的性能下降。例如,一个数据库应用如果其CPU和内存分布在不同NUMA节点,查询响应时间可能增加40%以上。更严重的是,这种性能损失往往难以被直接观察到,导致运维人员长期在次优配置下运行应用而不自知。
调度器感知盲区是最根本的架构性问题。Kubernetes原生调度器在做出调度决策时,无法感知节点的NUMA拓扑结构和资源分布情况。即使节点上启用了拓扑管理策略,调度器也只能基于节点整体的资源可用性进行判断,无法保证调度到节点后能够找到满足NUMA亲和要求的资源。这导致Pod可能被调度到一个看似资源充足的节点,但实际上由于NUMA资源碎片化,无法满足single-numa-node或restricted策略的要求,最终导致Pod启动失败。这种"调度成功但启动失败"的情况不仅浪费了调度资源,还影响了应用的可用性。
2.2 openFuyao三层优化架构
openFuyao通过精心设计的三层优化架构,系统性地解决了传统Kubernetes的NUMA调度问题,实现了从集群级到节点级再到运行时的全方位优化。
第一层:集群级智能调度
集群级智能调度是整个优化架构的基础层,主要通过增强Volcano调度器来实现NUMA感知的调度决策。
Volcano调度器增强是这一层的核心。openFuyao对Volcano进行了深度定制,使其能够在调度阶段就感知节点的NUMA拓扑信息。当创建工作负载并指定Volcano为调度器时,系统首先会检查配置的拓扑策略是否正确,然后将拓扑策略信息注入到Pod的注解中。NUMA感知组件会实时监控各节点的NUMA资源使用情况,判断即将调度的节点上是否有足够的空闲NUMA资源。
NUMA感知调度算法实现了精确的资源匹配。该算法会根据Pod的拓扑策略要求(none、best-effort、restricted、single-numa-node),筛选出符合条件的候选节点。对于best-effort策略,只筛选拓扑策略同样为best-effort的节点;对于restricted策略,严格限制只能调度到拓扑策略为restricted的节点;对于single-numa-node策略,则只考虑能够提供单NUMA资源的节点。这种精确匹配机制从源头上避免了调度成功但启动失败的问题。
智能评分机制确保了调度决策的最优性。在跨NUMA调度场景下,Volcano采用公式"score = weight × (100 - 100 × numaNodeNum / maxNumaNodeNum)"来计算节点得分,优先将Pod调度到需要跨越NUMA节点数量最少的工作节点上。这种评分机制不仅考虑了资源的可用性,还充分考虑了NUMA访问的性能影响,确保即使在必须跨NUMA的情况下,也能选择性能损失最小的方案。
第二层:节点内最优分配
节点内最优分配是openFuyao的创新突破点,它解决了Volcano集群级调度无法触及的节点内资源分配问题。
突破集群级调度限制是这一层的关键价值。虽然Volcano能够将Pod调度到最优节点,但节点上具体分配哪个NUMA的资源是由节点上的Kubelet完成的,Volcano并不参与这一过程。这意味着即使Pod被调度到了最优节点,也不一定能获得最优的NUMA资源分配。openFuyao通过在节点层面增强Kubelet的拓扑管理能力,实现了节点内NUMA资源的最优分配。
NUMA Distance最优计算是实现节点内最优分配的核心算法。系统会计算Pod所需资源与各NUMA节点之间的访问距离(Distance),这个距离值反映了跨NUMA访问的延迟成本。通过选择Distance值最小的NUMA节点组合,确保Pod的CPU、内存等资源尽可能分配在访问延迟最低的NUMA节点上。例如,如果单个NUMA节点无法满足资源需求,系统会优先选择Distance值较小的相邻NUMA节点组合,而不是随机选择。
多种拓扑策略支持体现了系统的灵活性。openFuyao支持none、best-effort、restricted、single-numa-node四种拓扑策略,每种策略都有明确的行为定义。none策略不做任何限制,适合对延迟不敏感的应用;best-effort策略尽可能满足单NUMA分配,但允许跨NUMA,适合大多数应用场景;restricted策略在单NUMA容量允许的情况下强制单NUMA分配,适合对性能有较高要求的应用;single-numa-node策略严格要求单NUMA分配,适合对延迟极度敏感的高性能应用。
第三层:运行时动态优化
运行时动态优化是openFuyao的高级特性,它实现了Pod在运行过程中的NUMA亲和性热调整。
NUMA-FAST技术应用是这一层的技术基础。NUMA-FAST(NUMA-aware Fast Affinity Scheduling Technology)是一种先进的NUMA亲和性优化技术,能够在不中断应用运行的情况下,动态调整Pod的NUMA亲和性配置。该技术通过监控Pod之间的网络通信模式和资源访问行为,识别出具有亲缘关系的Pod,并将它们迁移到同一NUMA节点上,从而减少跨NUMA通信开销。
NRI插件动态调整提供了运行时优化的实现机制。Node Resource Interface(NRI)是容器运行时的扩展接口,允许外部插件在容器生命周期的关键节点进行干预。openFuyao通过NRI插件,能够在容器运行时动态修改其NUMA亲和性配置,包括CPU绑定、内存分配等。这种动态调整能力使得系统能够根据实际运行情况持续优化NUMA配置,而不是仅在创建时做一次性决策。
Pod亲和性热迁移是运行时优化的最终体现。系统会持续监控Pod的运行状态和资源使用情况,当检测到未独占资源且具有网络亲缘关系的Pod分布在不同NUMA节点时,会触发热迁移机制,将这些Pod调整到同一NUMA节点上。这种优化对于微服务架构特别有价值,因为微服务之间往往存在频繁的网络通信,将通信密集的服务放在同一NUMA节点能够显著降低通信延迟,提升整体性能。
2.3 核心技术亮点
openFuyao NUMA亲和调度的核心技术亮点体现在三个方面,这些特性共同构成了一个完整、易用、高效的NUMA资源管理解决方案。
可视化NUMA拓扑是系统的重要特色。传统的NUMA管理工具往往只能通过命令行查看拓扑信息,缺乏直观性。openFuyao提供了图形化的NUMA拓扑展示界面,能够清晰呈现系统中各NUMA节点的物理连接关系、CPU分布、内存配置等信息。每个NUMA节点的CPU使用情况通过颜色编码直观展示,红色表示已占用,绿色表示空闲。内存使用情况也通过可视化图表展示,让运维人员一目了然。Distance表格展示了NUMA节点间的访问延迟,数值越大表示延迟越高,帮助用户理解跨NUMA访问的性能影响。这种可视化能力大大降低了NUMA管理的复杂度,使得即使是不熟悉NUMA架构的运维人员也能快速掌握集群的资源状况。
实时资源监控提供了秒级的资源使用情况更新。系统通过集成Prometheus监控体系,实时采集各NUMA节点的CPU使用率、内存使用量、容器分布等关键指标。监控数据不仅包括节点级别的汇总信息,还深入到容器级别,展示每个容器在NUMA节点上的具体资源分配情况。用户可以查看容器的CPU映射关系,了解容器是否跨NUMA运行,以及容器CPU所在的具体NUMA节点。这种精细化的监控能力使得性能问题能够被快速定位和解决。例如,当发现某个应用性能下降时,可以立即检查其NUMA分配情况,判断是否存在跨NUMA访问问题。
多调度器兼容管理体现了系统的开放性和灵活性。openFuyao不仅支持Volcano调度器,还提供了统一的调度器管理接口,能够兼容其他主流容器编排调度器。用户可以在管理界面中配置和管理多个调度器,为不同的工作负载选择最合适的调度策略。系统提供了调度策略的可视化配置界面,用户可以通过简单的开关操作启用或禁用特定的调度策略,无需手动编辑复杂的配置文件。每个调度策略都配有详细的说明文档,帮助用户理解策略的适用场景和行为特征。这种统一管理能力使得企业可以在同一集群中灵活运用不同的调度策略,满足多样化的业务需求。
三、实操指南篇
3.1 环境准备
| 操作系统 | 版本 | 架构 |
|---|---|---|
| openEuler | 20.03 | ARM64、x86_64 |
| openEuler | 22.03 | ARM64、x86_64 |
| openEuler | 24.03 | ARM64、x86_64 |
| Ubuntu | 22.04 | ARM64、x86_64 |
3.2 openFuyao集群部署
openFuyao集群的部署过程简洁高效,主要包括以下步骤。
下载安装包:通过一键安装命令进行安装
curl -sfL https://openfuyao.obs.cn-north-4.myhuaweicloud.com/openFuyao/bkeadm/releases/download/v25.09/download.sh | bash
初始化引导节点:
bke init --otherRepo cr.openfuyao.cn/openfuyao/bke-online-installed:v25.09
等待一段时间后,自动化安装成功
自动化安装完成后,通过执行以下命令,查看机器上所有Pod状态是否在运行
kubectl get pod -A
系统已成功启动,可以开始使用了
初始化完成后,可以通过浏览器访问openFuyao的管理界面。浏览器中输入“https://管理面的登录IP地址:30205”进入到集群安装界面安装集群
3.3 NUMA亲和组件部署
NUMA亲和组件的部署推荐使用应用市场方式,这是最简单快捷的部署方法。
应用市场部署方式:
-
登录openFuyao管理界面,在左侧导航栏选择"应用市场 > 应用列表"
-
在应用类型中勾选"扩展组件",或直接搜索"volcano"
-
点击"volcano-config-service"卡片,进入详情页面
-
点击"部署"按钮,填写应用名称,选择安装版本和目标命名空间
-
在Values.yaml配置中,可以根据需要调整参数,通常使用默认配置即可
-
点击"部署"完成安装
组件状态验证:
部署完成后,在"扩展组件管理"页面可以查看组件状态。正常情况下,所有组件的状态应显示为"Running"。可以通过以下命令进一步验证:
kubectl get pods -n volcano-system
kubectl get crd | grep volcano
需要注意的是,部署过程会修改节点上的Kubelet配置项以启用NUMA感知功能,此过程会触发Kubelet重启。在生产环境中应谨慎操作,建议在业务低峰期进行部署。
3.4 NUMA亲和策略配置
NUMA亲和策略的配置分为节点级和集群级两个层面。
节点拓扑策略配置需要修改每个节点的Kubelet配置。编辑/var/lib/kubelet/config.yaml文件,添加或修改以下配置:
cpuManagerPolicy: static
topologyManagerPolicy: single-numa-node
topologyManagerScope: pod
其中,cpuManagerPolicy设置为static启用CPU管理器,topologyManagerPolicy定义拓扑策略,topologyManagerScope设置资源对齐粒度。配置完成后重启Kubelet使配置生效:
systemctl restart kubelet
管理面调度策略设置:
-
在openFuyao管理界面,导航至"算力优化中心 > NUMA亲和调度 > 亲和策略配置"
-
界面展示了四种调度策略的开关:none、best-effort、restricted、single-numa-node
-
根据业务需求,点击对应策略的开关进行启用或禁用
-
点击策略后的帮助图标,可以查看该策略的详细说明和适用场景
策略说明查看:
-
none策略:不做任何NUMA限制,适合对延迟不敏感的应用
-
best-effort策略:尽可能分配单NUMA资源,但允许跨NUMA,适合大多数场景
-
restricted策略:在单NUMA容量允许时强制单NUMA分配,适合性能敏感应用
-
single-numa-node策略:严格要求单NUMA分配,适合极高性能要求的应用
3.5 工作负载部署实战
以Nginx为例,演示如何部署启用NUMA亲和的工作负载。
Nginx NUMA亲和示例:
创建一个YAML配置文件nginx-numa.yaml:
apiVersion: v1
kind: Pod
metadata:
name: nginx-numa-test
annotations:
volcano.sh/numa-topology-policy: "single-numa-node"
spec:
schedulerName: volcano
containers:
- name: nginx
image: nginx:latest
resources:
limits:
cpu: "4"
memory: "4Gi"
requests:
cpu: "4"
memory: "4Gi"
YAML配置详解:
-
schedulerName: volcano:指定使用Volcano调度器进行NUMA感知调度 -
volcano.sh/numa-topology-policy:注解指定拓扑策略为single-numa-node -
resources:必须设置CPU和内存的limits和requests,且两者相等,这是启用NUMA亲和的前提
部署验证方法:
执行部署命令:
kubectl apply -f nginx-numa.yaml
验证Pod状态和NUMA分配:
kubectl get pod nginx-numa-test -o wide
kubectl describe pod nginx-numa-test
在openFuyao管理界面的"集群NUMA监控"页面,找到Pod所在节点,点击进入节点详情,在"容器NUMA分配"页签中可以查看该容器的具体NUMA分配情况,包括CPU映射、是否跨NUMA等信息。
3.6 NUMA资源监控
NUMA资源监控是运维管理的重要环节,openFuyao提供了多层次的监控能力。
集群NUMA概览查看:
在"算力优化中心 > NUMA亲和调度 > 集群NUMA监控"页面,可以查看整个集群的NUMA资源使用情况。页面展示了每个节点的NUMA节点总数、CPU总数、内存总数、CPU分配率、内存分配率、拓扑策略、容器数以及跨NUMA容器数。通过这些指标,可以快速了解集群的NUMA资源利用情况和潜在的性能问题。
节点详细信息查看:
点击任意节点名称,进入节点的NUMA详情页面。该页面提供了更细粒度的信息:
-
NUMA拓扑图:可视化展示各NUMA节点的CPU和内存分布,红色表示已占用,绿色表示空闲
-
Distance表格:展示NUMA节点间的访问延迟,帮助理解跨NUMA访问的性能影响
-
容器NUMA分配:列出节点上所有容器的NUMA分配详情,包括CPU映射、跨NUMA情况等
Prometheus监控配置:
openFuyao支持两种方式配置Prometheus监控。
Operator方式(推荐):
kubectl apply -f prometheus-operator.yaml
kubectl apply -f servicemonitor.yaml
直接配置方式:
编辑Prometheus配置文件,添加以下scrape配置:
scrape_configs:
- job_name: 'numa-exporter'
kubernetes_sd_configs:
- role: pod
relabel_configs:
- source_labels: [__meta_kubernetes_pod_label_app]
regex: numa-exporter
action: keep
监控数据验证:
配置完成后,可以在Prometheus界面中查询NUMA相关指标:
numa_node_cpu_usage
numa_node_memory_usage
numa_container_allocation
这些指标可以用于构建监控仪表板,实时追踪NUMA资源的使用趋势,及时发现和解决性能问题。
四、总结
openFuyao NUMA亲和调度通过三层优化架构,系统性地解决了容器集群在NUMA架构上的性能挑战。集群级智能调度确保Pod被调度到最优节点,节点内最优分配保证资源在NUMA上的最佳配置,运行时动态优化实现持续的性能提升。
可视化NUMA拓扑、实时资源监控、多调度器兼容管理等核心特性,使得NUMA资源管理变得简单直观。无论是高性能计算、数据库还是AI训练等场景,openFuyao都能提供卓越的性能优化能力。
通过本文的详细介绍,从设计理念到实操部署,用户可以全面掌握openFuyao NUMA亲和调度的使用方法,充分发挥NUMA架构的性能优势,构建真正高性能的容器集群。随着云原生技术的不断发展,NUMA感知调度将成为企业级容器平台的标准配置,openFuyao正引领这一技术趋势,为用户创造更大的业务价值。