在我的一台Debian机器上,我正在JVM和MySQL实例上运行一个服务。 我已经启用了各种在线指南的巨大页面,但我有一个问题。
这是我的configuration:
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,5905580032bytes,见kernel.shmmax )分配给JVM 3GB,MySQL分配2.5GB。 所以我预留了5.5GB / 2MB = 2816个大页面
允许对“服务”组(gid = 1002)访问内存。 MySQL和JVM与作为该组“服务”的不同用户一起运行,作为主要组:
uid=106(mysql) gid=1002(services) groups=1002(services),111(mysql) uid=1001(java) gid=1002(services) groups=1002(services),1003(java)
HugePages已启用,他们的工作。 问题是,当时只有一个应用程序似乎能够使用它们! 如果我第一次启动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创build单独的机器,因此我非常希望将这两个服务都保存在同一台机器上。
更新:目前我正在做一些内存分析,以决定是否最好分配给JVM或MySQL的HugePages。 还是有一个快速的答案呢?
谢谢
你不提到你的发行版/内核版本,但值得注意的是最近的内核(2.6.38+)有一个叫做transparent hugepages的特性。
您可以使用以下命令来判断是否启用:
cat /sys/kernel/mm/transparent_hugepage/enabled
几乎所有这些负担pipe理和预分配你的巨大页面。
您可以通过运行查看使用哪个页面大小分配了多less内存
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支持的命令
有趣的信息透明HugePages和JVM。