Rasppberry PIで Hydra を実行しています。プログラムにいくつかの問題がありましたが、これらとは別に、プログラムに隠れたメモリリークがあります。ソースはかなり大きく、実際には問題を見つけることができません。残念ながら、メモリ制限に達しても、プログラムはクラッシュしません。代わりに、一連のエラーメッセージが返されます。私が束と言うとき、私は数百を意味します。
そのため、プログラム内でメモリの割り当てを解除できない場合は、プロセス全体をリセットする必要があるかもしれないと思いました。 だから私はする必要があります:
エラーで死ぬようにプログラムを修正するまで、またはそもそもエラーを生成しないようにするまで、これを行わなければなりません。
Hydraを知っていて、エラーについて知りたい場合は、コードで少なくとも何かを見つけました。
[ERROR] 子のフォークに失敗しました :メモリを割り当てることができません [ERROR] ソケットペアの作成に失敗しました :開いているファイルが多すぎます
エラーの2番目の部分は、perror
Cシステム関数に起因します。それは一種の最後のエラーです。
プロセス監視フレームワークを使用したアイデアは次のとおりです 神 。このアプリケーションはRubyで記述されていますが、他のプロセスを監視し、それらが死ぬ、またはあなたの場合はRAMを使いすぎるなどのことをするのを防ぐために使用できます。
Rubyがインストールされていると仮定すると、 rvm
(別名Rubyバージョンマネージャー)を使用してこれを行うことができます =インストールしない場合でも、rootとしてインストールまたは実行する必要があります。これは神の要件です。ディストリビューションのリポジトリからRubyが利用可能な場合は、インストールすることもできます。 。
動作するRubyインストールでは、次のように神の宝石をインストールします。
$ [Sudo] gem install god
次に、この単純な神の構成を使用して、必要なことを実行できます。
# /path/to/simple.god
God.watch do |w|
w.name = "hydra"
w.start = "<command to run hydra>"
w.keepalive(:memory_max => 150.megabytes,
:cpu_max => 50.percent)
end
次に、次のように呼び出します。
$ god -c /path/to/simple.god -D
これで、HydraがCPU使用率または使用メモリのいずれかを超えた場合、神はそれを再起動します。 注:デフォルトでは、これらのプロパティは30秒ごとにチェックされ、5つのチェックのうち3つに超過がある場合に対処されます。
神のウェブサイトのドキュメント を見てください。上記の例はそこからのものであり、詳細をカバーするというはるかに徹底的な仕事をしています。
別の選択肢は プロセスリソースモニター です。機能リストは、プロセスごとのリソースを監視できることを示しています。
- プロセスごと/ユーザーごとのルールベースのリソース制限
説明の抜粋
Process Resource Monitor(PRM)は、LinuxおよびBSD用のCPU、メモリ、プロセスおよび実行(経過)時間リソースモニターです。 PRMの柔軟性は、グローバルスコープのリソース制限またはルールベースのプロセスごと/ユーザーごとの制限によって実現されます。 PRMの大幅な制御は、多数の無視オプション、ソフト/ハードキルトリガーの構成、待機/再チェックのタイミング、および親/子プロセスツリーへのキルシグナルの送信によって維持されます。さらに、ステータス出力はデフォルトで非常に詳細であり、syslogを介したログデータの送信がサポートされています。
Hydraを監視するために、次のようなルールファイルを作成できます。/usr/local/prm/rules//hydra.cmd
:
IGNORE=""
MAX_CPU="50"
MAX_MEM="150"
MAX_PROC="0"
# we dont care about the process run time, set value 0 to disable check
MAX_ETIME="0"
KILL_TRIG="3"
# we want to set a bit longer soft rechecks as sometimes the problem fixes
# itself
KILL_WAIT="20"
KILL_PARENT="1"
KILL_SIG="9"
KILL_RESTART_CMD="/etc/init.d/hydra restart"
prm
はcron経由で実行され、/etc/cron.d/prm
5分間隔で。ドキュメントによると、これはおそらくそのままにしておく必要があります。