【Linux】NUMA如何梆核

在 NUMA(非统一内存访问)架构中,"绑核" 通常是指将特定的 CPU 核心(或者 NUMA 节点)与特定的内存区域绑定,以提高内存访问的局部性,减少跨节点的内存访问延迟。这个操作通常用于性能优化,尤其是在大规模多核系统中,确保每个处理器尽可能地访问本地内存而不是远程内存。

NUMA 绑核的实现

在 Linux 系统中,NUMA 绑定可以通过以下几种方式实现:

1. 使用 numactrl 命令

numactrl 是一种常见的 NUMA 控制工具,允许用户指定任务的内存分配和 CPU 亲和性。

  • 查看当前系统的 NUMA 配置:

    bash 复制代码
    numactrl --hardware
  • 将进程绑定到指定的 NUMA 节点:

    bash 复制代码
    numactrl --cpunodebind=0 --membind=0 <command>

    这个命令将进程 <command> 绑定到 NUMA 节点 0 上,同时内存分配也从 NUMA 节点 0 获取。

2. 使用 taskset 命令

taskset 用于设置 CPU 亲和性,可以将进程绑定到特定的 CPU 核心。

  • 例如,绑定进程到指定 CPU 核心:

    bash 复制代码
    taskset -c 0-3 <command>

    这将进程绑定到 CPU 0 到 3 核心。

但是,taskset 只能绑定 CPU 核心,而无法直接控制 NUMA 节点的内存分配。如果需要将进程绑定到特定 NUMA 节点上的内存,可以结合使用 numactrl 或直接使用内核提供的 API。

3. 使用 numactrl + taskset 结合

如果想要更加精细地控制 CPU 核心和 NUMA 节点的绑定,可以将 tasksetnumactrl 结合起来使用。

例如,假设你有 2 个 NUMA 节点,每个节点有 4 个 CPU 核心,且你想将进程绑定到 NUMA 节点 0 上的 2 个 CPU 核心,可以这样操作:

bash 复制代码
taskset -c 0,1 numactrl --cpunodebind=0 --membind=0 <command>

这将进程绑定到 NUMA 节点 0 上的 CPU 0 和 CPU 1,并且该进程的内存也来自于 NUMA 节点 0。

4. 使用 numactrl 调整内存策略

你还可以使用 numactrl 设置内存访问策略,比如使用 "prefer" 选项来偏向访问某个 NUMA 节点的内存:

bash 复制代码
numactrl --preferred=0 <command>

这会让系统偏向从 NUMA 节点 0 分配内存,但仍然允许从其他节点分配内存。

5. 通过 /sys 文件系统

你可以直接在 /sys 文件系统中设置 NUMA 绑定。下面是如何通过 taskset/sys 控制 NUMA 绑定的示例:

  • 绑定当前进程到 NUMA 节点 0:

    bash 复制代码
    echo 0 > /proc/self/cpuset
  • 查看当前 CPU 核心的 NUMA 节点:

    bash 复制代码
    cat /sys/devices/system/cpu/cpu0/topology/physical_package_id
6. 在代码中设置 NUMA 亲和性

如果你是在编写程序并希望在代码中控制 NUMA 绑定,可以使用 numactrl 的 API,或者更底层的 numa_set_affinity 等函数。

例如,使用 numactrl 库:

c 复制代码
#include <numa.h>

numa_set_affinity(0);  // 绑定到 NUMA 节点 0

常见问题和注意事项

  • CPU 与内存的亲和性: NUMA 绑定时,尽量确保 CPU 核心与其本地内存绑定,这样可以减少访问远程内存的延迟。
  • 负载均衡: 在多 NUMA 节点的系统上,要小心负载均衡问题。如果所有任务都集中在一个节点上,可能会导致性能瓶颈。合理分配任务到多个节点是提升性能的关键。
  • 硬件和系统支持: 并非所有硬件和操作系统都支持 NUMA 绑定,特别是在虚拟化环境中。要确保系统支持 NUMA 并能够有效地进行节点分配。

通过合理的 NUMA 绑定,可以有效减少远程内存访问的延迟,提高应用程序在多核 NUMA 系统中的性能。


梆核的意义是什么

NUMA(非统一内存访问)架构是现代多核系统的一种设计,它的核心思想是将多个处理器(CPU)和内存分布在不同的物理节点上。每个 NUMA 节点拥有自己的本地内存,而系统中的多个节点通过高速互联连接。在 NUMA 架构中,不同节点的内存访问速度不同,访问本地内存的速度比访问远程节点的内存要快得多。

在 NUMA 架构中,"绑核"(或称为"CPU 与内存亲和性绑定")的意义在于优化性能,确保每个处理器尽可能地访问它本地的内存,而避免跨节点的内存访问延迟。

为什么要进行 NUMA 绑核?

1. 减少跨节点内存访问延迟

在 NUMA 系统中,每个 NUMA 节点的处理器访问自己本地的内存(本地内存)速度要快,而访问其他节点的内存(远程内存)会产生更高的延迟和带宽瓶颈。这是因为远程内存需要通过系统的互联网络进行通信。

  • 本地内存访问:每个 CPU 核心直接访问本地内存的速度快,延迟低。
  • 远程内存访问:如果一个 CPU 核心访问另一 NUMA 节点的内存,会发生跨节点访问,导致延迟增加,带宽有限,可能影响性能。

