web-dev-qa-db-ja.com

デーモンのOOMキラー調整を永続的に設定する方法は?

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;}のような無期限のスクリプトを実行することをお勧めしますか?

12
gertvdijk

いくつかの現代のデーモン監視システムには、これを行うための手段があります。 (確かに、ジョブのチェーン読み込みツールがあるため、間違いなくそれらallにはこれを行うための手段があります。)

  • Upstart:ジョブファイルでoom scoreを使用します。
    oomスコア-500
  • systemd:サービスユニットのOOMScoreAdjust=設定を使用します。サービスユニットパッチファイルを使用して、事前にパッケージ化されたサービスユニットに影響を与えることができます。
    [サービス]
    OOMScoreAdjust = -500
  • daemontools familyrunプログラムの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

参考文献

  • ジョナサン・デ・ボイン・ポラール(2016)。 oom-kill-protect 。 noshツールセット。ソフトウェア。
  • ジェームス・ハントとクリント・バイラム(2014)。 " oom score "。 Upstart Cookbook
  • Lennart Poettering(2013-10-07)。 " OOMScoreAdjust "。 systemd.exec。 systemdのマニュアルページ。 freedesktop.org。
  • ジョナサン・デ・ボイン・ポラール。 rcctl 。 noshツールセット。ソフトウェア。
  • https://unix.stackexchange.com/a/409454/5132
8
JdeBP

これは、UbuntuでUpstartとoom score構成オプションを使用して可能です。

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
9
gertvdijk

MySQL自体にハッキングすることもできます(たとえば、OpenSSHのsshdがこれを実行します)が、それは少しハードコアすぎて非常にダーティです(更新の問題など)。

これはラッパーまたはinitスクリプトで行うことができます-スコアは継承される必要があります(そしてラッパーではおそらくexec mysqld "$@"とにかく)。

cgroupsを使用してください。これにより、柔軟性が向上し、サービスの再起動時に適切な設定を自動的に適用できるという意味で、永続的にすることができます。たとえば、 cgroupsを使用してアプリケーションの優先順位を制御する 詳細については。探している自動化を実現するには、おそらく実行中のプロセスのcgroupの変更を一連のルールに従ってオンザフライで処理できるデーモンが含まれている libcgroup を確認する必要があります。 、または(同じパッケージの)cgexecラッパーを使用します。

4
peterph