【内存】Linux 内核优化实战 - kernel.numa_balancing

发布于:2025-07-06 ⋅ 阅读:(16) ⋅ 点赞:(0)

kernel.numa_balancing 是 Linux 内核中的一个重要参数,用于控制 NUMA(非统一内存访问)平衡机制 的开启与关闭。NUMA 是多处理器系统中常见的内存架构,其核心特点是:CPU 访问本地内存(同一 NUMA 节点)的速度远快于访问远程内存(其他 NUMA 节点)。numa_balancing 机制的作用是自动优化进程与内存的亲和性,减少远程内存访问,提升系统性能。

一、NUMA 架构的背景

在多 CPU 系统中,内存通常被划分为多个 NUMA 节点,每个节点关联一组 CPU 和本地内存:

  • 当进程的内存数据存储在其运行的 CPU 所在的 NUMA 节点时,访问速度最快(本地访问)。
  • 若内存数据存储在其他 NUMA 节点,访问速度会显著下降(远程访问,可能慢几倍甚至几十倍)。

如果进程频繁访问远程内存,会严重影响性能。numa_balancing 就是为解决这一问题而设计的自动优化机制。

二、kernel.numa_balancing 的作用

该参数控制内核是否自动执行 NUMA 平衡,具体行为包括:

  1. 检测内存访问位置:跟踪进程访问的内存页属于哪个 NUMA 节点。
  2. 迁移内存页:若进程频繁访问远程节点的内存页,内核会将这些内存页迁移到进程当前运行的 NUMA 节点(本地节点)。
  3. 调度进程亲和性:尽可能将进程调度到其内存页所在的 NUMA 节点的 CPU 上,减少远程访问。

简单来说,numa_balancing 是一种“自动优化内存与 CPU 绑定关系”的机制,无需人工干预。

三、参数取值与配置

kernel.numa_balancing 是一个布尔值参数,取值为:

  • 0:关闭 NUMA 平衡机制(默认值,部分系统可能默认开启,需根据实际环境确认)。
  • 1:开启 NUMA 平衡机制。
配置方式:
  1. 临时生效(重启后失效):
    通过 sysctl 命令实时修改:

    # 开启 NUMA 平衡
    sysctl -w kernel.numa_balancing=1
    
    # 关闭 NUMA 平衡
    sysctl -w kernel.numa_balancing=0
    
  2. 永久生效
    /etc/sysctl.conf/etc/sysctl.d/ 目录下的配置文件中添加:

    kernel.numa_balancing = 1  # 开启
    

    保存后执行 sysctl -p 生效。

四、何时需要开启/关闭?

建议开启的场景:
  • 多 NUMA 节点的服务器(如 2 个以上 NUMA 节点的物理机或虚拟机)。
  • 进程内存访问模式动态变化:例如进程可能在不同 NUMA 节点的 CPU 上调度,或内存页分布分散。
  • 性能敏感型应用:如数据库、虚拟化平台(KVM)、高性能计算(HPC)等,减少远程内存访问能显著提升性能。
建议关闭的场景:
  • 单 NUMA 节点系统(如普通笔记本、单 CPU 服务器):此时无“远程内存”概念,开启会增加额外开销。
  • 手动优化 NUMA 亲和性:若已通过工具(如 numactl)手动绑定进程到特定 NUMA 节点和内存,numa_balancing 可能干扰手动配置,导致性能下降。
  • 低延迟要求极高的场景numa_balancing 的检测和迁移操作会带来少量开销(如页面迁移时的短暂阻塞),对微秒级延迟敏感的应用可能不适用。

如何查看NUMA节点数

使用 lscpu 命令(最直接)
lscpu | grep "NUMA node(s)"

在这里插入图片描述

五、注意事项

  1. 性能开销:开启 numa_balancing 会增加内核的计算和内存迁移开销,在某些场景下(如内存页频繁迁移)可能抵消其带来的收益,需实际测试验证。
  2. 与其他工具的配合:若使用 numactltaskset 等工具手动设置进程的 NUMA 亲和性,建议关闭 numa_balancing,避免冲突。
  3. 监控效果:可通过 numastat 命令查看 NUMA 节点的内存访问统计(如 numa_hit 本地访问、numa_miss 远程访问),评估 numa_balancing 的优化效果:
    numastat  # 查看各节点的内存访问情况
    

总结

kernel.numa_balancing 是 Linux 内核针对 NUMA 架构的自动优化开关,核心目标是减少远程内存访问。在多 NUMA 节点的系统中,若应用内存访问模式复杂且无手动优化,开启它通常能提升性能;反之,在单节点或手动优化场景下,关闭可能更合适。实际使用中需结合系统架构和应用特性,通过测试选择最佳配置。