Перейти к основному содержимому
Перейти к основному содержимому

Переувеличение памяти

Переувеличение памяти — это экспериментальная техника, предназначенная для установки более гибких ограничений памяти для запросов.

Идея этой техники заключается в введении настроек, которые могут представлять гарантированное количество памяти, которую может использовать запрос. Когда переувеличение памяти включено и достигнуто ограничение по памяти, ClickHouse выберет запрос с наибольшим переувеличением и попытается освободить память, остановив этот запрос.

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

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

Пользовательский трекер переувеличения

Пользовательский трекер переувеличения находит запрос с наибольшим коэффициентом переувеличения в списке запросов пользователя. Коэффициент переувеличения для запроса вычисляется как количество выделенных байтов, делённое на значение настройки memory_overcommit_ratio_denominator_for_user.

Если memory_overcommit_ratio_denominator_for_user для запроса равен нулю, трекер переувеличения не выберет этот запрос.

Таймаут ожидания устанавливается настройкой memory_usage_overcommit_max_wait_microseconds.

Пример

SELECT number FROM numbers(1000) GROUP BY number SETTINGS memory_overcommit_ratio_denominator_for_user=4000, memory_usage_overcommit_max_wait_microseconds=500

Глобальный трекер переувеличения

Глобальный трекер переувеличения находит запрос с наибольшим коэффициентом переувеличения в списке всех запросов. В этом случае коэффициент переувеличения вычисляется как количество выделенных байтов, делённое на значение настройки memory_overcommit_ratio_denominator.

Если memory_overcommit_ratio_denominator для запроса равен нулю, трекер переувеличения не выберет этот запрос.

Таймаут ожидания устанавливается параметром memory_usage_overcommit_max_wait_microseconds в файле конфигурации.