운영 코드의 비싼 함수와 할당 경로를 추적
클라우드플레어는 Workers와 Durable Objects에서 요청에 따라 CPU·메모리 프로파일을 수집하는 기능을 발표했다. Workers Observability의 플레임그래프에서 함수별 결과를 살펴보고 원시 프로파일을 내려받아 추가 분석할 수 있다. 로컬 테스트와 다른 실제 운영 요청을 대상으로 자원이 많이 드는 코드 경로를 찾는 용도다.
공식 문서는 CPU 프로파일이 처리시간을 사용하는 함수를, Heap 프로파일이 메모리를 할당하는 코드를 보여준다고 설명한다. Heap은 수집 중 할당된 메모리 512kB마다 스택을 표본으로 기록하며, 남아 있는 객체를 보여주는 힙 스냅샷은 아니다. 할당된 메모리가 아직 살아 있는지까지 나타내지 않으므로 큰 할당 비중을 곧바로 메모리 누수의 증명으로 읽어서는 안 된다.
실제 트래픽과 선택한 배포 버전이 필요
프로파일은 이미 활성화돼 로드된 실행 환경을 대상으로 한다. 수집을 위해 새 요청이나 실행 환경을 자동으로 시작하지 않으므로 선택한 버전에 트래픽이 있어야 한다. Workers에서는 실행 중인 환경 하나를 선택하며, Durable Objects는 특정 인스턴스를 지정해 해당 객체의 실행을 살필 수 있다고 회사는 설명한다.
공식 문서의 수집 시간은 1,000~50,000ms이고 기본값은 10,000ms다. API와 CLI의 latest는 가장 최근에 만든 버전이어서 실제 배포된 버전과 다를 수 있다. 로그 화면의 과거 기간 필터도 수집 범위를 정하지 않는다. 프로파일은 요청한 수집 시간 동안의 활동을 기록한다. 소스맵을 올려야 축소된 코드 대신 함수 이름과 파일 위치를 이해하기 쉽다.
공급자의 내부 사례가 보여준 중복 작업
클라우드플레어는 R2 바인딩 Worker의 CPU 프로파일에서 JSON 처리 함수가 중복으로 트리를 순회하던 문제를 발견했다고 밝혔다. JSON.stringify가 각 노드를 방문하는데 변환 함수도 다시 하위 트리를 훑어 같은 값을 반복 처리한 것이다. 회사는 이를 수정해 해당 함수가 2.7배 빨라졌다고 설명했다. 이 수치는 해당 함수의 결과이며 Worker 전체의 속도 향상률은 아니다.
메모리 사례에서는 비활성화됐다고 생각한 Prometheus 계측 경로가 여전히 실행되며 할당의 약 66.7%를 차지했다고 회사는 밝혔다. 그 경로를 제거한 뒤 P999 메모리가 133MB에서 118MB로 줄었다는 표도 공개했다. 이는 128MB 한도를 대상으로 한 내부 Worker의 전후 결과다. 같은 프로파일링 기능이 다른 서비스에서도 같은 감소 폭을 만든다는 보장은 아니다.
플레임그래프는 함수 비중을 보여주는 자료
ARCH.B의 관점에서 플레임그래프를 해석할 때 먼저 구분할 것은 측정 유형과 시간 구간이다. 같은 넓은 프레임도 CPU에서는 계산시간, Heap에서는 할당량을 뜻한다. 그래프의 가로 위치는 함수가 실행된 시점을 보여주는 타임라인이 아니다. 특정 함수를 확대해도 비교의 기준을 전체 수집 자료와 연결해 읽어야 잘못된 우선순위를 정하는 일을 피할 수 있다.
수집한 한 환경의 결과도 전체 서비스의 평균과 다를 수 있다. 특정 요청이나 객체에 작업이 몰린 상황을 살폈다면 어떤 트래픽과 버전을 대상으로 했는지 남겨야 한다. 기능의 목적은 비용이 큰 경로에 대한 근거를 확보하는 데 있다. 변경 후에는 같은 업무 경로를 다시 수집하고 요청의 지연과 오류 등 다른 관측 값도 비교해 실제 영향이 있는지 확인하는 편이 적절하다.
수집 창 밖의 문제와 다음 계획을 구분
이번 기능은 사용자가 수집을 시작해야 하므로 짧게 발생한 문제를 놓칠 수 있다. 특히 초기화 과정에서 큰 할당이 있었어도 그 이후에 수집했다면 해당 과정은 프로파일에 나타나지 않는다. 회사는 이런 한계를 보완할 지속 프로파일링을 작업 중이라고 설명했다. 그 후속 계획을 현재 자동 수집 기능이 이미 제공되는 것으로 바꿔 읽어서는 안 된다.
프로파일을 아카이빙할 때는 원시 파일과 코드 버전, 수집 시간과 대상 객체, 당시 요청 조건을 함께 남기는 것이 유용하다. 개선 전후의 이미지가 비슷해도 측정 대상이 달라지면 수치의 뜻이 바뀐다. 이번 내부 사례에서 참고할 부분 역시 큰 성능 수치 자체보다 예상 밖 계측 비용과 중복 순회를 실제 운영 자료로 찾아낸 과정이다.
출처
Cloudflare Blog의 원출처와 본문에 표시한 참고자료를 바탕으로 한국어로 재구성했습니다. ‘ARCH.B 분석’은 자료를 읽고 덧붙인 편집 해석입니다.
Introducing on-demand CPU and memory profiling with flamegraphs for Workers and Durable Objects (새 창)


