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


12

単一または少数の重要なシステムサービスデーモンを使用していくつかのLinuxサーバーを実行している場合、何らかの異常が発生した場合に備えて、デーモン化されたプロセスのOOMキラーを調整したいと思います。たとえば、多くのapt-checkerプロセスすべてのメモリを消費し、カーネルがMySQLを強制終了することをお勧めしているため、今日、MySQLを実行しているUbuntuサーバーが強制終了されたMySQLデーモンを取得しました。

/proc/$(pidof mysqld)/oom_score_adjファイルを使用してスコアを調整して、MySQLを削除することを好まない手がかりをカーネルに与えることができることは知っていますが、それでもサービスの再起動には耐えられません。これらの調整を含めるために、パッケージからinit / upstartスクリプトを編集する必要がありますか?パッケージに属するファイルを調整するので、これは非常にエレガントなソリューションではないと思います。一般にupstart / initスクリプトにフックし、条件付きで調整することは可能でしょうか?または、次のような無期限のスクリプトを実行することをお勧めしwhile true{ adjust_oom(); sleep 60;}ますか?


興味深いことに、それを調整する可能性があります。仕事を成し遂げるには無限ループに勝るものはないと思います。OOM-killerはカーネルの奥深くに埋め込まれており、非常にあいまいなアルゴリズムを備えています。
ニルス

回答:


7

いくつかの最新のデーモン監視システムには、これを行う手段があります。(実際、ジョブにはチェーン読み込みツールがあるため、おそらくすべてのツールにこれを実行する手段があります。)

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

    システムサービスユニットを変換する場合、convert-systemd-unitsツールは実際にOOMScoreAdjust=設定をそのような呼び出しに変換しますoom-kill-protect

    #!/ bin / nosh 

    oom-kill-protect--500

    プログラム 引数
    ボーナスとして、パラメータ化可能にすることができます:
    oom-kill-protect-fromenv
    そして、サービスの環境でパラメーターの値を設定します(サービスに関連付けられたenvdirから読み取られると想定され、ここではnoshツールセットのrcctlシムで操作されます):
    rcctl set servicename oomprotect -500

参考文献

  • ジョナサン・ド・ボイン・ポラード(2016)。oom-kill-protect。noshツールセット。ソフトウェア。
  • ジェームスハントとクリントバイラム(2014)。「oom score」。 Upstart Cookbook
  • レナートポタリング(2013-10-07)。「OOMScoreAdjust」。 systemd.exec。systemdのマニュアルページ。freedesktop.org。
  • ジョナサン・ド・ボイン・ポラード。rcctl。noshツールセット。ソフトウェア。
  • /unix//a/409454/5132

9

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

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

Ubuntu 16.04+を使用している読者の場合、Upstartがsystemdに置き換えられたため、これは廃止されました。
gertvdijk

4

MySQL自体にハックすることもできます(たとえば、OpenSSH sshdがこれを行います)

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.