web-dev-qa-db-ja.com

同じマシン上のRedisとPostgresql:vm.overcommit_memory =?

Redisのドキュメントでは、バックグラウンドでの新しい保存が失敗するように、vm.overcommit_memory1に設定する必要があることが明確に示されています。 http://redis.io/topics/faq

しかしながら

Postgresqlのドキュメントでは、ポストマスタープロセスがoom killerによって強制終了されないように、vm.overcommit_memory2に設定する必要があると記載されています。 http://www.postgresql.org/ docs/9.3/static/kernel-resources.html

さて、これは矛盾した原因です。私は何をすべきか?

私のredisデータベースには20GBの制限があります。サーバーには252GBの物理RAMがあります。 Postgresqlが100GBを超える物理RAMを使用することはめったにありません。

PS:私はubuntu 14、Redis 3.0、Postgresql9.3を使用しています

2
Niels Kristian

Ubuntu用のPostgreSQLパッケージは、ポストマスタープロセスの不適切なOOMキルに対して、ドキュメントに記載されているアプローチをすでに実装しているため、Redisの推奨事項を選択できます。

これは、ドキュメントで参照しているセクションの直後です。 Linuxメモリオーバーコミット からの抜粋

Vm.overcommit_memoryを変更するかどうかに関係なく使用できる別のアプローチは、ポストマスタープロセスのプロセス固有のoom_score_adj値を-1000に設定することです。これにより、OOMキラーのターゲットにならないことが保証されます。これを行う最も簡単な方法は、実行することです

エコー-1000>/proc/self/oom_score_adj

ポストマスターを呼び出す直前のポストマスターの起動スクリプトで。このアクションはrootとして実行する必要があることに注意してください。そうしないと、効果がありません。したがって、ルート所有の起動スクリプトが最も簡単な場所です。これを行う場合は、CPPFLAGSに-DLINUX_OOM_SCORE_ADJ = 0を追加してPostgreSQLをビルドすることもできます。これにより、ポストマスターの子プロセスが通常のoom_score_adj値0で実行されるため、OOMキラーは必要に応じてそれらをターゲットにできます。

Ubuntu 14では、postgresインスタンスを開始するpg_ctlclusterスクリプトには次のものがあります。

   # have the postmaster start with increased OOM killer protection; 9.1 and
    # later has builtin support for resetting the adjustment of child processes
    if ($action eq 'start' && $version >= '9.1') {
        if (-w '/proc/self/oom_score_adj') {
            open F, '>/proc/self/oom_score_adj';
            print F "-900\n";
            close F;
        }
    }

したがって、固定の-900をポストマスターのOOMスコアに割り当てます。

そして/usr/lib/postgresql/9.3/bin/pg_config pg_config --cflagsは言う:

-g -O2 -fstack-protector --param = ssp-buffer-size = 4 -Wformat -Werror = format-security -fPIC -pie -I/usr/include/mit-krb5 -DLINUX_OOM_SCORE_ADJ = 0-fno-omit-frame-pointer -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -Wmissing-format-attribute -Wformat-セキュリティ-fno-strict-aliasing-fwrapv -fexcess-precision = standard -g

したがって、postmasterはOOMキラーによって選択されるべきではありませんが、子バックエンドプロセス(接続ごとに1つ)は選択できます。

4
Daniel Vérité