MT_DOP(multi-threaded degree of parallelism)는 한 노드 안에서 쿼리 fragment 를 몇 개의 스레드로 나눠 실행할지 정하는 질의 옵션이다. 노드 간 병렬도가 아니라 노드 내 병렬도다.
SET MT_DOP=4;
기본값은 0 이다. 0 은 노드당 fragment instance 를 하나만 두는 기존 동작이다. 값을 올리면 스캔·집계·조인이 노드 안에서 나뉘어 돌아 응답 시간이 줄어들 수 있지만, CPU 와 메모리를 그만큼 더 쓴다.
주의할 점은 메모리다. MEM_LIMIT 은 노드당 한도인데 스레드가 늘면 버퍼도 함께 늘어난다. mt_dop 를 올린 뒤 메모리 부족이 나기 시작했다면 둘의 조합 때문이다.
COMPUTE STATS 같은 일부 내부 작업은 mt_dop 를 자체적으로 정해 쓴다.
Admission Control 은 실행 슬롯으로 동시성을 제한한다. impalad 의 admission_control_slots 플래그가 executor 당 슬롯 수이고, 쿼리 하나가 잡는 슬롯 수는 대체로 mt_dop 값을 따라간다. mt_dop=4 면 한 쿼리가 노드당 슬롯 4개를 점유하므로, 슬롯이 16개인 노드에서는 같은 성격의 쿼리 4개가 동시에 도는 셈이다.
플래그 값을 0(기본)으로 두면 impalad 가 호스트의 CPU 코어 수를 기준으로 슬롯 수를 계산한다. 설정값은 0 인데 웹 UI 나 프로파일에 16 으로 보이는 것은 이 자동 계산 결과다. 정확한 계산식은 버전에 따라 다르므로 사용하는 배포판 문서에서 확인한다.
슬롯이 모자라면 쿼리는 실패하지 않고 대기한다. 프로파일이나 대기 사유에 Not enough admission control slots available 이 보이면 동시성 한계에 걸린 것이다.
mt_dop 는 전역으로 올리지 않는다. 클러스터 기본값을 키우면 동시 실행 수가 줄어 전체 처리량이 떨어진다.
대화형 · 단일 사용자 분석 쿼리처럼 응답 시간이 중요한 세션에서만 2~4 정도로 올리고, 동시 사용자가 많은 BI 워크로드는 기본값으로 둔다. 배치는 애초에 노드 간 병렬도로 처리하므로 mt_dop 를 올릴 이유가 적다.
값을 바꾼 뒤에는 쿼리 프로파일에서 Peak Memory Usage 와 실제 실행 시간을 함께 본다. 시간이 줄지 않고 메모리만 늘었다면 병목이 CPU 가 아니라 I/O 나 네트워크라는 뜻이다.