핵심 요약
토스는 StarRocks의 Resource Group과 CPU 우선순위 설계를 도입해 멀티테넌트 워크로드를 격리하고, Docker 환경에서 cpuset/bind_cpus/cpu_borrowing 체인을 적용해 SLA를 보호한 운영 사례를 공유한다.
구현 방법
- 워크로드 분류와 CPU 우선순위 설계: cpu_weight 기본값으로 경합 시 비율 분배, 필요 시 exclusive_cpu_cores로 하드 격리하고 DriverExecutor/ScanExecutor/ConnectorScanExecutor의 3벌 ThreadPool을 분리 운영한다.
- Classifier와 Docker 기반 운영: 쿼리를 user/db 기반으로 매칭하는 Classifier를 도입하고, Docker에서 cpuset_cpus, cpus, cpu_borrowing 체인을 구성하며 Ansible 템플릿으로 배포한다.
- 메모리/쿼리 제어 및 모니터링: mem_limit과 spill_mem_limit_threshold로 메모리 제어, big_query 제한으로 급격한 쿼리 폭주를 차단한다. AuditLoader로 쿼리 이력을 Kafka로 수집해 Grafana로 모니터링한다.
주요 결과
- SLA 보호 및 응답 시간 안정화: shopping_service에 exclusive_cpu_cores 도입 후 서비스 쿼리 응답 편차가 줄어들고, 24h 서비스 클러스터 약 69 qps, 1주 약 87 qps로 나타났으며, 모니터링/배치형 클러스터는 24h 약 20 qps를 처리했다.
- Borrowing의 효과와 한계: idle 시 다른 그룹이 코어를 빌려 쓸 수 있지만, Docker의 cpuset 설정과 bind_cpus 활성 여부에 따라 실제 동작이 달라진다. 특정 상황에서 yield 타임이 달라져 주의가 필요하다.
- 메모리 경합 관리의 중요성: mem_limit 합계가 100%를 초과할 수 있어 spill이 발생할 수 있으며, mem_pool 도입 시 합계 관리 부담을 줄일 수 있다.


