Главная / Справочник ошибок / PostgreSQL
Процессу PostgreSQL не удалось выделить память
ERROR: out of memory. DETAIL: Failed on request of size in memory context
«ERROR: out of memory» и «DETAIL: Failed on request of size N in memory context» в PostgreSQL: процессу запроса не хватило памяти. Чем отличается от «out of shared memory», какие настройки и запросы к этому приводят.
Что это значит
Отдельный процесс PostgreSQL попросил у системы память и не получил её. В строке DETAIL указан размер и контекст памяти, где это случилось: по нему понятно, что делал процесс. Это не то же самое, что out of shared memory, там кончается общая память под блокировки.
Частые причины:
- слишком большой
work_memпри множестве одновременных запросов: каждая сортировка и хеш-соединение может взять доwork_mem, и это умножается на число соединений и операций; - тяжёлый запрос с огромным хеш-соединением или массивом данных;
- в системе в целом мало памяти или включён строгий режим
vm.overcommit_memory = 2с малым лимитом; - у контейнера с PostgreSQL низкий лимит памяти.
Как проверить
- Строка
DETAILи запрос изSTATEMENT:: что именно выполнялось. - Память сервера в это время:
free -h, журнал ядра на предмет OOM killer. - Настройки памяти:
SHOW work_mem; SHOW maintenance_work_mem; SHOW max_connections;.
Что сделать
- Уменьшить
work_memглобально и поднимать его только для тяжёлых отчётов в их сессии. - Ограничить число одновременных соединений через пул соединений.
- Проверить системные настройки памяти и лимиты контейнера.
Ошибка повторяется?
Запустите Диагностика: за полминуты он покажет состояние базы, брокера, поиска и сервера. С отчётом разберём причину за 30 минут бесплатного созвона.
Написать