在Ubuntu上关闭透明大页(转)

在 Ubuntu 上关闭透明大页(Transparent HugePages, THP)主要有两种方法:临时关闭(重启后失效)和永久关闭。下面我为你详细说明操作步骤,并补充一些注意事项。

透明大页(THP)管理指南

🔧 1. 检查当前 THP 状态

在开始操作前,建议先检查一下当前系统的 THP 状态。打开终端,输入以下命令:

cat /sys/kernel/mm/transparent_hugepage/enabled

如果输出中包含 [always] 或 [madvise],表示 THP 处于启用状态;如果显示 always madvise [never],则表示 THP 已被禁用。

⚡ 2. 临时关闭 THP(重启后失效)

如果只是想立即关闭 THP 进行测试,可以使用以下命令:

echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled
echo never | sudo tee /sys/kernel/mm/transparent_hugepage/defrag # 建议同时也关闭碎片整理

注意:这种方法只在当前运行 session 中有效,服务器或电脑重启后 THP 又会重新启用。

🔒 3. 永久关闭 THP

以下两种方法可以实现永久关闭,推荐使用第一种(修改 GRUB),因为它更通用和标准。

方法一:通过修改 GRUB 配置(推荐)

  1. 编辑 GRUB 配置文件:
    sudo nano /etc/default/grub
  2. 找到 GRUB_CMDLINE_LINUX_DEFAULT 或 GRUB_CMDLINE_LINUX 行,在其引号内的参数中添加 transparent_hugepage=never。例如:
    GRUB_CMDLINE_LINUX_DEFAULT="quiet splash transparent_hugepage=never"
    # 或者
    GRUB_CMDLINE_LINUX="transparent_hugepage=never"
    如果还需要关闭 NUMA(在某些数据库场景下建议),可以一并添加 numa=off。
  3. 保存文件后,更新 GRUB:
    sudo update-grub
  4. 重启系统:
    sudo reboot

方法二:通过 systemd 服务或 rc.local(备用方案)

某些特定应用(如 MongoDB)会推荐使用此方法。

  1. 创建一个 systemd 服务文件(例如 /etc/systemd/system/disable-thp.service):
    [Unit]
    Description=Disable Transparent Huge Pages (THP)
    After=sysinit.target

    [Service]
    Type=oneshot
    ExecStart=/bin/sh -c 'echo never > /sys/kernel/mm/transparent_hugepage/enabled && echo never > /sys/kernel/mm/transparent_hugepage/defrag'

    [Install]
    WantedBy=basic.target
    你也可以选择使用 rc.local(如果系统支持):
    编辑 /etc/rc.local 文件(如果没有则创建),在 exit 0 这一行之前添加:
       if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
    echo never > /sys/kernel/mm/transparent_hugepage/enabled
    fi
    if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
    echo never > /sys/kernel/mm/transparent_hugepage/defrag
    fi
    ```[citation:5]
    并确保 `rc.local` 文件有可执行权限。

    2. 启用并启动服务(如果使用 systemd 方式):
    ```bash
    sudo systemctl daemon-reload
    sudo systemctl enable disable-thp.service
    sudo systemctl start disable-thp.service
  2. 重启系统以确保更改生效。

✅ 4. 验证关闭状态

重启后,再次运行检查命令:

cat /sys/kernel/mm/transparent_hugepage/enabled

如果成功,输出应显示为 always madvise [never],表明 THP 已被禁用。

⚠️ 4. 注意事项

· 为什么关闭 THP:THP 旨在自动管理大内存页,但某些应用(如 Oracle数据库、MongoDB、Redis、Hadoop 等)已知与其存在兼容性问题,可能导致性能下降、内存延迟或异常开销。关闭 THP 可以避免这些潜在问题。
· 性能权衡:对于某些其他工作负载,THP 可能有益。除非你遇到特定问题或有应用明确要求,否则无需禁用。通常只有在运行上述特定企业级软件时才建议关闭。
· 关闭 Defrag:建议同时将 enabled 和 defrag 都设置为 never。
· NUMA:在某些数据库应用场景中,有时会建议同时关闭 NUMA(numa=off),但这与 THP 是独立的配置,请根据你的具体软件建议决定。

💎 总结

关闭 Ubuntu 的透明大页并不复杂。通常而言,修改 GRUB 配置是最常用且一劳永逸的方法。完成操作后,务必重启系统并验证状态。

如果你在操作过程中遇到任何问题,或者想知道更多关于你的特定应用为何需要关闭 THP 的细节,我很乐意提供进一步帮助。