【内存】Linux 内核优化实战 - kernel.numa_balancing
目录
- 一、NUMA 架构的背景
- 二、`kernel.numa_balancing` 的作用
- 三、参数取值与配置
- 配置方式:
- 四、何时需要开启/关闭?
- 建议开启的场景:
- 建议关闭的场景:
- 如何查看NUMA节点数
- 使用 lscpu 命令(最直接)
- 五、注意事项
- 总结
kernel.numa_balancing
是 Linux 内核中的一个重要参数,用于控制 NUMA(非统一内存访问)平衡机制 的开启与关闭。NUMA 是多处理器系统中常见的内存架构,其核心特点是:CPU 访问本地内存(同一 NUMA 节点)的速度远快于访问远程内存(其他 NUMA 节点)。numa_balancing
机制的作用是自动优化进程与内存的亲和性,减少远程内存访问,提升系统性能。
一、NUMA 架构的背景
在多 CPU 系统中,内存通常被划分为多个 NUMA 节点,每个节点关联一组 CPU 和本地内存:
- 当进程的内存数据存储在其运行的 CPU 所在的 NUMA 节点时,访问速度最快(本地访问)。
- 若内存数据存储在其他 NUMA 节点,访问速度会显著下降(远程访问,可能慢几倍甚至几十倍)。
如果进程频繁访问远程内存,会严重影响性能。numa_balancing
就是为解决这一问题而设计的自动优化机制。
二、kernel.numa_balancing
的作用
该参数控制内核是否自动执行 NUMA 平衡,具体行为包括:
- 检测内存访问位置:跟踪进程访问的内存页属于哪个 NUMA 节点。
- 迁移内存页:若进程频繁访问远程节点的内存页,内核会将这些内存页迁移到进程当前运行的 NUMA 节点(本地节点)。
- 调度进程亲和性:尽可能将进程调度到其内存页所在的 NUMA 节点的 CPU 上,减少远程访问。
简单来说,numa_balancing
是一种“自动优化内存与 CPU 绑定关系”的机制,无需人工干预。
三、参数取值与配置
kernel.numa_balancing
是一个布尔值参数,取值为:
- 0:关闭 NUMA 平衡机制(默认值,部分系统可能默认开启,需根据实际环境确认)。
- 1:开启 NUMA 平衡机制。
配置方式:
-
临时生效(重启后失效):
通过sysctl
命令实时修改:# 开启 NUMA 平衡 sysctl -w kernel.numa_balancing=1# 关闭 NUMA 平衡 sysctl -w kernel.numa_balancing=0
-
永久生效:
在/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)"
五、注意事项
- 性能开销:开启
numa_balancing
会增加内核的计算和内存迁移开销,在某些场景下(如内存页频繁迁移)可能抵消其带来的收益,需实际测试验证。 - 与其他工具的配合:若使用
numactl
、taskset
等工具手动设置进程的 NUMA 亲和性,建议关闭numa_balancing
,避免冲突。 - 监控效果:可通过
numastat
命令查看 NUMA 节点的内存访问统计(如numa_hit
本地访问、numa_miss
远程访问),评估numa_balancing
的优化效果:numastat # 查看各节点的内存访问情况
总结
kernel.numa_balancing
是 Linux 内核针对 NUMA 架构的自动优化开关,核心目标是减少远程内存访问。在多 NUMA 节点的系统中,若应用内存访问模式复杂且无手动优化,开启它通常能提升性能;反之,在单节点或手动优化场景下,关闭可能更合适。实际使用中需结合系统架构和应用特性,通过测试选择最佳配置。