Назад | Перейти на главную страницу

Дочерний процесс Postgres занимает много памяти

У нас есть экземпляр postgres 9.0, который работает на довольно мощной машине (96 ГБ ОЗУ / 24 ядра). В последние недели у нас были сбои из-за того, что дочерние процессы postgres были убиты из-за нехватки памяти OOM killer. Кажется, что из-за использования пула соединений эти дочерние процессы являются долгоживущими (что имеет смысл, поскольку открытие и закрытие соединений требует времени), проблема в том, что они постепенно растут в потреблении памяти, чтобы достичь даже 9 ГБ / процесс. Как вы можете себе представить, наличие 10 из них заполняет доступный таран, и в дело вступает убийца.

Вопросы следующие:

  1. если мы используем параметр конфигурации по умолчанию, как может процесс выделить столько памяти?
  2. почему эти процессы никогда не освобождают память?

Для справки, настройки, которые могут влиять на память:

max_connections = 950
shared_buffers = 32MB

Все остальные настройки не отменяются, то есть мы используем значения по умолчанию.

Первое, что нужно учесть, - это увеличить shared_buffers путь вверх, по крайней мере, до 1 ГБ и, возможно, намного больше, до 25% основной памяти. Это что говорит документ.

Всего 32 МБ, из которых ~ 18 МБ уже будет использовано только для работы с max_connections до 950 дочерние процессы имеют доступ к разделяемой памяти, едва достаточной для общего доступа.

Это может или не может уменьшить проблему потребления памяти для вашей конкретной рабочей нагрузки и ситуации, но в любом случае это шаг в правильном направлении. Текущее значение безумно низкое.

Что касается конкретно OOM, вы можете рассмотреть обходные пути, предлагаемые в Перегрузка памяти Linux раздел док. Обратите внимание, однако, что это короткий абзац по сложной проблеме. Например, есть еще в этом сообщении в блоге и его комментарии с указателями для понимания контекста и компромиссов, связанных с ограничением или отключением OOM.

Кроме того, всегда возможна утечка памяти в Postgres. Убедитесь, что вы используете последнюю дополнительную версию, если она уже исправлена. В примечаниях к выпуску, которые поставляются с каждым выпуском исправлений, время от времени обязательно упоминаются утечки памяти.