透明大页是Linux内核中的一种内存管理机制,旨在通过使用更大的内存页面来提高性能。通常情况下,标准的内存页面大小为4KB,而透明大页可以将多个标准页面合并为一个较大的页面(通常是2MB或1GB)。这种机制减少了页表项的数量,从而降低了TLB(Translation Lookaside Buffer)的负担,并提高了某些工作负载的性能。
然而,在某些场景下(如数据库服务器、虚拟化环境等),透明大页可能会导致性能下降,因为它会引入额外的内存分配开销和碎片化问题。因此,禁用透明大页可能是一个合理的优化选择。
在运行中的系统上,可以通过/sys/kernel/mm/transparent_hugepage/enabled
文件来控制透明大页的状态。以下是具体步骤:
查看当前状态 使用以下命令查看透明大页的状态:
cat /sys/kernel/mm/transparent_hugepage/enabled
输出示例:
[always] madvise never
[always]
表示透明大页始终启用。madvise
表示仅在应用程序明确请求时启用。never
表示透明大页被禁用。临时禁用透明大页
执行以下命令将透明大页设置为never
:
echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled
验证更改
再次运行cat /sys/kernel/mm/transparent_hugepage/enabled
,确保输出显示为:
always madvise [never]
如果希望在系统启动时自动禁用透明大页,可以通过修改GRUB引导参数实现。
编辑GRUB配置文件
打开/etc/default/grub
文件:
sudo nano /etc/default/grub
添加内核参数
在GRUB_CMDLINE_LINUX_DEFAULT
变量中添加transparent_hugepage=never
参数。例如:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash transparent_hugepage=never"
更新GRUB配置 保存文件后,运行以下命令以应用更改:
sudo update-grub
重启系统 重启计算机以使更改生效:
sudo reboot
验证更改 系统重启后,检查透明大页的状态:
cat /sys/kernel/mm/transparent_hugepage/enabled
确保输出显示为[never]
。
为了简化操作,可以编写一个简单的脚本来禁用透明大页。
创建脚本文件
创建一个名为disable-thp.sh
的脚本文件:
sudo nano /usr/local/bin/disable-thp.sh
编写脚本内容 将以下内容写入脚本:
#!/bin/bash
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
赋予执行权限 为脚本赋予可执行权限:
sudo chmod +x /usr/local/bin/disable-thp.sh
设置开机自启
将脚本添加到系统的启动脚本中,例如通过/etc/rc.local
(如果存在)或使用systemd服务。
透明大页的优点
透明大页的缺点
其他相关配置
/sys/kernel/mm/transparent_hugepage/defrag
:控制是否在内存不足时进行碎片整理。madvise
:允许应用程序显式控制是否使用透明大页。