psql_resources_consumption_limits. Контроль потребления ресурсов#
В исходном дистрибутиве установлено по умолчанию: нет.
Связанные компоненты: отсутствуют.
Схема размещения:
ext.
Контроль потребления ресурсов БД (оперативная память и ЦП) - функциональность, которая реализована в виде расширения psql_resources_consumption_limits, позволяет ограничивать потребление ресурсов: оперативной памяти и ЦПУ, с помощью процессов СУБД. Входит в состав поставки Enterprise.
Внимание!
Процессы расширений ограничены в соответствии с установленными лимитами (включая задания
pg_cronи т.п.).
В Pangolin поддерживается:
функциональность фиксированного задания ограничений ресурсов для процессов сессий СУБД;
завершение с ошибкой сессии, превысившей ограничение на потребление ресурса, и всех ее подпроцессов;
обнаружение превышения квоты на ресурсы асинхронно.
Примечание:
Управление ограничениями на уровне отдельной сессии не поддерживается.
Подробнее с функциональностью «Контроль потребления ресурсов БД» можно ознакомиться в одноименном разделе документа «Руководство администратора».
Доработка#
Доработка не проводилась.
Ограничения#
Ограничения отсутствуют.
Установка#
Для установки расширения и включения функциональности контроля потребления ресурсов выполните шаги:
Добавьте имя библиотеки расширения в параметр
shared_preload_librariesконфигурационного файлаpostgresql.conf/postgres.yml:shared_preload_libraries = 'psql_resources_consumption_limits'Перечитайте конфигурацию и перезагрузите кластер:
pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml reload clustername pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml restart clusternameВыполните команду по добавлению расширения (для создания представления мониторинга):
CREATE EXTENSION psql_resources_consumption_limits;
Примечание:
Необходимо учесть увеличение
background workerна единицу, и увеличить лимитbackground worker.
Отключение функциональности#
Для отключения функциональности:
Выполните команду по удалению расширения:
DROP EXTENSION psql_resources_consumption_limits;Удалите имя библиотеки расширения из параметра
shared_preload_librariesконфигурационного файлаpostgresql.conf/postgres.yml:shared_preload_libraries = 'psql_resources_consumption_limits'Перезагрузите кластер:
restart --force && reload --force
Примечание:
Если требуется временное отключение функциональности для всех ролей, без удаления расширения, то это возможно сделать, установив параметр
psql_resources_consumption_limits.check_intervalв нулевое значение.
Настройка#
Настройка фиксированных ограничений функциональности задается параметрами, перед каждым параметром указывается имя расширения через точку.
Пример:
psql_resources_consumption_limits.check_interval
mem_limit- ограничение на суммарное потребление оперативной памяти одной сессией;Задается в килобайтах kB (kilobytes), мегабайтах MB (megabytes), гигабайтах GB (gigabytes), терабайтах TB (terabytes), без указания единиц — килобайты.
Допускаются только положительные целочисленные значения. При указании отрицательного значения или лимита, превышающего физическую память КТС (параметр
MemTotalв файле/proc/meminfo), Pangolin не запускается с выводом ошибки о недопустимом значении или превышении лимита. Если задано нулевое значение, то контроль за потреблением оперативной памяти отключен. По умолчанию лимит равен нулю (контроль отключен).cpu_limit- ограничение на процент потребления ядер CPU всеми процессами одной сессии;Задается в процентах.
Допускаются положительные целочисленные значения. При указании отрицательного значения или лимита превышающего количество ядер CPU КТС, умноженных на 100, Pangolin не запускается с выводом ошибки о невалидном значении или превышении лимита. Если задано нулевое значение, то контроль за потреблением CPU отключен. По умолчанию лимит равен нулю (контроль отключен).
Допускаются значения больше 100, например, 350, что означает: «потребление CPU всеми процессами сессии не может превысить 3.5 ядер»».
mem_exceeding_reaction- реакция на превышение лимита потребления оперативной памяти:terminate(значение по умолчанию) - прерывание всех процессов сессии с выводом сообщения в лог;alert- вывод сообщения в лог о превышении лимита;
cpu_exceeding_reaction- реакция на превышение лимита потребления CPU:terminate(значение по умолчанию) - прерывание всех процессов сессии с выводом сообщения в лог;alert- вывод сообщения в лог о превышении лимита;
alert_log_level- уровень лога для реакций alert на превышения лимитов. Принимает значения:debug5;debug4;debug3;debug2;debug1;debug;info;notice;log;warning(значение по умолчанию);
Примечание:
При установке
mem_exceeding_reaction,cpu_exceeding_reactionиalert_log_levelв значения, отличные от допустимых, выводится предупреждение о невалидности параметра, и используется значение по умолчанию.
alert_timeout- время ожидания для повторного вывода сообщения в лог (задается в единицах времени);Отрицательные значения не допускаются, максимальное значение - 1 час. Если процесс продолжает выполняться после превышения лимита (реакция на превышение лимита - вывод сообщения в лог), то следующее сообщение о его превышении появится не раньше, чем через установленный тайм-аут. Если установлено нулевое значение, то сообщения выводятся на каждое превышение лимита. Значение по умолчанию - 1 секунда. При указании отрицательного значения или значения, превышающего 1 час, выводится предупреждение о невалидном параметре и используется значение по умолчанию.
check_interval- интервал контроля превышения.Задается во временных единицах. Отрицательные значения не допускаются, максимальное значение – 5 минут. Если задано нулевое значение, то контроль за потреблением оперативной памяти и CPU отключен. Значение по умолчанию – 30 с. Если задано значение отличное от нуля и включен контроль хотя бы за одним из ресурсов, то процесс будет периодически запускаться с заданным интервалом времени и проверять превышение лимитов.
Параметры можно изменять без перезапуска сервера.
Установка параметров для роли#
Параметры (кроме интервала контроля) могут быть заданы суперпользователем отдельно для каждой роли через ALTER ROLE ... SET name=value;. В этом случае реакция на их превышение и лимиты сессий в рамках данной роли будут проверяться с учетом этих параметров. Как и при определении соответствующих параметров в конфигурации сервера, ограничение будет применяться к каждой из сессий по отдельности. В каждой из сессий значение параметра для роли переопределяет общее значение. Контроль суммарного потребления ресурсов всеми пользовательскими сессиями не выполняется.
Использование модуля#
Примечание
Примеры использования представлены для конфигурации standalone-patroni-pgbouncer.
Подготовительные действия#
В конфигурационном файле /etc/patroni/postgres.yml:
Отключите парольные политики:
password_policies_enable: offДобавьте расширение
psql_resources_consumption_limitsдля включения функциональности контроля ресурсов:shared_preload_libraries = 'psql_resources_consumption_limits'Настройте период проверки лимитов:
psql_resources_consumption_limits.check_interval: 100msДобавьте тестовых пользователей в конфигурационный файл
pg_hba.conf:host all u1 {IP-address}/{port} trust host all u2 {IP-address}/{port} trust host all u3 {IP-address}/{port} trustРазрешите тестовым пользователям авторизовываться без пароля:
enabled_extra_auth_methods: trustПеречитайте конфигурацию на кластере:
restart --force && reload --force
Далее произведите действия от имени администратора базы данных:
Создайте тестовые роли:
CREATE USER u1 WITH PASSWORD 'u1'; CREATE USER u2 WITH PASSWORD 'u2'; CREATE USER u3 WITH PASSWORD 'u3';Создайте расширения контроля потребления ресурсов:
CREATE EXTENSION psql_resources_consumption_limits;Создайте расширения
pg_background:CREATE EXTENSION pg_background;Разрешите тестовым пользователям использовать расширение
pg_background:GRANT EXECUTE ON FUNCTION pg_background_launch TO u1; GRANT EXECUTE ON FUNCTION pg_background_result TO u1; GRANT EXECUTE ON FUNCTION pg_background_launch TO u2; GRANT EXECUTE ON FUNCTION pg_background_result TO u2; GRANT EXECUTE ON FUNCTION pg_background_launch TO u3; GRANT EXECUTE ON FUNCTION pg_background_result TO u3;Разрешите тестовым пользователям использовать функции из схемы
public:GRANT USAGE ON SCHEMA public TO u1; GRANT USAGE ON SCHEMA public TO u2; GRANT USAGE ON SCHEMA public TO u3;
Тестовые запросы#
С использованием pg_background (не блокирующий консоль)#
Тестовый запрос, потребляющий память:
SELECT * FROM public.pg_background_launch('
do $$
declare
i int[] := ''{1}'';
begin
for counter in 1..23 loop
i := i || i;
end loop;
PERFORM pg_sleep(600);
end $$;
');
Тестовый запрос, потребляющий процессорное время:
SELECT * FROM public.pg_background_launch('
do $$
begin
while true loop
end loop;
end $$;
');
Тестовый запрос, потребляющий минимальный объем ресурсов:
SELECT * FROM public.pg_background_launch('
do $$
begin
PERFORM pg_sleep(600);
end $$;
');
Без использования pg_background (блокирующий консоль)#
Тестовый запрос, потребляющий память:
do $$
declare
i int[] := '{1}';
begin
for counter in 1..23 loop
i := i || i;
end loop;
PERFORM pg_sleep(600);
end $$;
Тестовый запрос, потребляющий процессорное время:
do $$
begin
while true loop
end loop;
end $$;
Тестовый запрос, потребляющий минимальный объем ресурсов:
do $$
begin
PERFORM pg_sleep(600);
end $$;
Сценарии использования#
Подсказка
При выключенных лимитах потребления в конфигурации и сброшенных настройках лимитов для ролей контроль за потреблением ресурсов не осуществляется. При включенных лимитах потребления в конфигурации, но выключенных лимитах для ролей контроль за потреблением ресурсов не осуществляется (настройки роли имеют высший приоритет).
При включенных лимитах потребления в конфигурации и сброшенных настройках лимитов для ролей осуществляется контроль за потреблением ресурсов#
При установке значения terminate для реакций на превышения памяти/процессора запросы будут остановлены досрочно, в логах будет информация о нарушении лимитов.
Включите лимиты потребления ресурсов и установите значение
terminateдля реакций на превышения памяти и процессора в конфигурации:psql_resources_consumption_limits.mem_limit: 32768 psql_resources_consumption_limits.cpu_limit: 50 psql_resources_consumption_limits.mem_exceeding_reaction: terminate psql_resources_consumption_limits.cpu_exceeding_reaction: terminateПеречитайте конфигурацию:
restart --force && reload --forceЛимиты потребления ресурсов включены в конфигурации. Конфигурация перечитана:
Success: restart on member <clustername>Сбросьте настройки лимитов потребления ресурсов для всех тестовых ролей:
ALTER USER u1 RESET psql_resources_consumption_limits.mem_limit; ALTER USER u1 RESET psql_resources_consumption_limits.cpu_limit; ALTER USER u1 RESET psql_resources_consumption_limits.mem_exceeding_reaction; ALTER USER u1 RESET psql_resources_consumption_limits.cpu_exceeding_reaction; ALTER USER u2 RESET psql_resources_consumption_limits.mem_limit; ALTER USER u2 RESET psql_resources_consumption_limits.cpu_limit; ALTER USER u2 RESET psql_resources_consumption_limits.mem_exceeding_reaction; ALTER USER u2 RESET psql_resources_consumption_limits.cpu_exceeding_reaction;Настройки тестовых ролей сброшены:
ALTER ROLEВыполните нагрузочные запросы от имени тестовых ролей:
От имени
u1, запрос, потребляющий память:psql -U u1От имени
u2, запрос, потребляющий процессорное время:psql -U u2
Запущены
pg_backgroundпроцессы:pg_background_launch ---------------------- PID (1 row)Проверьте, что запросы не выполняются, процессов не существует:
ps aux | grep PID | grep -v grepИдентификаторы процессов не найдены в системе.
Проверьте, что в логах базы присутствуют сообщения о превышении лимитов для всех нагрузочных запросов:
pglog | grep 'Terminate process' pglog | grep 'has violated the memory limit' pglog | grep 'has violated the cpu limit'Найдены логи о превышении лимитов. Пример вывода:
2023-10-22 12:36:46 MSK [5010]: [7-1] app=psql_resources_consumption_limits checker,user=postgres,db=postgres,client=[bgworker],type=psql_resources_consumption_limits checker WARNING: Terminate process 5055 2023-10-22 12:36:46 MSK [5010]: [4-1] app=psql_resources_consumption_limits checker,user=postgres,db=postgres,client=[bgworker],type=psql_resources_consumption_limits checker WARNING: The process 5043 memory consumption 110736 (session 110736) has violated the memory limit 32768 2023-10-22 12:36:46 MSK [5010]: [6-1] app=psql_resources_consumption_limits checker,user=postgres,db=postgres,client=[bgworker],type=psql_resources_consumption_limits checker WARNING: The process 5055 memory consumption 95460 (session 110736) has violated the memory limit 32768 2023-10-22 12:37:00 MSK [5010]: [8-1] app=psql_resources_consumption_limits checker,user=postgres,db=postgres,client=[bgworker],type=psql_resources_consumption_limits checker WARNING: The process 5072 cpu consumption 99 (session 99) has violated the cpu limit 50 2023-10-22 12:37:00 MSK [5010]: [10-1] app=psql_resources_consumption_limits checker,user=postgres,db=postgres,client=[bgworker],type=psql_resources_consumption_limits checker WARNING: The process 5076 cpu consumption 99 (session 99) has violated the cpu limit 50
При установке значения alert для реакций на превышения памяти/процессора запросы не будут остановлены досрочно, но в логах будет информация о нарушении лимитов.
Включите лимиты потребления ресурсов и установить значение
alertдля реакций на превышения памяти и процессора в конфигурации:psql_resources_consumption_limits.mem_limit: 32768 psql_resources_consumption_limits.cpu_limit: 50 psql_resources_consumption_limits.mem_exceeding_reaction: alert psql_resources_consumption_limits.cpu_exceeding_reaction: alertПеречитайте конфигурацию:
restart --force && reload --forceЛимиты потребления ресурсов включены в конфигурации. Конфигурация перечитана:
Success: restart on member <clustername>Сбросьте настройки лимитов потребления ресурсов для всех тестовых ролей:
ALTER USER u1 RESET psql_resources_consumption_limits.mem_limit; ALTER USER u1 RESET psql_resources_consumption_limits.cpu_limit; ALTER USER u1 RESET psql_resources_consumption_limits.mem_exceeding_reaction; ALTER USER u1 RESET psql_resources_consumption_limits.cpu_exceeding_reaction; ALTER USER u2 RESET psql_resources_consumption_limits.mem_limit; ALTER USER u2 RESET psql_resources_consumption_limits.cpu_limit; ALTER USER u2 RESET psql_resources_consumption_limits.mem_exceeding_reaction; ALTER USER u2 RESET psql_resources_consumption_limits.cpu_exceeding_reaction;Настройки тестовых ролей сброшены:
ALTER ROLEВыполните нагрузочные запросы от имени тестовых ролей:
От имени
u1, запрос, потребляющий память:psql -U u1От имени
u2, запрос, потребляющий процессорное время:psql -U u2
Запущены
pg_backgroundпроцессы:pg_background_launch ---------------------- PID (1 row)Проверьте, что запросы выполняются, процессы существуют:
ps aux | grep PID | grep -v grepИдентификаторы процессов существуют в системе. Пример вывода:
postgres 6344 100 0.0 4883224 12760 ? Rs 12:53 0:35 postgres: clustername: pg_background by PID 6339 DOПроверьте, что в логах базы присутствуют сообщения о превышении лимитов для всех нагрузочных запросов:
pglog | grep 'has violated the memory limit' pglog | grep 'has violated the cpu limit'Но нет сообщений об остановке процессов:
pglog | grep 'Terminate process'Найдены логи о превышении лимитов. Пример вывода:
2023-10-22 12:55:00 MSK [6285]: [2171-1] app=psql_resources_consumption_limits checker,user=postgres,db=postgres,client=[bgworker],type=psql_resources_consumption_limits checker WARNING: The process 6324 memory consumption 46480 (session 46480) has violated the memory limit 32768 2023-10-22 12:55:17 MSK [6285]: [2496-1] app=psql_resources_consumption_limits checker,user=postgres,db=postgres,client=[bgworker],type=psql_resources_consumption_limits checker WARNING: The process 6344 cpu consumption 99 (session 99) has violated the cpu limit 50Сообщения об остановке процессов отсутствуют.
Остановите нагрузочные запросы:
kill -SIGTERM PIDПроцесс остановлен, вывод команд не содержит ошибок.