В документации Redis четко указано, что для vm.overcommit_memory
должно быть установлено значение 1
, чтобы гарантировать сбой сохранения в фоновом режиме: http://redis.io/topics/faq
ОДНАКО
В документации postgresql говорится, что vm.overcommit_memory
должен быть установите значение 2
, чтобы избежать прерывания мастер-процесса поста из-за убийцы oom: http://www.postgresql.org/docs/9. 3 / static / kernel-resources.html
Это противоречие. Что мне делать?
Моя база данных Redis имеет ограничение в 20 ГБ. На сервере установлено 252 ГБ физической памяти. Postgresql редко использует физическую оперативную память объемом более 100 ГБ.
PS: Я использую ubuntu 14, Redis 3.0 и Postgresql 9.3
Вы можете воспользоваться рекомендацией Redis, так как пакеты PostgreSQL для Ubuntu уже реализуют подход, упомянутый в документации, против опрометчивого OOM-уничтожения процесса postmaster.
Это сразу после раздела, на который вы ссылаетесь в док. Выдержка из Linux Memory Overcommit
Другой подход, который можно использовать с или без изменения vm.overcommit_memory - установить специфичный для процесса oom_score_adj значение для процесса postmaster до -1000, что гарантирует его не будет целью убийцы OOM.Самый простой способ сделать это для выполнения
echo -1000> / proc / self / oom_score_adj
в сценарии запуска постмастера непосредственно перед вызовом почтмейстер. Обратите внимание, что это действие должно быть выполнено от имени пользователя root, иначе оно будет не действуют; поэтому сценарий запуска, принадлежащий пользователю root, - самое простое место для сделай это. Если вы это сделаете, вы также можете захотеть собрать PostgreSQL с -DLINUX_OOM_SCORE_ADJ = 0 добавлен в CPPFLAGS. Это заставит дочерние процессы postmaster работать с обычным нулевым значением oom_score_adj, поэтому что убийца OOM по-прежнему может атаковать их при необходимости.
В Ubuntu 14 сценарий pg_ctlcluster
, запускающий экземпляр postgres, имеет следующее:
# 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-security -fno-strict-aliasing -fwrapv -fexcess-precision = standard -g
Итак, postmaster
никогда не должен выбираться убийцей OOM, но дочерний внутренний процесс (по одному на соединение) может.