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

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 节点的系统中,若应用内存访问模式复杂且无手动优化,开启它通常能提升性能;反之,在单节点或手动优化场景下,关闭可能更合适。实际使用中需结合系统架构和应用特性,通过测试选择最佳配置。

### 修改 Linux 系统中与 `numti` 相关的配置或参数 在 Linux 系统中,如果需要更改与 `numti`(假设为拼写错误,实际可能为 `numa` 或其他相关参数)相关的设置或参数,可以通过以下几种方式实现。以下是具体方法注意事项: #### 1. 使用 `/proc/sys` 文件系统 Linux 内核提供了 `/proc/sys` 文件系统来动态调整内核参数。对于与 NUMA(Non-Uniform Memory Access,非一致性内存访问)相关的参数,可以使用以下命令进行修改: ```bash echo 1 > /proc/sys/kernel/numa_balancing ``` 上述命令将启用 NUMA 平衡功能[^1]。需要注意的是,直接修改 `/proc/sys` 下的文件仅对当前会话有效,重启后设置将丢失。 #### 2. 使用 `sysctl` 命令 `sysctl` 是一个常用的工具,用于查看修改内核参数。例如,要启用 NUMA 平衡功能,可以运行以下命令: ```bash sysctl -w kernel.numa_balancing=1 ``` 若希望永久生效,可以将相应的设置添加到 `/etc/sysctl.conf` 文件中,例如: ```bash kernel.numa_balancing = 1 ``` 保存后执行 `sysctl -p` 命令以应用更改[^2]。 #### 3. 修改引导参数 如果某些 NUMA 参数需要在系统启动时生效,可以在 GRUB 引导加载程序中添加内核参数。编辑 `/etc/default/grub` 文件,找到 `GRUB_CMDLINE_LINUX_DEFAULT` 行,并添加所需的参数。例如: ```bash GRUB_CMDLINE_LINUX_DEFAULT="quiet splash numa_balancing=1" ``` 保存文件后运行以下命令更新 GRUB 配置并重启系统: ```bash update-grub reboot ``` #### 4. 检查 NUMA 配置 为了验证 NUMA 参数是否正确设置,可以使用以下工具: - `numastat`:显示 NUMA 统计信息。 - `lscpu`:查看 CPU NUMA 节点信息。 - `cat /proc/cmdline`:检查内核引导参数。 #### 示例代码 以下是一个简单的脚本示例,用于启用 NUMA 平衡功能并验证其状态: ```bash #!/bin/bash # 启用 NUMA 平衡功能 echo "Enabling NUMA balancing..." echo 1 > /proc/sys/kernel/numa_balancing # 验证设置是否成功 if [ "$(cat /proc/sys/kernel/numa_balancing)" -eq 1 ]; then echo "NUMA balancing is enabled." else echo "Failed to enable NUMA balancing." fi ``` ### 注意事项 - 在修改内核参数之前,请确保了解这些参数的具体作用以及可能的影响。 - 如果不确定某个参数的作用,建议查阅官方文档或社区资料。 - 对于生产环境,建议在测试环境中验证更改后再应用于实际系统。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值