私のサーバーは、私が制御できない何十ものプロセス(主に監視ソフトウェア)を実行しています。
私のアプリケーションログによれば、一部のサードパーティプロセスはあまりにも多くのメモリを割り当てようとし、システムに残っているRAMとスワップの両方を使用することがあります。この場合、JavaアプリケーションはOOMと競合します。単純なメモリ消費スクリプトを使用してこの状況を再現できます。
私はコンピュータ上で実行されている他のソフトウェアを制御できないので、cgroupを使用してサードパーティのプロセスに利用可能なメモリを制限することにしました。これは非常にうまく機能します。
私の問題は、OS/カーネル/コアシステムプロセスを識別し、それをサードパーティのプロセスから分離することです。
今、私はサードパーティのプロセスを見つけて、プロセスコマンドラインのいくつかの一般的なパスパターンを使ってメモリを制限されたcgroupに入れようとしています。
私のアプリケーションをroot cgroup(無制限のメモリ)で実行し、他のすべてのプロセス(すべてのOSとカーネルプロセスを含む)をRAMとSWAPの制限が最大1 GBのcgroupに入れてもかまいません。 (実際にはスワップはありません)
RHEL OS(カーネル2.6.32-279.el6.x86_64)を実行するのに1 GBであれば十分で、すべてのシステムプロセスで使用可能なRAMを制限してもシステムの安定性に影響を与えないことを願っています。