Redis и Postgresql на одном компьютере: vm.overcommit_memory =?

В документации 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

2
задан 15 February 2016 в 12:17
1 ответ

Вы можете воспользоваться рекомендацией 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, но дочерний внутренний процесс (по одному на соединение) может.

4
ответ дан 3 December 2019 в 10:00

Теги

Похожие вопросы