web-dev-qa-db-ja.com

Linuxで複数のサービス/プロセスに対してHugePagesを有効にする

私のDebianマシンの1つで、JVMとMySQLインスタンスでサービスを実行しています。さまざまなオンラインガイドに従ってHugePagesを有効にしましたが、問題が発生しています。

これが私の設定です:

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

PDATE:私のマシンはゲストですVM VMWare ESXの上に、2つのCPUと6GBのRAMが割り当てられています。512MBまたはRAMシステム用で、残り(5.5GB、kernel.shmmaxに表示される5905580032バイト)はJVMに3GB、MySQLに2.5GBが割り当てられているため、5.5GB/2MB = 2816の巨大ページを予約しました

メモリへのアクセスは、グループ「services」(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が有効になっていて、機能します。問題は一度に1つのアプリケーションのみそれらを使用できるように見えることです!最初に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用に別々のマシンを作成する必要はないので、両方のサービスを同じマシン上に維持したいと思っています。

PDATE:現在、HugePagesをJVMに割り当てるかMySQLに割り当てる方がよいかを判断するために、メモリプロファイリングを行っています。それともこれに対する簡単な答えはありますか?

ありがとうございました

3
ColOfAbRiX

ディストリビューション/カーネルのバージョンについては言及していませんが、最近のカーネル(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サポート から取得した最後の3つのコマンド

興味深い info 透過的なHugePagesとJVMについて。

1
Fox