1つまたはいくつかの重要なシステムサービスデーモンでいくつかのLinuxサーバーを実行しているときに、何か奇妙なことが起こった場合に備えて、デーモン化されたプロセスのOOMキラーを調整したいと思います。たとえば、今日、MySQLを実行している一部のUbuntuサーバーは、大量の_apt-checker
_プロセス were がすべてのメモリを消費し、カーネルがMySQLを強制終了するのは良いアイデアであると考えたため、強制終了されたMySQLデーモンを取得しました。
/proc/$(pidof mysqld)/oom_score_adj
ファイルを使用してスコアを調整してカーネルに手掛かりを与えることができることはわかっています。MySQLを強制終了することを望まないが、それでもサービスの再起動後は生き残りません。これらの調整を含めるには、パッケージのinit/upstartスクリプトを編集する必要がありますか?パッケージに属するファイルを調整するので、これは非常に洗練された解決策ではないと思います。一般的にupstart/initスクリプトにフックし、条件付きでそれを調整することは可能でしょうか?または、while true{ adjust_oom(); sleep 60;}
のような無期限のスクリプトを実行することをお勧めしますか?
いくつかの現代のデーモン監視システムには、これを行うための手段があります。 (確かに、ジョブのチェーン読み込みツールがあるため、間違いなくそれらallにはこれを行うための手段があります。)
oom score
を使用します。oomスコア-500
OOMScoreAdjust=
設定を使用します。サービスユニットパッチファイルを使用して、事前にパッケージ化されたサービスユニットに影響を与えることができます。[サービス]
OOMScoreAdjust = -500
run
プログラムのnoshツールセットからoom-kill-protect
ツールを使用しますサービス。システムサービスユニットを変換する場合、convert-systemd-units
ツールは実際にOOMScoreAdjust=
設定をoom-kill-protect
の呼び出しに変換します。
#!/ bin/noshおまけとして、パラメータ化可能にすることができます:
…
oom-kill-protect--500
…
プログラム引数
oom-kill-protect-fromenvそしてサービスの環境でパラメーターの値を設定します(サービスに関連付けられたenvdirから読み込まれると想定され、ここではnoshツールセットの
rcctl
shimで操作されます):rcctlセット サービス名 oomprotect -500
oom-kill-protect
。 noshツールセット。ソフトウェア。oom score
"。 Upstart Cookbook。OOMScoreAdjust
"。 systemd.exec
。 systemdのマニュアルページ。 freedesktop.org。rcctl
。 noshツールセット。ソフトウェア。これは、UbuntuでUpstartとoom score
構成オプションを使用して可能です。
Linuxには「メモリ不足」キラー機能があります。 [...]
通常、OOMキラーはすべてのプロセスを同等に考慮し、このスタンザはカーネルにこのジョブを別の方法で処理するようにアドバイスします。
このスタンザに提供される「調整」値は、-999(OOMキラーによって強制終了される可能性は非常に低い)から1000(OOMキラーによって強制終了される可能性が非常に高い)までの整数値です。 [...]
例:
# this application is a "resource hog" oom score 1000 expect daemon respawn exec /usr/bin/leaky-app
MySQL自体にハッキングすることもできます(たとえば、OpenSSHのsshd
がこれを実行します)が、それは少しハードコアすぎて非常にダーティです(更新の問題など)。
これはラッパーまたはinitスクリプトで行うことができます-スコアは継承される必要があります(そしてラッパーではおそらくexec mysqld "$@"
とにかく)。
cgroups
を使用してください。これにより、柔軟性が向上し、サービスの再起動時に適切な設定を自動的に適用できるという意味で、永続的にすることができます。たとえば、 cgroupsを使用してアプリケーションの優先順位を制御する 詳細については。探している自動化を実現するには、おそらく実行中のプロセスのcgroupの変更を一連のルールに従ってオンザフライで処理できるデーモンが含まれている libcgroup を確認する必要があります。 、または(同じパッケージの)cgexec
ラッパーを使用します。