min_allocation_size_* 서버 설정

min_allocation_size_* 서버 설정

이 페이지에서는 메모리 한도 근처에서의 할당 로그와 예외 발생을 제어하는 min_allocation_size_* 계열 서버 설정을 설명할게요.

출처: 문서

본문

이 설정들은 ClickHouse 서버를 구성하며, ClickHouse 소스에서 자동으로 생성돼요.

min_allocation_size_to_log_stack_trace

전역(서버 전체) 메모리 트래커에 대한 단일 청구(charge)의 최소 크기(바이트)로, 이 크기 이상이면 스택 트레이스가 캡처되어 서버 로그에 Warning 레벨로 기록되고 system.trace_log에 trace 유형 MemoryLargeAllocation으로 삽입돼요. 임계값과 비교하여 보고되는 크기는 하나의 트래커 호출이 청구하는 양으로, 반드시 하나의 할당은 아니에요: 스레드는 작은 할당들을 지연시켜 단일 청구로 플러시하므로, 보고된 크기는 보고된 스택의 최상단 할당보다 최대 max_untracked_memory만큼 클 수 있어요. 임계값을 max_untracked_memory보다 훨씬 크게 유지하면 그 차이가 무의미해져요.

이것은 전역 추적 합계가 프로세스의 실제 메모리 사용량보다 훨씬 커진 상태에 대한 진단용이에요. 그 상태에서 서버는 한도 중 일부만 사용하면서 모든 할당(0바이트까지)을 거부하고, 일반 원격 측정은 그 단계를 설명할 수 없어요: MemoryTrackerBlockerInThread 아래에서 청구된 할당은 한도 검사와 그에 따른 트레이스를 건너뛰며, 나머지를 전달할 system.trace_log 삽입은 서버가 걸린 후에는 실패해요. 서버 로그는 계속 쓰여지므로 스택 트레이스는 거기에 도달해요.

서버 실행당 최대 10개의 트레이스가 캡처되는데, 스택을 캡처하고 상징화하는 것이 비싸고 트리거가 반복되는 경향이 있기 때문이에요. 이 설정을 런타임에 어느 방향으로든 변경해도 그 상한은 올라가지 않아요. trace_log가 구성되어 있어야 해요. 실행 중인 trace 수집기가 없으면 값은 무시되고 system.server_settings에서 0으로 보고되는데, 이는 트레이스가 캡처되어 버려질 수밖에 없기 때문이에요. 그 테이블이 연결되기 전(시작 후반에 발생)에 수집기가 처리한 트레이스는 서버 로그에만 도달해요. 값 0(기본값)은 진단을 비활성화해요. 서버가 정상적으로 만드는 가장 큰 할당보다 훨씬 높게 설정하세요. 그렇지 않으면 일반적인 큰 할당도 기록되고 시작 시 전체 예산을 소모할 수 있어요.

min_allocation_size_to_throw_on_memory_limit

max_server_memory_usage에 도달하면 MEMORY_LIMIT_EXCEEDED를 발생시킬 수 있는 일반 C++ 할당(표준 컨테이너, 문자열, std::vector 성장, 스마트 포인터 등이 만드는 종류)의 최소 크기(바이트)예요. 더 작은 일반 할당은 여전히 메모리 트래커에 집계되지만 한도를 넘어도 성공이 허용되는데, 이는 OOM 근처의 정리 및 예외 처리 경로에서 허위 실패를 줄여요. ClickHouse 자체의 큰 버퍼(컬럼 데이터, 해시 테이블, arenas, 쿼리 파이프라인, IO 버퍼)가 만든 할당은 이 값과 관계없이 항상 메모리 한도를 존중하며 예외를 던질 수 있어요. 이 설정은 operator new를 통과하는 암시적 할당에만 영향을 줘요. 값 0(기본값)은 레거시 동작을 유지해요: 암시적 operator new 할당은 메모리 트래커에 의해 절대 거부되지 않으며, 명시적 ClickHouse 할당만 MEMORY_LIMIT_EXCEEDED를 발생시킬 수 있어요. 참고로 부작용을 피하려면 값을 max_untracked_memory보다 크게 설정하는 것이 권장돼요.

min_os_cpu_wait_time_ratio_to_drop_connection

연결을 끊을지 고려하는 OS CPU 대기(OSCPUWaitMicroseconds 메트릭)와 사용 중(OSCPUVirtualTimeMicroseconds 메트릭) 시간 사이의 최소 비율이에요. 최소 비율과 최대 비율 사이의 선형 보간으로 확률을 계산하며, 이 시점에서 확률은 0이에요. 자세한 내용은 Controlling behavior on server CPU overload를 참고하세요.

더 알아보기 (Learn more)