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

Оверкоммит памяти (memory overcommit)

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

Идея этого механизма состоит во введении настроек, которые задают гарантированный объём памяти, доступный запросу. Когда оверкоммит памяти включён и лимит памяти достигнут, 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 в конфигурационном файле.