通过进行 NUMA 绑核(将 CPU 核心和内存绑定到同一 NUMA 节点),可以最大化减少跨节点的内存访问,确保内存访问的局部性,从而提高应用程序的性能。

2. 提高缓存局部性

现代处理器通常具有高速缓存(L1、L2、L3 缓存)。当处理器访问本地内存时,相关数据更容易保持在缓存中,这种缓存局部性(locality of reference)能显著提升计算效率。

  • 缓存命中率:如果 CPU 核心和内存绑定到同一个 NUMA 节点,它访问的数据更容易被保存在本地缓存中,减少了跨 NUMA 节点的缓存失效。
  • 缓存一致性:当跨 NUMA 节点进行内存访问时,可能会引发缓存一致性问题,降低系统性能。
3. 降低内存带宽竞争

在一个多 NUMA 节点系统中,如果多个 CPU 核心频繁地访问不同 NUMA 节点的内存,可能导致内存带宽的争用,从而影响性能。通过合理地绑定 CPU 核心到某个特定的 NUMA 节点,内存访问会集中在本地内存,降低带宽争用,提高带宽效率。

4. 优化多线程性能

对于多线程应用来说,线程的 NUMA 亲和性非常重要。如果线程频繁地访问不同 NUMA 节点的内存,可能导致远程内存访问延迟,从而影响多线程的性能。因此,在 NUMA 系统中绑定线程到特定 NUMA 节点上,有助于减少远程访问,提高线程之间的协调性和性能。

5. 避免内存不平衡

如果不进行 NUMA 绑核,操作系统可能会根据负载和资源可用性动态地调度任务到不同的 CPU 核心和 NUMA 节点上。这种调度方式可能导致内存访问不平衡,导致一些 NUMA 节点的内存被过度使用,而其他节点的内存空闲。

通过手动绑定内存和 CPU,可以更精细地控制内存和计算资源的分配,避免内存分布不均,提升系统整体性能。

6. 高效使用硬件资源

NUMA 绑核能够确保 CPU 核心和内存高效地协同工作。尤其在高性能计算(HPC)和数据库等高负载场景中,NUMA 绑核可以显著减少性能瓶颈,提高系统的并行计算能力。

  • 数据库优化:例如,达梦数据库、MySQL、PostgreSQL 等数据库系统,在 NUMA 架构下,通过优化数据库进程的 NUMA 亲和性,可以显著提高数据库的吞吐量和响应速度。
  • 高性能计算(HPC):在一些需要大量内存带宽的计算场景中,如科学计算、数据分析等,NUMA 绑核可以通过减少内存访问延迟,提升性能。

NUMA 绑核的实现方式

在 Linux 系统中,常见的 NUMA 绑核方法有:

  • numactrl :通过命令行工具 numactrl 设置进程的 CPU 亲和性和内存分配策略。
  • taskset :使用 taskset 将进程绑定到特定的 CPU 核心,结合 numactrl 设置内存节点。
  • 内核参数和 /sys 文件系统 :直接通过 /sys 系统文件和内核参数进行 NUMA 设置。
  • 应用层代码调整:对于特定应用程序,可以通过修改源代码或者使用库来控制 NUMA 绑定。

总结

NUMA 绑核的主要目的是为了优化内存访问性能、减少跨节点的延迟、提高内存和 CPU 的利用率,从而提升整体系统性能。通过合理的绑定策略,能够确保每个 CPU 核心和内存节点之间的亲和性最大化,减少远程内存访问,优化数据的局部性,降低带宽竞争和内存访问延迟。尤其在大规模的多核系统中,合理的 NUMA 绑核可以显著提高高负载应用和多线程程序的性能。

相关推荐
是十一月末12 分钟前
Linux的基本功能和命令
linux·服务器·开发语言·数据库
聚名网14 分钟前
什么叫中间件服务器?
运维·服务器·中间件
暮已深26 分钟前
【RTAB-Map+VINS-Fusion+euroc】(Ubuntu 20.04)三维稠密重建-实践笔记
linux·笔记·ubuntu
浮尘笔记29 分钟前
在Ubuntu服务器上备份文件到自己的百度网盘
linux·服务器·ubuntu
( •̀∀•́ )9201 小时前
深入理解 XPath:XML 和 HTML 文档的利器
xml·服务器·html
Hacker_xingchen1 小时前
影响 Linux、Unix 系统的 CUPS 漏洞可导致 RCE
linux·运维·unix
难以触及的高度1 小时前
Unix/Linux 命令行重定向操作
linux·服务器·unix
neeef_se1 小时前
【Linux】WG-Easy:基于 Docker 和 Web 面板的异地组网
linux·前端·docker
都适、隶仁ミ1 小时前
【密码学】SM4算法
linux·运维·服务器·算法·网络安全·密码学·网络攻击模型
君逸~~2 小时前
RK3568(二)——字符设备驱动开发
linux·驱动开发·笔记·学习·rk3568