我在一台 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。