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, но дочерний бэкэнд-процесс (по одному на соединение) может.

Другие вопросы по тегам