<@U0A71G31CDV> starrocks에 query, streamload등 과 같은걸...
# questions-and-troubleshooting
s
@Rocky starrocks에 query, streamload등 과 같은걸 자원의 몇퍼센트 사용할지 결정해주는 게 있는걸로아는데, 현재 세팅이 어떻게 되어있는지는 어떻게 확인ㄴ해
r
StarRocks에서 쿼리나 Stream Load와 같은 워크로드별로 자원(CPU, 메모리 등) 사용량을 제한하고 관리하는 기능은 *자원 그룹(Resource Group)*을 통해 수행됩니다. 현재 설정 상태와 사용량을 확인하는 방법은 다음과 같습니다. 1. 설정된 자원 그룹 및 제한 사항 확인 현재 생성된 모든 자원 그룹의 설정값(CPU 가중치, 메모리 제한, 동시성 제한 등)을 확인하려면 다음 명령어를 사용합니다.
Copy code
sql
-- 모든 자원 그룹과 연결된 분류기(Classifier) 확인
SHOW RESOURCE GROUPS ALL;
* cpu_weight: 해당 그룹의 CPU 사용 비중 (상대적 값) * mem_limit: 해당 그룹이 사용할 수 있는 최대 메모리 퍼센트 (%) * concurrency_limit: 최대 동시 쿼리 수 * classifiers: 어떤 조건(사용자, 역할, DB 등)일 때 이 그룹에 할당되는지 보여주는 조건 리스트 2. 현재 실시간 자원 사용량 확인 (v3.1.4 이상) 각 자원 그룹이 현재 실제로 어느 정도의 CPU와 메모리를 사용 중인지 확인하려면 다음 명령어를 사용합니다.
Copy code
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
그룹에서 실행됩니다. 참고: 설정 변경 방법 만약 특정 그룹의 메모리 제한을 변경하고 싶다면 다음과 같이 수정할 수 있습니다.
Copy code
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.md
s
@Rocky 두개가 보여 default_mv_wg, default_wg
r
확인하신 두 그룹은 StarRocks가 시스템적으로 기본 생성하는 자원 그룹들입니다. 각각의 용도는 다음과 같습니다. 1. 각 그룹의 역할 *
default_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. 로딩 전용 그룹 생성:
Copy code
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.md
s
@Rocky default_wg보면, cpu_weight_percent 가 100, mem_limit 100%인데, 이러면 oom이 발생할 가능성이 높지않아?? 이거랑 관련이 있어?
r
네, 맞습니다. `default_wg`의 `mem_limit`이 100%로 설정되어 있는 것은 OOM(Out of Memory) 발생 가능성과 직접적인 관련이 있습니다. 하지만 그 의미를 정확히 이해하는 것이 중요합니다. 1. 100%의 의미: "전부 다 써도 된다"는 허용 여기서 100%는 전체 물리 RAM이 아니라, *StarRocks BE(Backend) 프로세스에게 할당된 전체 메모리(
mem_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%를 중요한 작업이나 관리용으로 남겨둡니다.
Copy code
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.md
s
@Rocky 현재 사용자가 쿼리 날릴때 사용하는 리소스 그룹이 뭔지 알수있어?
r
특정 사용자가 쿼리를 날릴 때 어떤 리소스 그룹에 할당되는지 확인하는 방법은 크게 세 가지가 있습니다. 1. 실행 전 확인 (EXPLAIN VERBOSE) 쿼리를 실제로 실행하지 않고, StarRocks가 이 쿼리를 어떤 그룹으로 보낼지 미리 확인할 수 있습니다.
Copy code
sql
EXPLAIN VERBOSE SELECT * FROM your_table LIMIT 10;
* 결과 출력 내용 중
RESOURCE GROUP: <그룹명>
항목을 찾으시면 됩니다. 만약 별도로 설정된 것이 없다면 `default_wg`로 표시됩니다. 2. 현재 실행 중인 쿼리 확인 지금 실시간으로 돌아가고 있는 쿼리들이 어떤 그룹을 쓰고 있는지 보려면 다음 명령어를 사용합니다.
Copy code
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.md
s
@Rocky 혹시 k8s환경에 starrocks라면 mem_limit을 100%로 했을때, k8s limit에 할당된 메모리랑 같을텐데, 이걸 다 쓰면 pod자체에서 oom kill 나지않을까?? 해당 값을85%정도로 해두면 쿼리가 아무리 무거워도 oom_kill은 안나지않을까?
r
네, 매우 날카로운 지적입니다. K8s 환경에서는 일반적인 서버 환경보다 메모리 관리가 훨씬 더 엄격해야 하며, 말씀하신 대로 `mem_limit`을 100%로 두는 것은 위험할 수 있습니다. 그 이유와 권장 설정 방향을 정리해 드립니다. 1. K8s OOM Kill이 발생하는 구조 K8s 환경에서 StarRocks BE의 메모리는 다음과 같은 계층으로 관리됩니다. 1. K8s Pod Limit: (예: 64GB) Pod가 사용할 수 있는 절대적인 상한선입니다. 이 선을 넘으면 K8s가 즉시 *OOM Kill*을 수행합니다. 2. StarRocks BE
mem_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% 수준으로 조정하여 쿼리 폭주 시에도 시스템 여유 메모리를 남겨둡니다.
Copy code
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