프로세스 활용도 측정의 핵심 제약
Judoscale은 웹 서버 프로세스의 요청 처리 시간 비율을 활용도로 정의하며, ‘극도로 낮은 오버헤드’와 ‘멀티스레드 환경에서의 정확성’이라는 두 가지 핵심 제약을 충족해야 합니다.
시도 1: 백그라운드 샘플링의 한계
초기에는 수백 밀리초마다 백그라운드 스레드가 요청 처리 여부를 확인하는 샘플링 방식을 사용했습니다. 하지만 이 방식은 짧은 요청 누락(에일리어싱), 샘플링 속도 증가에 따른 오버헤드, 이진 신호에 대한 낮은 신호 대 잡음비 문제로 정확성과 효율성 모두에서 한계를 드러냈습니다.
시도 2: 이벤트 엣지 트래킹으로의 전환 및 이점
이러한 한계를 극복하기 위해 Judoscale은 폴링 대신 ‘상태 전환(이벤트 엣지)’을 기록하는 방식을 채택했습니다. 프로세스가 유휴/비유휴 상태로 전환될 때의 타임스탬프를 추적하여 비유휴 시간을 정확히 계산합니다. 이 방식은 다음과 같은 주요 이점을 제공합니다.
-
계산 비용 절감: 지속적인 폴링 없이 요청 시작/종료 시점에만 타임스탬프를 기록합니다.
-
정확성 및 신뢰성: 프로세스의 정확한 비유휴 시간을 파악하며, 다양한 트래픽 패턴(버스트, 긴 I/O 등)에서도 신뢰할 수 있습니다.
Ruby 코드 구현과 동작 원리
Judoscale::UtilizationTracker 클래스는 incr (요청 시작) 및 decr (요청 종료) 메서드를 통해 엣지 트래킹을 구현합니다. incr은 활성 요청 카운터를 증가시키고 유휴 시간 기록을 중단하며, decr은 카운터를 감소시키고 0이 되면 유휴 시간 기록을 시작합니다. 이 과정은 뮤텍스를 통해 스레드 안전하게 처리됩니다. Judoscale::RequestMiddleware는 모든 Rack 요청을 래핑하여 요청 시작/종료 시점에 incr/decr을 호출함으로써 데이터의 일관성을 보장합니다.
활용도 데이터 집계
각 프로세스는 10초마다 자신의 유휴 비율 메트릭을 Judoscale 서버로 보고하며, Judoscale 백엔드는 이를 단순 평균하여 애플리케이션 전체의 평균 활용도를 계산합니다. 이 투명한 집계 방식은 신뢰할 수 있는 활용도 지표를 제공합니다.