Redisのドキュメントでは、バックグラウンドでの新しい保存が失敗するように、vm.overcommit_memory
を1
に設定する必要があることが明確に示されています。 http://redis.io/topics/faq
しかしながら
Postgresqlのドキュメントでは、ポストマスタープロセスがoom killerによって強制終了されないように、vm.overcommit_memory
を2
に設定する必要があると記載されています。 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を使用しています
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つ)は選択できます。