在Redis文档中,它明确指出vm.overcommit_memory应该设置为1以确保后台保存更新失败: http : //redis.io/topics/faq
然而
在postgresql文档中,它说, vm.overcommit_memory应该设置为2以避免post master进程不会被oom杀手所杀: http : //www.postgresql.org/docs/9.3/static/kernel-resources。 HTML
现在,这是有矛盾的。 我该怎么办?
我的redis db有20GB的限制。 该服务器有252GB的物理内存。 Postgresql很less使用超过100GB的物理内存。
PS:我在Ubuntu 14,Redis 3.0和Postgresql 9.3
您可以参考Redis的build议,因为PostgreSQL的Ubuntu软件包已经实现了文档中提到的方法,而对于postmaster进程的一个不明智的OOM杀手。
这是在你在文档中引用的部分之后。 摘自Linux Memory Overcommit
另一种可以在更改或不更改vm.overcommit_memory的情况下使用的方法是将postmaster进程的特定于进程的oom_score_adj值设置为-1000,从而保证它不会被OOM杀手所针对。 最简单的方法就是执行
echo -1000> / proc / self / oom_score_adj
在调用postmaster之前在postmaster的启动脚本中。 请注意,此操作必须以root身份完成,否则将无效; 所以根拥有的启动脚本是最简单的方法。 如果你这样做,你也可能希望build立PostgreSQL -DLINUX_OOM_SCORE_ADJ = 0添加到CPPFLAGS。 这将导致postmastersubprocess以正常的oom_score_adj值为零运行,这样OOM杀手仍然可以根据需要定位它们。
在Ubuntu 14上,启动postgres实例的pg_ctlcluster脚本具有以下function:
# 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; } }
所以它给邮政局长的OOM分数分配一个固定的-900 ,
和/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 -Winterinter-arith -Wdeclaration-after-statement -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision = standard -g
所以postmaster不应该被OOM杀手选中,而是后端进程(每个连接一个)可以。