memory_worker_* 서버 설정

memory_worker_* 서버 설정

이 페이지에서는 백그라운드 메모리 워커가 메모리 트래커를 보정하고 더티 페이지(dirty pages)를 정리하는 방식을 제어하는 memory_worker_* 계열 서버 설정을 설명할게요.

출처: 문서

본문

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

memory_worker_correct_memory_tracker

백그라운드 메모리 워커가 jemalloc, cgroups 같은 외부 소스의 정보를 기반으로 내부 메모리 트래커를 보정해야 하는지 여부예요.

memory_worker_decay_adjustment_period_ms

jemalloc의 dirty_decay_ms를 동적으로 조정하기 전에 메모리 압박이 지속되어야 하는 시간(밀리초)이에요. 메모리 사용량이 이 기간 동안 정리 임계값 이상으로 유지되면 자동 더티 페이지 감쇠가 비활성화되어(dirty_decay_ms=0) 메모리를 적극적으로 회수해요. 사용량이 이 기간 동안 임계값 아래로 유지되면 기본 감쇠 동작이 복원돼요. 0으로 설정하면 동적 조정을 비활성화하고 jemalloc의 기본 감쇠 설정을 사용해요.

memory_worker_dynamic_hard_limit

백그라운드 메모리 워커가 런타임에서 서버의 하드 메모리 한도를 (resident memory + system available memory) * max_server_memory_usage_to_ram_ratio로 주기적으로 다시 계산하여, 같은 호스트에서 실행되는 다른 프로세스에 여유를 남기는지 여부예요. 비활성화하면 max_server_memory_usage_to_ram_ratio는 이전 버전처럼 시작 시와 구성 재로드 시에만 하드 메모리 한도를 정적으로 제한해요. max_server_memory_usage_to_ram_ratio0일 때는 효과가 없어요.

memory_worker_period_ms

메모리 트래커 메모리 사용량을 보정하고 메모리 사용량이 높을 때 사용하지 않는 페이지를 정리하는 백그라운드 메모리 워커의 틱(tick) 주기예요. 0으로 설정하면 메모리 사용량 소스에 따라 기본값이 사용돼요.

memory_worker_purge_dirty_pages_threshold_ratio

ClickHouse 서버에 사용 가능한 메모리에 대한 jemalloc 더티 페이지의 임계값 비율이에요. 더티 페이지 크기가 이 비율을 초과하면 백그라운드 메모리 워커가 더티 페이지 정리를 강제해요. 0으로 설정하면 더티 페이지 비율 기반 강제 정리가 비활성화돼요.

memory_worker_purge_total_memory_threshold_ratio

ClickHouse 서버에 사용 가능한 메모리에 대한 jemalloc 정리(제거)의 임계값 비율이에요. 총 메모리 사용량이 이 비율을 초과하면 백그라운드 메모리 워커가 더티 페이지 정리를 강제해요. 0으로 설정하면 총 메모리 기반 강제 정리가 비활성화돼요.

memory_worker_rss_speculative_reserve_ratio

MemoryWorker 틱에서 관찰된 RSS 위에 ratio * min(resident - previous_resident, resident - tracked)만큼을 추가로 예약해요. 이는 다음 틱이 마지막 틱과 같은 양만큼 성장할 수 있다는 가정을 기반으로 해요 (resident - previous_resident는 마지막 틱 동안의 RSS 성장). 성장은 resident - tracked, 즉 전역 메모리 트래커에 보이지 않는 RSS 부분으로 상한이 정해져요. 이미 추적된 성장은 일반 하드 한도 검사로 처리되기 때문이에요. 이 예약은 전역 하드 한도 검사가 MemoryTracker::allocImpl을 통해 참조하는 rss 카운터에 적용되므로, 외삽된 값이 max_server_memory_usage를 넘으면 커널 OOM-killer가 발동하기 전에 후속 할당이 MEMORY_LIMIT_EXCEEDED를 던져요. 값 0은 추측(speculation)을 비활성화하고(rss = resident로 대체), 기본값 1은 다음 구간에 대해 전체 성장 델타 하나만큼의 여유를 예약해요. 새나타이저(ASan, UBSan, MSan, TSan) 아래에서는 기본값이 0인데, resident - tracked 격차가 트래커 장부 지연보다는 새나타이저 섀도/런타임 오버헤드가 지배하기 때문이에요.

memory_worker_use_cgroup

현재 cgroup 메모리 사용량 정보를 사용하여 메모리 추적을 보정해요.

더 알아보기 (Learn more)