Postgres устанавливает верхний предел для использования ресурсов запроса - PullRequest
0 голосов
/ 19 мая 2018

Мне интересно, возможно ли при отправке запросов к базе данных postgres установить верхнюю границу для различных системных ресурсов, которые он может потреблять.

Например, «X Query может использовать до,но не более, 40% ЦП в любой точке его выполнения. "

Аналогично для памяти, постоянного ввода-вывода и т. д.

Рассматриваемый здесь вариант использования предотвращает мошенничествозапрос некоторого подмножества пользователей БД о полной блокировке ресурсов машины / БД от других пользователей, будь то из-за того, что план запроса оказался неэффективным, или объемы используемых данных значительно отличаются для некоторых параметров запроса.

Я предполагаю, что есть причины, почему это невозможно / жизнеспособно, и если это так, я был бы признателен за понимание, почему.

1 Ответ

0 голосов
/ 19 мая 2018

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

Есть паранастроек, temp_buffers и work_mem, которые устанавливают некоторые ограничения на некоторые типы использования памяти.Из руководства:

temp_buffers (integer)

Устанавливает максимальное количество временных буферов, используемых каждым сеансом базы данных.Это локальные буферы сеанса, используемые только для доступа к временным таблицам.По умолчанию используется восемь мегабайт (8 МБ).Параметр может быть изменен в отдельных сеансах, но только перед первым использованием временных таблиц в сеансе;последующие попытки изменить значение не будут влиять на этот сеанс.

Сеанс будет распределять временные буферы по мере необходимости до предела, заданного temp_buffers.Стоимость установки большого значения в сеансах, которым на самом деле не требуется много временных буферов, составляет всего лишь дескриптор буфера, или около 64 байтов, за приращение в temp_buffers.Однако, если буфер фактически используется, для него будут использованы дополнительные 8192 байта (или, как правило, байты BLCKSZ).

work_mem (целое число)

Указывает количествопамяти для внутренних операций сортировки и хеш-таблиц перед записью во временные файлы на диске.Значение по умолчанию составляет четыре мегабайта (4 МБ).Обратите внимание, что для сложного запроса несколько операций сортировки или хеширования могут выполняться параллельно;каждой операции будет разрешено использовать столько памяти, сколько указано в этом значении, прежде чем она начнет записывать данные во временные файлы.Кроме того, несколько запущенных сеансов могут выполнять такие операции одновременно.Следовательно, общая используемая память может многократно превышать значение work_mem;этот факт необходимо учитывать при выборе значения.Операции сортировки используются для ORDER BY, DISTINCT и объединений слиянием.Хеш-таблицы используются в хеш-соединениях, агрегировании на основе хеша и обработке подзапросов IN на основе хеш-функции.

Вы также можете ограничить количество соединений, которые пользователь может установить одновременно, изменив роль этого пользователя.:

ALTER USER user_name WITH CONNECTION LIMIT 2;

Это может помочь ограничить количество процессов, которые пользователь может запускать одновременно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...