先週、いくつかの興味深い問題に出くわしました。TomcatでApache HTTP Serverを実行している運用サーバーの 1 つが停止し、HTTP の停止を報告していることに気付きました。
この問題をさらに調査したところ、JVM が原因でメモリ ページがすぐにスワップ アウトされたことが原因であると思われました。これにより、スワップ領域が完全に読み込まれ、次にページがスワップに移動されたときにメモリの問題が発生しました。
さらに調査すると、一部の Linux ディストリビューションではデフォルトで 60% に設定されている JVM swappiness 係数があるようです。いくつかの調査に基づくと、トラフィックの多い Web サービスでは、これは高い値になる可能性があるようです。スワップ領域は 2 GB に設定されました。
スワップの詳細は次のとおりです。
Filename Type Size Used Priority
/dev/sda3 partition 2096472 1261420 -1
From /proc/meminfo
SwapCached: 944668 kB
JVM プロパティは次のとおりです。
-Xmx6g -Xms4g -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:PermSize=512M -XX:MaxPermSize=1024M -XX:NewSize=2g -XX:MaxNewSize=2g -XX:ParallelGCThreads=8
サーバーは 12 GB RAM で実行されます。
Swappiness は、JVM のGCプロセスとはうまくいきません。したがって、swappiness を 0 に減らしてみましたが、何も変わりませんでした。スワップ領域全体が消費され、OutOfMemory エラーが発生するケースがまだ見られます。
JVM のパフォーマンスを調整するにはどうすればよいですか?