서버 오버로드
서버 오버로드 (Server overload)
다양한 이유로 서버가 과부하 상태에 빠질 수 있어요. 여기서는 ClickHouse가 CPU 오버로드를 감지하고, 쿼리를 거부하거나 연결을 끊는 방식으로 부하가 더 늘어나지 않게 하는 방법을 설명해 드릴게요.
출처: 문서
본문
개요 (Overview)
때로는 여러 이유로 서버가 과부하 상태가 될 수 있어요. 현재 CPU 오버로드를 판단하기 위해 ClickHouse 서버는 CPU 대기 시간(OSCPUWaitMicroseconds 메트릭)과 사용 중 시간(OSCPUVirtualTimeMicroseconds 메트릭)의 비율을 계산해요. 서버가 일정 비율 이상 과부하되면 부하를 더 늘리지 않도록 일부 쿼리를 버리거나 연결 요청을 거부하는 것이 합리적이에요.
CPU가 실제로 유용한 작업을 하고 있는지 판단하는 최소 사용 시간을 제어하는 서버 설정 os_cpu_busy_time_threshold가 있어요. OSCPUVirtualTimeMicroseconds 메트릭의 현재 값이 이 값보다 낮으면 CPU 오버로드는 0으로 간주돼요.
쿼리 거부 (Rejecting queries)
쿼리 거부 동작은 쿼리 레벨 설정인 min_os_cpu_wait_time_ratio_to_throw와 max_os_cpu_wait_time_ratio_to_throw로 제어돼요. 이 설정들이 설정되어 있고 min_os_cpu_wait_time_ratio_to_throw가 max_os_cpu_wait_time_ratio_to_throw보다 작으면, 오버로드 비율이 최소 min_os_cpu_wait_time_ratio_to_throw 이상일 때 일정 확률로 쿼리가 거부되고 SERVER_OVERLOADED 오류가 발생해요. 확률은 최소와 최대 비율 사이의 선형 보간(linear interpolation)으로 결정돼요. 예를 들어 min_os_cpu_wait_time_ratio_to_throw = 2, max_os_cpu_wait_time_ratio_to_throw = 6, cpu_overload = 4라면 쿼리는 0.5의 확률로 거부돼요.
연결 끊기 (Dropping connections)
연결 끊기는 서버 레벨 설정인 min_os_cpu_wait_time_ratio_to_drop_connection과 max_os_cpu_wait_time_ratio_to_drop_connection으로 제어돼요. 이 설정들은 서버를 재시작하지 않고도 변경할 수 있어요. 원리는 쿼리 거부와 비슷한데, 차이는 서버가 과부하된 경우 연결 시도 자체가 서버 측에서 거부된다는 점이에요.
리소스 오버로드 경고 (Resource overload warnings)
ClickHouse는 서버가 과부하 상태일 때 CPU 및 메모리 오버로드 경고를 system.warnings 테이블에 기록해요. 이 임계값들은 서버 설정을 통해 맞춤 설정할 수 있어요.
예시
<resource_overload_warnings>
<cpu_overload_warn_ratio>0.9</cpu_overload_warn_ratio>
<cpu_overload_clear_ratio>0.8</cpu_overload_clear_ratio>
<cpu_overload_duration_seconds>600</cpu_overload_duration_seconds>
<memory_overload_warn_ratio>0.9</memory_overload_warn_ratio>
<memory_overload_clear_ratio>0.8</memory_overload_clear_ratio>
<memory_overload_duration_seconds>600</memory_overload_duration_seconds>
</resource_overload_warnings>