concurrent_threads_* 서버 설정
concurrent_threads_* 서버 설정
이 페이지에서는 CPU 슬롯을 쿼리에 할당하는 방식과 동시 실행 쿼리에 허용되는 처리 스레드 수를 제어하는 concurrent_threads_* 계열 서버 설정을 설명할게요.
출처: 문서
본문
이 설정들은 ClickHouse 서버를 구성하며, ClickHouse 소스에서 자동으로 생성돼요.
concurrent_threads_lazy_allocation
CPU 슬롯이 쿼리에 할당되는 방식을 제어해요. true(기본값)이면 쿼리가 하나의 CPU 슬롯으로 시작하고, 파이프라인이 실제로 더 많은 병렬화 가능한 작업을 밀어낼 때만 스케줄러에 추가 슬롯을 요청해요. 이는 쿼리가 최대 max_threads 슬롯을 예약하지만 실제로는 그 일부만 사용하여 다른 동시 쿼리를 기아 상태로 만드는 상황을 피해요. 동시성 제어와 워크로드용 선점형(preemptive) CPU 스케줄러 모두에 적용돼요. false이면 쿼리가 시작 시 모든 max_threads 슬롯을 미리 요청해요.
concurrent_threads_scheduler
concurrent_threads_soft_limit_num와 concurrent_threads_soft_limit_ratio_to_cores로 지정된 CPU 슬롯의 스케줄링 수행 정책이에요. 제한된 수의 CPU 슬롯을 동시 쿼리 간에 어떻게 분배할지 관리하는 알고리즘이에요. 스케줄러는 서버 재시작 없이 런타임에 변경할 수 있어요.
가능한 값:
round_robin—use_concurrency_control= 1인 모든 쿼리가 최대max_threadsCPU 슬롯을 할당받아요. 스레드당 슬롯 하나예요. 경합 시 CPU 슬롯은 라운드 로빈으로 쿼리에 부여돼요. 첫 번째 슬롯은 무조건 부여되므로,max_threads= 1인 쿼리가 많을 때max_threads가 큰 쿼리가 불공정해지고 지연이 증가할 수 있어요.fair_round_robin—use_concurrency_control= 1인 모든 쿼리가 최대max_threads - 1CPU 슬롯을 할당받아요. 모든 쿼리의 첫 번째 스레드에 CPU 슬롯을 요구하지 않는round_robin의 변형이에요. 이렇게 하면max_threads= 1인 쿼리는 슬롯이 필요하지 않으며 모든 슬롯을 불공정하게 할당할 수 없어요. 무조건 부여되는 슬롯이 없어요.max_min_fair—use_concurrency_control= 1인 모든 쿼리가 최대max_threads - 1CPU 슬롯을 할당받아요.fair_round_robin과 유사하지만, 해제된 슬롯은 항상 현재 할당된 슬롯 수가 최소인 쿼리에 부여돼요. 이는 많은 쿼리가 제한된 CPU 슬롯을 두고 경쟁하는 높은 초과 구독(oversubscription) 상황에서 더 나은 공정성을 제공해요. 짧게 실행되는 쿼리는 시간이 지나면서 더 많은 슬롯을 축적한 오래 실행되는 쿼리 때문에 불이익을 받지 않아요.
concurrent_threads_soft_limit_num
모든 쿼리에서 실행이 허용되는 최대 쿼리 처리 스레드 수(원격 서버에서 데이터를 가져오는 스레드는 제외)예요. 이는 하드 제한이 아니에요. 제한에 도달하면 쿼리는 여전히 실행할 스레드를 하나 이상 얻어요. 실행 중 더 많은 스레드를 사용할 수 있게 되면 쿼리는 원하는 스레드 수로 증가(upscale)할 수 있어요.
값 0(기본값)은 무제한을 의미해요.
concurrent_threads_soft_limit_ratio_to_cores
concurrent_threads_soft_limit_num과 동일하지만 코어에 대한 비율로 표현해요.