在 Linux 上为多个服务 / 进程启用 HugePages

在 Linux 上为多个服务 / 进程启用 HugePages

我在一台 Debian 机器上运行着一个 JVM 服务和一个 MySQL 实例。我按照各种在线指南启用了 HugePages,但遇到了问题。

这是我的配置:

vm.nr_hugepages = 2816
vm.nr_overcommit_hugepages = 128
vm.hugetlb_shm_group = 1002
kernel.shmmax = 5905580032
kernel.shmall = 1441792

更新:我的机器是 VMWare ESX 上的客户虚拟机,分配了 2 个 CPU 和 6GB 的 RAM。我为系统保留了 512MB 的 RAM,其余的(5.5GB,5905580032 字节,如 所示kernel.shmmax)分配给 JVM 3GB,分配给 MySQL 2.5GB。因此我保留了 5.5GB / 2MB = 2816 个大页面

允许组“services”(gid=1002)访问内存。MySQL 和 JVM 由不同的用户运行,这些用户都是该组“services”的成员,作为主要组:

uid=106(mysql) gid=1002(services) groups=1002(services),111(mysql)
uid=1001(java) gid=1002(services) groups=1002(services),1003(java)

大页面已启用,并且正常工作。问题是每次只能申请一个似乎可以使用它们!如果我首先启动 mysql,那么 jvm 将无法使用它,反之亦然。

service mysql start -> OK
service java start -> Fallback to normal memory

或者

# service java start -> OK
# service mysql start -> Failure, can't allocate memory

我该怎么做?我是不是哪里搞错了?这能做到吗?

不需要为 Java 和 MySQL 创建单独的机器,因此我热衷于将两种服务保留在同一台机器上。

更新:目前,我正在做一些内存分析,以决定将 HugePages 分配给 JVM 还是 MySQL 更好。或者有快速答案吗?

谢谢

答案1

您没有提到您的发行版/内核版本,但值得注意的是,最近的内核(2.6.38+)有一个称为透明大页面的功能。

您可以使用以下方法判断它是否已启用:

cat /sys/kernel/mm/transparent_hugepage/enabled

它几乎承担了您管理和预分配大页面的所有负担。

您可以通过运行以下命令查看使用哪种页面大小分配了多少内存

cat /proc/meminfo | grep AnonHugePages

或者

egrep 'trans|thp' /proc/vmstat

每个进程使用量

grep -e AnonHugePages  /proc/*/smaps | awk  '{ if($2>4) print $0} ' |  awk -F "/"  '{print $0; system("ps -fp " $3)} '

最后三个命令取自RHEL6 支持

有趣的信息关于透明大页 (Transparent HugePages) 和 JVM。

相关内容