Redis и Postgresql на одной машине: vm.overcommit_memory=?
В документации Redis четко указано, что vm.overcommit_memory
должен быть установлен в 1
чтобы гарантировать сохранение фона, более новые неудачи: http://redis.io/topics/faq
ТЕМ НЕ МЕНИЕ
В документации postgresql говорится, что vm.overcommit_memory
должен быть установлен в 2
чтобы избежать постмастера, процесс не может быть убит убийцей: 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
1 ответ
Вы можете воспользоваться рекомендацией Redis, так как пакеты PostgreSQL для Ubuntu уже реализуют подход, упомянутый в документации, против опрометчивого OOM-уничтожения процесса postmaster.
Это только после раздела, на который вы ссылаетесь в документе. Выдержка из памяти Linux Overcommit
Другой подход, который можно использовать с или без изменения vm.overcommit_memory, состоит в том, чтобы установить значение oom_score_adj для процесса postmaster равным -1000, тем самым гарантируя, что убийца OOM не будет нацелен на него. Самый простой способ сделать это - выполнить
echo -1000 > /proc/self/oom_score_adj
в сценарии запуска postmaster непосредственно перед вызовом postmaster. Обратите внимание, что это действие должно быть выполнено от имени пользователя 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 = формат-безопасность -fPIC -pie -I / usr / include / mit-krb5 -DLINUX_OOM_SCORE_ADJ=0 -fno-omit- указатель кадра -Wall -Wmissing-прототипы -Wpointer-arith -Wdeclaration-after-Statement -Wendif-метки -Wmissing-формат-атрибут -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision = standard -g
Итак postmaster
никогда не должен быть выбран убийцей OOM, но дочерний бэкэнд-процесс (по одному на соединение) может.