サーバー環境と問題解決手順について説明します。
1. サーバー環境情報
1.1. ハードウェアスペック
物理マシン上で動作しており、以下のスペックを備えています:
| CPUモデル | CPU数 | CPUコア数 | CPUスレッド数 | RAM |
|---|---|---|---|---|
| Intel(R) Xeon(R) CPU E5-2630 v4 @ 2.20GHz | 2個 | 20コア | 40スレッド | 126GB |
1.2. Tomcat起動パラメータ
$TOMCAT_HOME/bin/catalina.shファイル内のJVMオプションは以下の通りです:
JAVA_OPTS="-server -Xms90g -Xmx90g -XX:PermSize=256m -XX:MaxPermSize=256m -XX:+UseConcMarkSweepGC"
2. 発生した問題
CentOS 6.5上でTomcatを起動すると以下のエラーが発生しました:
Error occurred during initialization of VM
Could not reserve enough space for object heap
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
3. 問題解決
JVMの初期化時に十分なヒープスペースを確保できないという問題でした。以下に解決策を記載します。
3.1. JVMメモリ割り当てテスト
以下のコマンドを実行してJVMが32GBのメモリを確保できるか確認しました。
java -Xmx32g -version
3.2. システムリソース制限確認
システムリソースの制限を確認するために以下のコマンドを使用しました。
ulimit -a
結果によるとメモリの使用には制限が設けられていませんでした。
3.3. カーネルパラメータの修正
同僚がGreenplum DBのテストのために/etc/sysctl.confファイルを編集し、vm.overcommit_memoryパラメータを2に設定していました。これを0に変更し、変更を反映させました。
vm.overcommit_memory=0
sysctl -p
4. vm.overcommit_memoryについて
このパラメータは、カーネルがメモリをどのように割り当てるかを決定するためのものです。3つの値(0, 1, 2)が設定可能です。
4.1. vm.overcommit_memory=0
デフォルト設定で、システムの物理メモリとスワップ領域、スラブキャッシュから解放できるメモリの合計を超えるリクエストは失敗します。
4.2. vm.overcommit_memory=1
すべてのメモリ割り当てリクエストを成功として扱います。
4.3. vm.overcommit_memory=2
物理メモリのvm.overcommit_ratioパーセント分とスワップ領域の合計を超えるリクエストは失敗します。
4.4. システムの利用可能なメモリ確認
/proc/meminfoファイルを確認することで、システムが現在どれだけのメモリを割り当てることができるかを把握できます。
grep -i commit /proc/meminfo
CommitLimit: システムが現在割り当てることができるメモリの上限値
Committed_AS: 現在のプロセスが要求している総メモリ量(まだ完全には割り当てられていない可能性があります)