メモリが限られていて、スワップスペースを追加するオプションがないマシンでDebianを実行しています。このマシンは、Webおよびデータベースサーバーとして機能します。私が見ている問題は、複数のWebリクエストが着信すると、データベースが接続の受け入れを停止し、システムに使用可能なRAMがなくなったためにクラッシュすることさえあるということです。
別のプロセス(私の場合はFirebird)がメモリを要求し、十分でない場合に、特定のプロセス(私の場合はApache)を強制終了するようにLinuxに指示することは可能ですか?ネイティブで行うことができない場合は、これを達成するのに役立つツールがありますか?
特定のプロセスを優先するように、OOMキラーを調整できます。各プロセスには、システムがOOM状況で実行された場合に、プロセスが強制終了される可能性を示すスコアがあります。プロセスのスコアは/proc/${PID}/oom_score
で確認できます。 /proc/${PID}/oom_adj
を使用して、OOMキラーの決定にバイアスをかけることができます。値が高いと、OOMキラーが$ {PID}を強制終了する可能性が高くなります。 oom_adj
の値は子に継承されるため、起動時にマスターApacheプロセスで設定するだけです(この場合、Apacheを再起動するウォッチドッグを使用する必要があります)。別の方法は、マスタープロセスをデフォルトレベルのままにし、各子を調整して、マスターが存続し、必要に応じて子を再生成することです(この場合、新しい子をチェックしてoom_adj
を調整する外部デーモンが必要です)。もちろん、これはマルチプロセスワーカーを使用していることを前提としています;-)
oom_adj
値の通常の範囲(-16,15)はバイアスにすぎないことに注意してください。スコアが十分に高い場合、OOMキラーのヒューリスティックは別のプロセスを選択する可能性があります。特別な値-17を使用すると、OOM killerはプロセスを強制終了できなくなりますが、強制終了できないプロセス(DBなど)が異常終了すると、カーネルがメモリ不足から回復できない可能性があるため、危険です。
レンタルVMを使用している場合は、スワップパーティションの代わりにスワップファイルを追加するだけです。パフォーマンスは低下しますが、少なくとも必要なときに使用可能なメモリがあります:)
スワップファイルを作成するにはどうすればよいですか?
Sudo dd if=/dev/zero of=/swapfile bs=1024 count=1000000
これにより、サイズ1GB(ラウンド)のファイル(/ swapfile)が作成されます。
Sudo mkswap /swapfile
このファイルをスワッププールに追加します
Sudo swapon /swapfile
これでうまくいきます。これで、1Gbのスワップメモリが追加されました。