Linux
在 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 之上的來賓 VM,分配了 2 個 CPU 和 6GB 的 RAM。我為系統保留了 512MB 或 RAM,剩下的(5.5GB,5905580032 字節,如 中所示
kernel.shmmax
)分配給 JVM 和 2.5GB 給 MySQL。因此我保留了 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 創建單獨的機器,因此我熱衷於將這兩種服務保持在同一台機器上。
**更新:**目前我正在做一些記憶體分析以確定是否最好將 HugePages 分配給 JVM 或 MySQL。或者有一個快速的答案嗎?
謝謝
您沒有提及您的發行版/核心版本,但可能值得注意的是,最近的核心(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 支持
關於透明 HugePages 和 JVM 的有趣資訊。