메모리 오버커밋
메모리 오버커밋 (Memory overcommit)
메모리 오버커밋(Memory overcommit)은 쿼리 메모리 한도를 더 유연하게 설정할 수 있게 하려는 실험적 기법이에요. 여기서는 오버커밋 추적기(overcommit tracker)가 어떻게 동작하는지 설명해 드릴게요.
출처: 문서
본문
메모리 오버커밋은 쿼리가 사용할 수 있는 보장된 메모리 양을 나타내는 설정을 도입하는 기법이에요. 메모리 오버커밋이 활성화되어 있고 메모리 한도에 도달하면 ClickHouse는 가장 오버커밋된 쿼리를 선택해서 그 쿼리를 종료(kill)하는 방식으로 메모리를 확보하려고 해요.
메모리 한도에 도달하면 어떤 쿼리든 새 메모리를 할당하려는 시도에서 잠시 대기하게 돼요. 타임아웃이 지나기 전에 메모리가 확보되면 쿼리는 계속 실행되고, 그렇지 않으면 예외가 발생하면서 쿼리가 종료돼요.
쿼리를 중단하거나 종료할지 선택하는 작업은 어떤 메모리 한도에 도달했느냐에 따라 전역(global) 또는 사용자(user) 오버커밋 추적기가 수행해요. 오버커밋 추적기가 중단할 쿼리를 고르지 못하면 MEMORY_LIMIT_EXCEEDED 예외가 발생합니다.
사용자 오버커밋 추적기 (User overcommit tracker)
사용자 오버커밋 추적기는 사용자의 쿼리 목록에서 오버커밋 비율(overcommit ratio)이 가장 큰 쿼리를 찾아요. 쿼리의 오버커밋 비율은 할당된 바이트 수를 memory_overcommit_ratio_denominator_for_user 설정값으로 나눈 값으로 계산돼요.
쿼리의 memory_overcommit_ratio_denominator_for_user 값이 0이면 오버커밋 추적기는 그 쿼리를 선택하지 않아요. 대기 타임아웃은 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
전역 오버커밋 추적기 (Global overcommit tracker)
전역 오버커밋 추적기는 전체 쿼리 목록에서 오버커밋 비율이 가장 큰 쿼리를 찾아요. 이 경우 오버커밋 비율은 할당된 바이트 수를 memory_overcommit_ratio_denominator 설정값으로 나눈 값으로 계산돼요.
쿼리의 memory_overcommit_ratio_denominator 값이 0이면 오버커밋 추적기는 그 쿼리를 선택하지 않아요. 대기 타임아웃은 설정 파일의 memory_usage_overcommit_max_wait_microseconds 파라미터로 정해요.