Вы получаете уведомления от Heroku Warning о том, что у вас «не хватает временного пространства на своем дополнении Postgres»?
Потенциальным исправлением является корректировка work_mem
значение для базы данных. Это потребует некоторой настройки для оптимизации базы данных для конкретной нагрузки на запрос, которую она испытывает. Итак, некоторая пробная и ошибка.
В этой статье мы проведем, как проверить вашу базу данных work_mem
ценность и как изменить его на лучшую ценность, которая заставит это предупреждение исчезнуть.
work_mem
«Определяет объем памяти, который будет использоваться в операциях внутренних сортировки и хэш -таблицам, прежде чем записать во временные файлы диска». ( источник )
Перед началом работы вы захотите принять к сведению характеристики вашего экземпляра Postgres, где возникают эти ошибки. Вы будете заинтересованы как в доступной оперативной памяти, так и в количестве поддерживаемых соединений.
Сделать больше work_mem
work_mem
Значение сообщает Postgres, сколько оперативной памяти позволить запросу потреблять, прежде чем начать писать промежуточные результаты в Временный диск Анкет Предоставление запросов на использование большего количества оперативной памяти — один из способов сокращения количества временного пространства, которое записано. Это должно быть сбалансировано с тем, сколько RAM потребляется в целом. work_mem
Значение, вероятно, устанавливается на дефолт 4 МБ
(4 мегабайта) — Если это не Анкет
Вы можете проверить это, запустив следующий запрос в PSQL
сеанс подключен к целевой базе данных:
> show work_mem; work_mem ---------- 4MB (1 row)
Вы можете начать с изменения его до немного более высокого значения. Слишком высоко И вы могли бы перевернуться от «из временного пространства» к «вне памяти». В зависимости от размера оперативной памяти и количества соединений, вы можете попробовать пойти куда -нибудь от 8 МБ или 16 МБ до 64 МБ. Это будет сильно зависеть от ваших данных и загрузки запросов, поэтому может потребоваться некоторая пробная и ошибка.
Вот как вы можете применить это изменение из PSQL
Сессия:
> alter databaseset work_mem = '16MB'; ALTER DATABASE
Это изменило базу данных, но это изменение будет применяться только к новым сеансам. Если вы проверете work_mem
Для существующего сеанса он будет выглядеть так, как будто он не изменился.
> show work_mem; work_mem ---------- 4MB (1 row)
Выйдите из этого PSQL
Запустите новое, чтобы снова проверить это значение. Теперь вы показываете, что это было обновлено до того, что было указано в alter
утверждение.
> show work_mem; work_mem --------------- 16MB (1 row)
В отличие от некоторых изменений конфигурации, это применяется немедленно к новым соединениям. Нет необходимости перезагрузить сервер Postgres. Это изменение будет сохраняться между перезапуску.
Итак, как вы выбираете правильное значение work_mem для вашей базы данных и ее загрузки запроса?
Немного грубой математики при выборе значения:
Если у вас 8 ГБ оперативной памяти, и вы ударите work_mem
до 16 МБ, тогда потребуется 512 соединений, все они выдвигают их work_mem
Пространство, чтобы вызвать ошибку вне памяти. Принимая во внимание, что если вы увеличили его до 64 МБ, то вы смотрите на ~ 128 соединений.
Опять же, это действительно грубые числа, а также не учитывают потребности базовых оперативных операций в экземпляре Postgres. Все это будет зависеть от нагрузки на запрос, который испытывает БД. В зависимости от того, как работает это изменение, вы можете внести дополнительные настройки вверх или вниз, чтобы набрать work_mem
ценность, которая имеет больше всего смысла.
Если вам нравится мое письмо, подумайте Присоединяюсь к моей бюллетене или следуя за мной на Твиттер .
Примечания
Если вы используете управляемую службу базы данных, такую как Heroku, настройка по умолчанию для вашего work_mem
Значение может зависеть от вашего плана. Например, стандартный план Heroku’s Standard 4 имеет по умолчанию work_mem
значение 110 МБ
. источник
Ресурсы и дальнейшее чтение
- В моем экземпляре Heroku Postgres не хватает временного пространства
- Настройка
work_mem
на Postgres - Postgresql Документы для
work_mem
- Понимание временных файлов в Postgres
- Как мы решили проблему хранения в PostgreSQL, не добавляя ни одного байта хранения
Обложка фото Харрисон Бродбент на Неспособный
Оригинал: «https://dev.to/jbranchaud/give-your-postgres-queries-more-memory-to-work-with-640»