Postgresql 8.3: ограничение потребления ресурсов на запрос

12

Я использую PostgreSQL 8.3 + PostGIS 1.3 для хранения геопространственных данных в Ubuntu 8.04 Hardy .

Эта конкретная версия PostGIS имеет ошибку при вычислении buffer()очень сложных сегментов, в результате чего запрос занимает все больше и больше памяти, пока вся машина не застрянет.

Я ищу механизм PostgreSQL, который может:

  • Ограничьте потребление памяти (и, возможно, других ресурсов), используемых конкретным запросом.
  • Автоматически останавливать запросы, время выполнения которых превышает определенный порог.

Есть идеи?

Адам Матан
источник
Почему вы продолжаете использовать версию с ошибкой, которая вас кусает? Используйте исправленную версию, и ваша проблема исчезла.
Фрэнк Хайкенс
Правда, но иногда в нашем коде есть ошибки или просто запросы, которые занимают слишком много времени. Я хочу, чтобы они умерли с сообщением об ошибке журнала.
Адам Матан

Ответы:

9

Чтобы ограничить потребление памяти, основным параметром конфигурации является work_mem. Поскольку это применимо к каждой операции, а не к запросу, вы не можете просто установить его на N, если хотите потратить N памяти, но вам нужно немного его настроить и настроить, чтобы получить желаемый результат.

Это не помогает, однако, в случае ошибок и других утечек памяти в коде или расширениях сервера. Вы можете контролировать это с помощью ограничений ресурсов, специфичных для процесса ulimit. Но если вы достигнете предела и произойдет сбой выделения памяти, что вы хотите, чтобы произошло? Это, вероятно, не будет вести себя слишком хорошо. Лучше исправить эти ошибки или использовать другую версию.

Остановите запросы, время выполнения которых превысило пороговое значение, используйте параметр Statement_timeout, например:

SET statement_timeout TO '10min';
Питер Айзентраут
источник
Отлично. Как раз то, что я искал.
Адам Матан
2

Посмотрите на Postgres Wiki :

PostgreSQL не имеет средств для ограничения ресурсов, которые потребляет конкретный пользователь, запрос или база данных, или, соответственно, для установки приоритетов, так что один пользователь / запрос / база данных получает больше ресурсов, чем другие. Необходимо использовать средства операционной системы, чтобы добиться того, что ограниченная расстановка приоритетов возможна.

Вы можете настроить параметры производительности для каждого пользователя или базы данных, но не для отмены определенных запросов.

DrColossos
источник
+1 Как насчет установки максимального объема памяти, который может использовать весь кластер?
Адам Матан