Cloudflare는 Workers 및 Durable Objects 서비스의 CPU와 메모리 사용량을 필요에 따라 프로파일링할 수 있도록 했다. 이에 따라 개발자는 프로덕션 환경 자체에서 프로파일을 수집하고 이를 대화형 화염 그래프로 표시할 수 있다. 이 기능을 사용하면 전체 로그와 지표에만 의존하지 않고 CPU 시간을 사용하거나 가장 많은 메모리를 할당하는 함수를 식별할 수 있다.
프로파일링은 Cloudflare 대시보드의 Workers Observability 페이지 또는 명령줄 인터페이스를 통해 실행할 수 있다. 개발자는 프로파일 유형인 CPU 또는 memory와 수집 기간을 지정할 수 있으며, 서로 다른 Worker 버전을 선택할 수도 있다. 세션이 끝나면 대화형 그래프를 확인하고 프로파일 파일을 다운로드해 다른 도구로 분석할 수 있다.
화염 그래프에는 무엇이 표시되는가?
그래프의 각 직사각형은 함수 호출을 나타내며, 너비는 해당 함수와 관련된 CPU 시간 또는 메모리의 양을 반영한다. 함수를 클릭해 해당 함수에 초점을 맞추도록 확장하거나, 표 보기를 사용해 샘플 수에 따라 결과를 정렬할 수 있다. Cloudflare는 여러 프로파일을 수집하고 더 넓은 함수를 찾아볼 것을 권장하며, TypeScript 프로젝트에서는 함수 이름이 모호하게 표시되지 않도록 source maps를 활성화할 것을 권장한다.
프로파일링을 수행하려면 충분한 트래픽을 수신하는 배포 버전을 선택해야 한다. 측정을 위해 서비스가 새로운 격리를 생성하는 것은 아니며, 실제 프로덕션 실행을 모니터링하는 것이 목적이기 때문이다. 다음 명령을 사용하면 5초 동안 CPU 프로파일을 수집할 수 있다.
cf workers versions profile latest --worker-id "$WORKER_ID_OR_NAME" --duration-ms 5000 --profile-type cpu > worker-cpu.pprof
Cloudflare가 제시한 실제 결과
Cloudflare는 R2 바인딩을 적용하는 Worker를 분석하는 데 이 도구를 사용했다. 프로파일링 결과, genericR2JsonReplacer 함수가 JSON.stringify를 실행하는 동안 JSON 트리를 반복해서 순회하고 있었으며, 일부 경우 중첩된 값이 다섯 번 처리되고 있음이 나타났다. 이를 수정한 결과 함수가 2.7배 빨라졌다. 또한 프로파일링을 통해 metrics에 대한 중복 호출도 발견되었으며, 결과를 저장하고 재사용하는 것만으로 CPU 사용량을 줄일 수 있었다.
또 다른 사례에서는 한 Worker가 128메가바이트의 메모리 한도를 초과하고 있었다. P999 사용량은 약 133메가바이트에 달했고, 이로 인해 “Exceeded Memory” 오류가 발생했다. 힙 프로파일에서는 할당의 약 66.7%를 담당하는 Prometheus 코드가 비활성화된 것으로 여겨졌음에도 부분적으로 계속 실행되고 있음이 나타났다. 해당 코드 경로를 완전히 제거한 후 P999는 133메가바이트에서 118메가바이트로, P50은 70메가바이트에서 54메가바이트로 감소했다.
실제로 무엇이 달라지는가?
이 기능은 개발팀에 실제 조건에서 실행되는 Workers에 대한 직접적인 가시성을 제공한다. 실제 환경에서는 트래픽과 격리의 분포가 로컬 개발 환경과 다를 수 있다. 플랫폼은 여러 데이터 센터와 장치에 Workers를 분산하는 복잡성을 처리하며, Durable Objects에서는 개발자가 객체를 이름으로 지정해 정확히 해당 객체를 실행하는 격리에 대한 프로파일을 얻을 수 있다.
실행 메커니즘은 수집 중에도 요청을 계속 수신한다. 프로파일링을 시작하고 중지할 때만 격리 잠금이 유지되며, 이후 지정된 기간 동안 1밀리초 간격으로 CPU 샘플이 수집된다. Durable Objects는 상태를 유지하는 특성을 활용해 프로파일링 요청을 지정된 객체의 격리 및 해당 객체의 소유자에게 전달한다.
제한 사항과 다음 단계
프로파일링은 자동으로 시작되지 않으므로 문제가 발생하는 짧거나 드문 기간을 세션이 놓칠 수 있다. 또한 메모리 프로파일러는 측정 창 동안 발생한 할당만 표시하며, 시작 단계에서 발생한 사용량을 반드시 포착하지는 않는다. Cloudflare는 샘플을 자동으로 수집하고 나중에 대시보드에서 확인할 수 있도록 하는 지속적인 프로파일링을 개발 중이라고 밝혔다.