클라우드플레어 워커스 및 Durable Objects 온디맨드 CPU·메모리 프로파일링 지원
클라우드플레어가 워커스(Workers) 및 Durable Objects에 대한 온디맨드 CPU 및 메모리 프로파일링 기능을 도입했다. 개발자는 프로덕션 환경에서 실행 중인 워커의 리소스 사용량을 함수 수준에서 파악하고 최적화할 수 있다.
핵심 요약
- 워커스 및 Durable Objects의 CPU와 메모리 사용량을 온디맨드로 프로파일링한다.
- 클라우드플레어 대시보드 또는 CLI를 통해 프로덕션 환경에서 직접 프로파일링을 요청한다.
- 결과는 인터랙티브한 플레임그래프 형태로 시각화되어 함수별 리소스 사용량을 보여준다.
- 리소스 병목 현상 진단, 메모리 초과 오류 해결, 성능 최적화에 활용된다.
- 1프로파일링 요청
- 2워커 격리 환경 잠금 획득
- 3V8 프로파일러 샘플링 시작
- 4격리 환경 잠금 해제 (실행 지속)
- 5지정 시간 대기 후 프로파일링 중지
- 6결과 직렬화 및 플레임그래프 렌더링
프로덕션 환경 리소스 분석 기능 도입
클라우드플레어가 워커스(Workers) 및 Durable Objects에 대한 온디맨드(on-demand) CPU 및 메모리 프로파일링 기능을 새롭게 지원한다. 이 기능은 개발자가 클라우드플레어 대시보드의 워커스 관측성(Observability) 페이지에서 활성 워커의 CPU 또는 메모리 프로파일을 요청하고, 이를 인터랙티브한 플레임그래프(flamegraph) 형태로 시각화하여 분석할 수 있도록 한다. 또한, 프로파일 파일을 다운로드하여 추가 분석에 활용할 수 있다.
기존에는 애플리케이션의 CPU 및 메모리 사용량을 파악하기 위해 로그나 집계된 메트릭에 의존해야 했으나, 이는 특정 함수가 얼마나 많은 리소스를 사용하는지 정확히 보여주지 못하는 한계가 있었다. 이번 프로파일링 기능 도입으로 개발자는 프로덕션 환경에서 실제 실행 중인 코드의 리소스 사용 패턴을 함수 수준에서 상세하게 분석하고 최적화 기회를 식별할 수 있게 되었다.
배경: 분산 환경에서의 복잡성
워커스 환경은 요청이 클라이언트와 가장 가까운 데이터 센터로 라우팅되어 지연 시간을 줄이는 분산 아키텍처를 갖는다. 이로 인해 워커는 여러 데이터 센터와 물리적 서버(metal)에 복제되며, 트래픽이 많을 경우 특정 데이터 센터 내에서도 여러 번 복제될 수 있다. Durable Objects는 상태를 가지며 동적으로 배치되고 이동할 수 있어 복잡성을 더한다.
이러한 분산 및 동적 특성 때문에 프로덕션 환경에서 실행 중인 워커를 프로파일링하는 것은 어려웠다. 개발자는 프로파일링할 워커 버전, 해당 버전이 최근 실행된 데이터 센터, 워커의 격리 환경(isolate) 로드 여부, 요청 계정에 대한 격리 환경의 전용 여부, 그리고 Durable Object의 경우 특정 라이브 프라이머리 액터의 위치 등 여러 질문에 답해야 했다. 기존에는 크롬 개발자 도구를 통한 로컬 프로파일링만 가능했으나, 로컬 환경은 프로덕션과 다른 요청 유형 및 트래픽 양을 가지므로 실제 성능 분석에는 한계가 있었다.
구체적인 프로파일링 방법 및 시각화
워커스 프로파일링은 클라우드플레어 대시보드 또는 CLI를 통해 요청할 수 있다. 대시보드에서는 'Build → Compute → Workers & Pages' 경로에서 워커를 선택한 후 'Observability' 탭의 드롭다운 메뉴에서 'Flamegraph'를 선택하여 CPU 및 메모리 프로파일을 요청한다. 프로파일러 실행 시간(duration)을 설정할 수 있으며, 프로파일링할 워커의 특정 버전을 선택하는 것도 가능하다. CLI 사용자는 `cf workers versions profile` 명령어를 통해 워커 ID, 프로파일링 시간(예: `--duration-ms 5000`), 프로파일 유형(예: `--profile-type cpu`)을 지정하여 프로파일을 생성할 수 있다.
프로파일링이 완료되면 결과는 인터랙티브한 플레임그래프 형태로 렌더링된다. 플레임그래프의 각 직사각형은 함수 호출을 나타내며, 너비는 해당 함수가 사용하는 CPU 시간 또는 메모리 양을 의미한다. 사용자는 특정 함수를 클릭하여 집중하거나 마우스를 올리면 상세 정보를 확인할 수 있다. 또한, 프로파일에서 가장 많이 나타나는 함수를 빠르게 파악하기 위해 테이블 뷰를 활용하여 'Samples' 기준으로 정렬하는 것도 가능하다. TypeScript로 구현된 워커의 경우, 소스 맵(source maps)을 활성화해야 난독화되지 않은 함수 이름을 볼 수 있어 분석에 용이하다.
프로파일링 과정에서 워커의 실행이 중단되지 않도록 설계되었다. 워커스 런타임은 프로파일러 생명주기 작업에만 격리 환경 잠금(isolate lock)을 획득하고, 샘플링이 시작되면 잠금을 해제하여 정상적인 요청 처리가 계속되도록 한다. 요청된 시간 동안 샘플링을 진행한 후 다시 잠금을 획득하여 프로파일링을 중지하고, 잠금을 해제한 상태에서 결과를 직렬화한다. 이 방식은 프로파일링 중에도 애플리케이션이 계속 실행되어 실제 프로덕션 환경의 동작을 관찰할 수 있도록 보장한다.
Durable Objects의 경우, 특정 이름의 객체를 지정하여 프로파일링할 수 있다. 런타임은 프로파일링 요청을 해당 액터를 소유하는 올바른 물리적 서버로 라우팅하여 특정 객체를 실행하는 격리 환경의 프로파일을 제공한다.
개발자 및 사용자에게 미치는 영향
이 프로파일링 기능은 개발자가 워커스 및 Durable Objects의 성능을 최적화하고 문제를 해결하는 데 중요한 도구를 제공한다. 클라우드플레어 내부 팀은 이미 이 기능을 활용하여 R2 바인딩 워커의 CPU 사용량을 최적화한 사례를 보고했다. 예를 들어, `genericR2JsonReplacer` 함수에서 재귀 호출로 인한 중복 작업을 제거하여 2.7배의 성능 향상을 달성했으며, 중복된 `metrics` 호출을 제거하여 CPU 시간을 절약했다.
메모리 문제 해결에도 효과적이다. 내부적으로 P999 메모리 사용량이 133MB로 128MB 제한을 초과하여 'Exceeded Memory' 오류가 빈번하게 발생하던 워커의 경우, 힙 프로파일링을 통해 비활성화되었다고 생각했던 Prometheus 코드가 할당량의 약 66.7%를 차지하고 있음을 발견했다. 이 코드 경로를 완전히 제거한 결과, P999 메모리 사용량이 118MB로 감소하여 10MB의 여유 공간을 확보하고 메모리 초과 오류를 크게 줄였다.
적용 조건 및 향후 계획
이 프로파일링 기능을 성공적으로 사용하려면 몇 가지 조건이 있다. 프로파일링 대상 워커는 충분한 트래픽을 받아야 한다. 이는 프로파일 생성을 위해 새로운 격리 환경이 시작되지 않고 실제 프로덕션 실행을 관찰하는 것이 목표이기 때문이다. 따라서 트래픽이 매우 적은 워커는 프로파일링이 어려울 수 있다. 또한, TypeScript 워커의 경우 소스 맵을 활성화해야 가독성 높은 함수 이름을 얻을 수 있다.
현재 온디맨드 프로파일링은 사용자가 명시적으로 세션을 시작해야 한다는 한계가 있다. 이로 인해 워커가 오작동하는 중요한 시간대를 놓칠 수 있으며, 메모리 프로파일러는 프로파일링 기간 동안 발생한 할당만 보여주므로 시작 시점의 대량 할당은 포착하지 못한다. 클라우드플레어는 이러한 한계를 극복하기 위해 워커의 프로파일링 샘플을 자동으로 캡처하여 대시보드에서 탐색할 수 있도록 하는 '지속적인 프로파일링(continuous profiling)' 기능을 개발 중이다. 이는 드문 이벤트를 포착하는 데 도움이 될 것으로 기대된다.
데빈은 실제 기자가 아닌 AI 기술 에디터입니다. 출처의 공개 기사 본문 또는 RSS 제공 정보에서 사실을 추려 배경과 기술적 영향을 독립적인 한국어 기사로 재구성합니다. 직접 취재한 기사나 원문 전문의 번역·재게시가 아닙니다.
출처 · 원문 확인
Cloudflare Blog · Dominik Picheta
Introducing on-demand CPU and memory profiling with flamegraphs for Workers and Durable Objects
원문 발행: 2026-10-09 22:00:00
원문과 이미지의 권리는 해당 권리자에게 있습니다. 정정·게재 중단 요청은 문의 안내를 이용해 주세요.
관련 소식
- Kubernetes Kueue 작업 대기 상태 진단: Headlamp 플러그인 활용 · Kubernetes Blog · 2026-10-15
- 클라우드플레어 D1, 수백만 데이터베이스 지원을 위한 확장 아키텍처 공개 · Cloudflare Blog · 2026-10-14
- 클라우드플레어, 로그 전송 단계서 SQL로 가공하는 트랜스포머 정식 출시 · Cloudflare Blog · 2026-10-12
- 클라우드플레어, 멀티모달 Clef-omni 출시 및 Clef 모델 성능 개선 · Cloudflare Blog · 2026-10-10
- AWS, 2026년 9월 AI 빌더를 위한 베드록, 에이전트코어, 스트랜즈 업데이트 발표 · AWS Machine Learning Blog · 2026-10-10
댓글 0
아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.