Sangwon
07/09/2026, 8:20 AMRocky
07/09/2026, 8:20 AMsql
-- 모든 자원 그룹과 연결된 분류기(Classifier) 확인
SHOW RESOURCE GROUPS ALL;
* cpu_weight: 해당 그룹의 CPU 사용 비중 (상대적 값)
* mem_limit: 해당 그룹이 사용할 수 있는 최대 메모리 퍼센트 (%)
* concurrency_limit: 최대 동시 쿼리 수
* classifiers: 어떤 조건(사용자, 역할, DB 등)일 때 이 그룹에 할당되는지 보여주는 조건 리스트
2. 현재 실시간 자원 사용량 확인 (v3.1.4 이상)
각 자원 그룹이 현재 실제로 어느 정도의 CPU와 메모리를 사용 중인지 확인하려면 다음 명령어를 사용합니다.
sql
SHOW USAGE RESOURCE GROUPS;
* BEInUseCpuCores: 해당 BE 노드에서 사용 중인 예상 CPU 코어 수
* BEInUseMemBytes: 사용 중인 메모리 양
* BERunningQueries: 현재 실행 중인 쿼리 수
3. 워크로드별 할당 방식 (Stream Load 포함)
자원 그룹은 *분류기(Classifier)*를 통해 워크로드를 할당합니다. query, streamload 등을 특정 자원 그룹에 넣고 싶다면, 보통 *사용자(User)*나 *역할(Role)*을 기준으로 구분합니다.
* Stream Load: Stream Load를 실행하는 계정(User)을 특정 자원 그룹에 할당된 분류기에 등록하면, 해당 계정으로 들어오는 모든 로딩 작업은 설정된 자원 제한을 따르게 됩니다.
* 기본 그룹: 별도의 설정을 하지 않았다면 모든 작업은 default_wg 그룹에서 실행됩니다.
참고: 설정 변경 방법
만약 특정 그룹의 메모리 제한을 변경하고 싶다면 다음과 같이 수정할 수 있습니다.
sql
ALTER RESOURCE GROUP rg1 WITH (
'mem_limit' = '20%' -- 메모리 사용량을 20%로 제한
);
더 자세한 분석이 필요하다면 information_schema.resource_groups 테이블을 쿼리하여 상세 정보를 조회할 수도 있습니다.
References
• administration/management/resource_management/resource_group.md
• sql-reference/sql-statements/cluster-management/resource_group/SHOW_RESOURCE_GROUP.md
• sql-reference/sql-statements/cluster-management/resource_group/SHOW_USAGE_RESOURCE_GROUPS.mdSangwon
07/09/2026, 8:23 AMRocky
07/09/2026, 8:23 AMdefault_wg (Default Workload Group):
* *일반적인 모든 쿼리와 Stream Load가 사용하는 그룹*입니다.
* 별도로 자원 그룹을 만들어서 사용자나 역할을 할당하지 않았다면, 사용자가 실행하는 모든 SELECT, INSERT, STREAM LOAD 작업은 이 그룹의 자원 제한을 받습니다.
* default_mv_wg (Default Materialized View Workload Group):
* 비동기 구체화 뷰(Asynchronous Materialized View)의 새로고침(Refresh) 작업 전용 그룹입니다.
* 일반 쿼리나 로딩 작업은 이 그룹을 사용하지 않습니다.
2. 현재 설정값 해석하기
SHOW RESOURCE GROUPS ALL; 결과에서 다음 항목들을 중점적으로 보시면 됩니다.
* cpu_weight: 전체 CPU 자원 중 이 그룹이 차지하는 상대적 비중입니다. 만약 `default_wg`가 10이고 다른 그룹이 10이라면 CPU를 5:5로 나눠 씁니다.
* mem_limit: 이 그룹이 사용할 수 있는 전체 BE 메모리의 백분율(%)입니다.
* 예: `default_wg`의 `mem_limit`이 `100%`라면 BE가 가진 가용한 메모리 전체를 쓸 수 있다는 뜻입니다.
* concurrency_limit: 해당 그룹에서 동시에 실행될 수 있는 최대 쿼리 수입니다. `0`은 제한이 없음을 의미합니다.
3. Stream Load와 Query를 분리하고 싶다면?
현재는 모두 `default_wg`에서 돌아가고 있을 텐데, 만약 *Stream Load가 너무 많은 자원을 써서 조회(Query)가 느려지는 것을 방지*하고 싶다면 다음과 같이 별도 그룹을 만들어 관리할 수 있습니다.
1. 로딩 전용 그룹 생성:
sql
CREATE RESOURCE GROUP load_wg
TO (user='load_user') -- 로딩 전용 계정을 지정
WITH (
"cpu_weight" = "10",
"mem_limit" = "30%" -- 로딩은 메모리 30%까지만 사용하도록 제한
);
2. 이렇게 설정하면 load_user 계정으로 수행되는 모든 `Stream Load`는 전체 자원의 일부만 사용하게 되어, 나머지 자원을 일반 사용자의 쿼리(default_wg)가 안정적으로 사용할 수 있게 됩니다.
결론적으로, 현재 별다른 설정을 하지 않으셨다면 *모든 쿼리와 Stream Load는 `default_wg`의 설정값(보통 CPU 가중치 최대, 메모리 100%)을 공유*하고 있는 상태입니다.
References
• administration/management/resource_management/resource_group.md
• faq/resource_isolation_faq.md
• sql-reference/sql-statements/cluster-management/resource_group/SHOW_RESOURCE_GROUP.md
-GROUP)
_GROUP)
References
• administration/management/resource_management/resource_group.md
• faq/resource_isolation_faq.mdSangwon
07/09/2026, 8:24 AMRocky
07/09/2026, 8:24 AMmem_limit) 중 100%*를 의미합니다. (보통 BE는 시스템 메모리의 90%를 사용하도록 기본 설정되어 있습니다.)
* 문제점: `default_wg`가 100%라면, 이 그룹에 속한 쿼리나 Stream Load 작업들이 BE가 가진 가용 메모리를 *끝까지 다 끌어다 쓸 수 있다*는 뜻입니다.
* OOM 발생 시나리오: 만약 여러 사용자가 동시에 무거운 쿼리를 던지거나 대용량 Stream Load를 수행하면, `default_wg`가 BE의 메모리를 전부 점유해 버립니다. 이때 시스템에 여유 메모리가 없으면 BE 프로세스가 OS에 의해 강제 종료(OOM Kill)되거나, StarRocks 내부적으로 쿼리를 강제 취소(Cancel)하게 됩니다.
2. 왜 기본값이 100%인가요?
StarRocks를 처음 설치하면 자원을 어떻게 나눌지 모르기 때문에, 일단 모든 자원을 제한 없이 사용할 수 있도록 기본 설정되어 있는 것입니다. 즉, *"자원 격리(Isolation)"가 전혀 이루어지지 않고 있는 상태*라고 보시면 됩니다.
3. OOM 방지를 위해 확인해야 할 다른 설정
`mem_limit`이 100%여도 바로 OOM이 나지 않는 이유는 개별 쿼리 단위의 안전장치가 있기 때문입니다. 다음 설정들도 함께 확인해 보세요.
* query_mem_limit (세션 변수):
* 한 개의 쿼리가 사용할 수 있는 최대 메모리입니다. 기본값은 보통 0(제한 없음)이거나 매우 크게 잡혀 있습니다.
* `SHOW VARIABLES LIKE '%query_mem_limit%';`로 확인할 수 있습니다.
* load_process_max_memory_limit_percent (be.conf):
* BE 전체 메모리 중 로딩(Stream Load 등) 작업에만 할당할 최대 비중입니다. (기본값 보통 30%)
4. 권장 해결 방법 (OOM 예방)
시스템의 안정성을 높이려면 다음과 같이 자원을 분할하는 것이 좋습니다.
1. 그룹별 메모리 제한 설정:
* `default_wg`를 80% 정도로 낮추고, 나머지 20%를 중요한 작업이나 관리용으로 남겨둡니다.
sql
ALTER RESOURCE GROUP default_wg WITH ('mem_limit' = '80%');
2. 용도별 그룹 분리:
* 조회 쿼리용과 로딩용(Stream Load)을 분리하여, 로딩이 갑자기 메모리를 많이 써도 조회 쿼리가 죽지 않게 격리합니다.
3. Spill to Disk 설정:
* 메모리가 부족할 때 OOM을 내는 대신 디스크를 사용하도록 설정하여 쿼리가 죽는 것을 방지할 수 있습니다 (enable_spill = true).
요약하자면: 현재 설정은 *"제한 없는 공유 상태"*입니다. 한쪽에서 자원을 과하게 쓰면 전체 시스템(BE)이 메모리 부족으로 불안정해질 수 있는 상태이므로, 운영 환경이라면 워크로드에 맞춰 퍼센트를 조정하는 것이 권장됩니다.
References
• administration/management/resource_management/resource_group.md
• faq/resource_isolation_faq.md
• administration/management/resource_management/resource_isolation_concept.md
• sql-reference/sql-statements/cluster-management/resource_group/ALTER_RESOURCE_GROUP.mdSangwon
07/09/2026, 8:28 AMRocky
07/09/2026, 8:28 AMsql
EXPLAIN VERBOSE SELECT * FROM your_table LIMIT 10;
* 결과 출력 내용 중 RESOURCE GROUP: <그룹명> 항목을 찾으시면 됩니다. 만약 별도로 설정된 것이 없다면 `default_wg`로 표시됩니다.
2. 현재 실행 중인 쿼리 확인
지금 실시간으로 돌아가고 있는 쿼리들이 어떤 그룹을 쓰고 있는지 보려면 다음 명령어를 사용합니다.
sql
SHOW PROC '/current_queries';
-- 또는 전체 노드 대상
SHOW PROC '/global_current_queries';
* ResourceGroup 컬럼에서 각 쿼리가 할당된 리소스 그룹 이름을 확인할 수 있습니다.
3. 과거 실행 기록 확인 (Audit Log)
이미 실행이 끝난 쿼리들이 어떤 그룹에서 돌아갔는지 확인하려면 FE(Frontend) 서버의 로그를 확인해야 합니다.
* 위치: fe/log/fe.audit.log
* 이 로그 파일의 ResourceGroup 필드에 해당 쿼리가 사용한 그룹명이 기록됩니다.
리소스 그룹이 결정되는 원리 (Classifier)
사용자가 쿼리를 던지면 StarRocks는 미리 설정된 *분류기(Classifier)*를 보고 우선순위가 가장 높은 그룹에 배정합니다.
* 만약 SHOW RESOURCE GROUPS ALL; 명령을 쳤을 때, classifiers 항목에 user=admin 처럼 특정 사용자가 지정되어 있다면 그 사용자의 쿼리는 해당 그룹으로 갑니다.
* 아무런 매칭 조건이 없다면, 무조건 *`default_wg`*로 할당됩니다.
따라서 현재 특별히 리소스 그룹을 생성하고 사용자(User)나 역할(Role)을 연결(Classifier 등록)하지 않으셨다면, 모든 사용자는 기본적으로 `default_wg`를 사용하고 있다고 보시면 됩니다.
References
• administration/management/resource_management/resource_group.md
• faq/resource_isolation_faq.md
• sql-reference/sql-statements/cluster-management/resource_group/SHOW_RESOURCE_GROUP.md
-GROUP)
_GROUP)
References
• administration/management/resource_management/resource_group.md
• faq/resource_isolation_faq.md
• sql-reference/sql-statements/cluster-management/resource_group/SHOW_RESOURCE_GROUP.md
References
• administration/management/resource_management/resource_group.md
• faq/resource_isolation_faq.mdSangwon
07/09/2026, 8:43 AMRocky
07/09/2026, 8:43 AMmem_limit (be.conf): BE 프로세스가 "자신이 사용할 수 있다고 믿는" 전체 메모리입니다. 기본값은 시스템 메모리의 90%입니다.
3. Resource Group mem_limit: 위 2번(BE 전체 메모리) 중 *쿼리 수행에 할당할 비중*입니다.
만약 *Resource Group이 100%*라면, StarRocks는 쿼리들이 BE 전체 메모리(90%)를 다 써도 된다고 허용합니다. 하지만 실제로는 쿼리 외에도 메타데이터, 로그, OS 캐시 등이 메모리를 추가로 사용합니다. 이 오차 때문에 *BE가 인지하지 못한 사이에 K8s Limit(64GB)에 도달*하게 되고, StarRocks가 스스로 제어할 틈도 없이 Pod가 죽어버리게 됩니다.
2. 85%로 설정하면 효과가 있을까?
네, 매우 효과적인 예방책입니다.
* 안전 버퍼 확보: Resource Group의 `mem_limit`을 80%~85% 정도로 낮추면, StarRocks는 쿼리들이 사용하는 메모리가 이 선에 도달했을 때 쿼리를 스스로 취소(Cancel)하거나 디스크 스필링(Spilling)을 시작합니다.
* 자체 제어권 확보: K8s가 강제로 프로세스를 죽이기 전에, StarRocks가 *"메모리가 부족하니 이 쿼리를 중단시키자"*라는 논리적인 판단을 할 수 있는 여유 공간(Gap)을 만들어 주는 것입니다.
3. 더 안전하게 관리하는 방법 (K8s 권장사항)
OOM Kill을 확실히 방지하려면 다음 두 가지 설정을 병행하는 것이 좋습니다.
1. Resource Group mem_limit 조정:
* 말씀하신 대로 default_wg 등을 80%~85% 수준으로 조정하여 쿼리 폭주 시에도 시스템 여유 메모리를 남겨둡니다.
sql
ALTER RESOURCE GROUP default_wg WITH ('mem_limit' = '80%');
2. Spill to Disk 활용:
* 메모리가 부족할 때 쿼리를 죽이는 대신 디스크를 쓰게 하려면 `spill_mem_limit_threshold`를 활용하세요.
* 예를 들어, 리소스 그룹 메모리의 90%를 썼을 때부터 디스크를 사용하도록 설정할 수 있습니다.
3. BE mem_limit 확인 (be.conf):
* K8s 환경에서는 BE의 `mem_limit`을 명시적으로 설정하는 것이 좋습니다. 보통 K8s Limit의 85%~90% 정도로 설정합니다.
* 예: Pod Limit이 100G라면, be.conf의 mem_limit = 90G
결론: K8s 환경에서 `mem_limit`을 100%로 두는 것은 "폭탄 돌리기"와 비슷합니다. 85% 정도로 낮게 설정하는 것은 시스템 안정성을 위한 매우 권장되는 모범 사례(Best Practice)입니다.
References
• administration/management/resource_management/resource_group.md
• faq/resource_isolation_faq.md
• administration/management/resource_management/Memory_management.md
• deployment/sr_operator.md
References
• faq/resource_isolation_faq.md
• administration/management/resource_management/resource_group.md
• administration/management/resource_management/Memory_management.md
• best_practices/audit_log_resource_group.md