Linux

在 Linux 上為多個服務/程序啟用 HugePages

  • April 29, 2015

在我的一台 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 的有趣資訊。

引用自:https://serverfault.com/questions/686409