Что это значит

Отдельный процесс PostgreSQL попросил у системы память и не получил её. В строке DETAIL указан размер и контекст памяти, где это случилось: по нему понятно, что делал процесс. Это не то же самое, что out of shared memory, там кончается общая память под блокировки.

Частые причины:

  • слишком большой work_mem при множестве одновременных запросов: каждая сортировка и хеш-соединение может взять до work_mem, и это умножается на число соединений и операций;
  • тяжёлый запрос с огромным хеш-соединением или массивом данных;
  • в системе в целом мало памяти или включён строгий режим vm.overcommit_memory = 2 с малым лимитом;
  • у контейнера с PostgreSQL низкий лимит памяти.

Как проверить

  1. Строка DETAIL и запрос из STATEMENT:: что именно выполнялось.
  2. Память сервера в это время: free -h, журнал ядра на предмет OOM killer.
  3. Настройки памяти: SHOW work_mem; SHOW maintenance_work_mem; SHOW max_connections;.

Что сделать

  1. Уменьшить work_mem глобально и поднимать его только для тяжёлых отчётов в их сессии.
  2. Ограничить число одновременных соединений через пул соединений.
  3. Проверить системные настройки памяти и лимиты контейнера.