我想在我的 Amazon Elastic Compute Cloud (Amazon EC2) Linux 实例上配置 HugePages。
解决方法
**注意:**在将 HugePages 部署到生产环境之前,最佳做法是在测试环境中配置 HugePages 并对性能进行基准测试。在 x86_64 系统上,HugePage 的大小只能为 2MB 或 1GB。有关 HugePages 的更多信息,请参阅 Oracle 网站上的 Configuring HugePages on Linux(在 Linux 上配置 HugePages)。
**先决条件:**要验证您的应用程序或数据库是否支持 HugePages,请咨询您的供应商。此外,要确定可用内存量,请运行以下命令来验证 EC2 实例的总内存:
free -m
要在 Linux 实例上配置 HugePages,请完成以下步骤:
-
运行以下命令,验证您的内核是否未启用 HugePages:
sudo cat /proc/sys/vm/nr_hugepages
如果命令输出为 0,则表示未启用 HugePages。
-
要计算所需的 HugePages 数量,请使用以下公式:<br id=hardline_break/>
HugePages 数量 = 所需内存 / HugePage 大小<br id=hardline_break/>
**注意:**请将结果四舍五入取整,确保创建足够的内存页。
-
运行以下命令,启用 HugePages 并设置内核参数值:
sudo sysctl -w vm.nr_hugepages=2048
**注意:**请将 2048 替换为您计算出的 HugePages 数量。<br id=hardline_break/>
输出示例:
vm.nr_hugepages = 2048
-
要验证系统在重启后是否会分配 HugePages,请将以下条目添加到 /etc/sysctl.conf 文件中:
sudo echo "vm.nr_hugepages=2048" >> /etc/sysctl.conf
**注意:**请将 2048 替换为您计算出的 HugePages 数量。
-
要验证您的更改,请运行以下命令:
sudo cat /etc/sysctl.conf
在命令输出中,验证是否存在 vm.nr_hugepages 的值。<br id=hardline_break/>
输出示例:
# sudo cat /etc/sysctl.conf
# sysctl settings are defined through files in
# /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.
#
# Vendors settings live in /usr/lib/sysctl.d/.
# To override a whole file, create a new file with the same in
# /etc/sysctl.d/ and put new settings there. To override
# only specific settings, add a file with a lexically later
# name in /etc/sysctl.d/ and put new settings there.
#
# For more information, see sysctl.conf(5) and sysctl.d(5).
vm.zone_reclaim_mode=1
vm.nr_hugepages=2048
-
重启实例。
-
重新运行以下命令,验证 HugePages 的值和配置:
sudo cat /proc/sys/vm/nr_hugepages
如果输出是您计算出的 HugePages 数量,则已启用 HugePages。<br id=hardline_break/>
输出示例:
# sudo cat /proc/sys/vm/nr_hugepages
2048
-
要检查 /proc/meminfo 中可用的 HugePages,请运行以下命令:
sudo grep Huge /proc/meminfo
输出示例:
# sudo grep Huge /proc/meminfo
HugePages_Total: 2048
HugePages_Free: 2048
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
有关每个 HugePages 值的定义,请参阅 kernel.org 上的 HugePages。
要停用 HugePages,请完成以下步骤:
-
运行以下命令将 nr_hugepages 重置为 0:
sudo sysctl -w vm.nr_hugepages=0
-
从 sysctl.conf 中移除以下条目:
sudo echo "vm.nr_hugepages=2048" >> /etc/sysctl.conf
-
重启实例。