자동 쿼리 킬링을 통한 OOM 보호
자동 쿼리 킬링을 통한 OOM 보호 (OOM Protection using Automatic Query Killing)
쿼리 실행으로 인한 서버 메모리 부족(OOM)을 자동 쿼리 킬링으로 방지하는 방법을 안내해요.
출처: 문서
본문
개요 (Overview)
쿼리가 너무 많은 중간 결과를 메모리에 유지하면 서버가 OOM(OutOfMemory)에 빠질 수 있어요. 특히 MMAP 모드의 서버는 쿼리 실행 중 생성되는 중간 결과가 off-heap/direct 메모리를 많이 소모할 수 있어요. Pinot은 쿼리 실행 중 메모리 사용을 추적하고, 설정된 임계값을 초과하면 쿼리를 자동으로 종료(kill)해 서버의 안정성을 보호해요.
동작 방식 (How it works)
서버는 각 쿼리가 사용하는 메모리(오퍼레이터가 보관하는 중간 결과)를 추적해요. 사용량이 임계값을 초과하면 서버가 해당 쿼리를 중단하고 메모리를 회수해요. 이를 통해 악성·과도한 쿼리가 서버를 죽이거나 클러스터 전체에 장애를 일으키는 것을 방지해요.
쿼리 킬링 구성 (Query killing config)
메모리 추적과 자동 쿼리 킬링을 활성화·제어하는 구성은 서버 구성에서 설정할 수 있어요. 관련 구성에는 메모리 추적 활성화 여부, 임계값(바이트/비율), 쿼리 시간 제한 등이 포함돼요.
감지 경고 (Detection and alerting)
보호 장치가 작동하면 서버가 쿼리를 종료하고, 관련 지표(예: PINOT_QUERY_KILLED_COUNT)를 증가시켜요. 종료된 쿼리 수를 모니터링하면 과도한 메모리 사용 쿼리를 식별하고 인덱싱이나 쿼리를 개선할 수 있어요.
모범 사례 (Best practices)
- 임계값을 서버의 사용 가능한 메모리에 맞게 설정하세요. 너무 낮으면 정상 쿼리까지 종료될 수 있어요.
- OOM 보호는 마지막 방어선이에요. 근본적으로는 쿼리 패턴 개선과 인덱스 최적화가 우선이에요.
- 스타트리 인덱스나 세그먼트 프루닝으로 대형 쿼리의 메모리 사용을 줄이세요.