
Cloudflare Workers와 Vercel(구체적으로 AWS Lambda 기반)의 JavaScript 실행 성능을 비교한 독립 개발자 Theo Browne의 벤치마크에서 Cloudflare 쪽 성능이 뒤처지는 결과가 나와 논란이 되었습니다. Cloudflare는 이를 계기로 플랫폼 및 관련 라이브러리들을 광범위하게 개선, 대부분의 테스트에서 성능 격차를 해소했습니다. 이번 포스트는 문제의 원인, 해결된 방식, 그리고 앞으로의 개선 방향까지 세세하게 다룹니다.
2025년 10월 4일, 개발자 Theo Browne는 Cloudflare Workers와 Vercel의 서버 사이드 JavaScript 성능을 비교하는 벤치마크 결과를 공개합니다.
초기 결과에 따르면, Cloudflare Workers는 Vercel(Node.js 기반) 대비 최대 3.5배 느린 성능을 보였고, 이 결과는 많은 사람들을 놀라게 했습니다.
특히 둘 다 기본적으로 같은 V8 엔진을 사용하는데도 성능 차이가 커 비정상적으로 보였습니다.
"Cloudflare Workers와 Node.js는 동일한 V8 엔진을 쓰기 때문에, 거의 동일한 코드가 동작할 것이라 기대할 수 있습니다. 그런데 최신 CPU에서 성능이 3.5배나 차이날 이유는 없습니다."
Cloudflare 내부 조사를 통해 인프라 튜닝 문제, 자바스크립트 라이브러리 차이, 벤치마크 자체의 설계 결함 등 다양한 원인이 복합적으로 발견되었습니다.
Cloudflare는 이러한 문제를 일주일간 집중적으로 손보았고, 플랫폼 전반의 성능도 전반적으로 개선되었습니다.
이 과정에서 Vercel에만 영향을 미친 삼각함수 성능 이슈 등, 업계 전체에 도움이 되는 부분도 개선했습니다.
벤치마크 자체가 실제 Cloudflare 과금 체계나 일반적인 워크로드와는 거리가 있었지만, 개선을 위해 적극적으로 대응했다는 점을 강조합니다.
Cloudflare는 Theo의 테스트를 최대한 비슷하게 재현해 공정성을 기하기로 합니다.
주요 변경점은 다음과 같습니다.
Cloudflare는 최근 웜 아이솔레이트(warm isolates) 관리 정책을 도입했으나, 특정 방식이 CPU 집중형 워크로드와는 맞지 않았습니다.
벤치마크처럼 한 클라이언트에서 갑자기 부하가 몰릴 경우 멀티플렉싱 정책의 휴리스틱이 부정확하게 작동하고, 많은 요청이 동일 아이솔레이트에 몰려 대기 시간(=지터, 레이턴시 변동)이 커졌습니다.
"CPU가 바쁜 상황에선 요청들을 서로 다른 아이솔레이트로 더 빨리 분산해야 했는데, 기존 휴리스틱이 이를 늦게 감지해 벤치마크에서 지연이 증가했습니다."
실제 청구되는 CPU 시간엔 영향이 없으나, 대기 시간 증가로 응답성이 떨어졌던 것입니다.
문제 확인 후, 지속적 CPU 사용을 더 빨리 감지해 새로운 아이솔레이트를 신속하게 할당하도록 알고리즘을 개선했습니다.
이 업데이트는 전 세계적으로 바로 적용되어 모든 사용자에게 영향을 주고 있습니다.
스케줄링 개선 외에도, V8의 메모리(young generation 공간) 할당량을 너무 보수적으로 설정한 것이 성능 저하를 야기하고 있었음이 밝혀졌습니다.
2017년 당시 128MB 제한이 권장치였으나, 2025년엔 이제 더 크고 동적인 GC 설계가 필요했던 것.
"2017년엔 적절한 설정이었으나, 최근 GC 구조 변화로 인해 young space를 너무 제한해 불필요한 GC가 반복되었습니다."
Cloudflare는 수동 튜닝을 풀고 V8이 내부 휴리스틱에 따라 young space를 자율 할당하도록 수정했습니다.
벤치마크 성능이 약 25% 향상될 정도로 개선 효과가 있었으며, 대부분의 워커에 폭넓게 적용되었습니다.
플랫폼 자체 개선 이후에도, Next.js(OpenNext) 기반 벤치마크만은 여전히 성능 격차가 남아 있었습니다.
이는 라이브러리 내부의 비효율적 데이터 핸들링, 불필요한 메모리 복사 및 스트림 어댑터 등 다양한 문제가 복합적으로 작용했기 때문입니다.
"getBody().length를 호출하려고 대규모 버퍼들을 일일이 복사하고 합치는 비효율적인 처리가 있었습니다. 단순히 길이 확인 목적이었습니다."
Cloudflare는 OpenNext에 다수의 성능 패치 PR을 제출해 할당 및 복사를 없애거나 줄였습니다.
Next.js와 React는 기본적으로 Node.js의 스트림 API를 활용하지만, Workers는 web-standard Streams API를 선호합니다.
서로 다른 API간 변환(어댑터)에서 불필요한 버퍼링과 복사가 발생해 퍼포먼스 병목이 발생했습니다.
"Node.js 스트림과 Web 스트림 양쪽 내부 버퍼링이 동시에 작동하며, 잦은 복사가 일어납니다. ReadableStream.from(chunks) 식의 단순화가 필요했습니다."
실제로, highWaterMark 등의 세부 설정 개선만으로도 스트림 작업 효율을 크게 높일 수 있습니다.
Next.js와 React 벤치마크에서 JSON.parse() 호출 시 reviver 함수를 사용할 때 비정상적으로 느림이 확인되었습니다.
reviver 함수는 key-value마다 호출되기에 부하가 매우 커짐.
"Theo의 벤치마크에서는 요청 1회당 reviver가 10만 번 이상 호출되었습니다!"
Cloudflare는 V8에 직접 패치를 제출하여, reviver 사용 시 성능을 33% 향상시켰고, 이 개선은 V8을 사용하는 모든 환경(Chrome, Node.js 등)에도 곧 반영될 예정입니다.
제3자가 삼각함수만 집중적으로 호출하는 벤치마크를 만들어 Cloudflare가 Vercel보다 3배 빨랐다고 주장했지만, 분석 결과 Node.js가 컴파일 옵션 상 V8의 빠른 math 경로를 사용하지 않고 있었던 것이 드러났습니다.
Cloudflare 팀은 Node.js 저장소에 직접 PR을 제출해 이 옵션을 반영, 향후 AWS, Vercel 등에도 배포될 예정입니다.
"버그는 버그. 우리 고객에게 당장 이득은 없지만, 업계 전반의 속도가 빨라지도록 고쳤습니다."
Cloudflare는 벤치마크 그 자체도 여러 한계를 가질 수 있음을 강조합니다.
Cloudflare는 플랫폼 변화뿐 아니라, V8 및 Node.js까지 지속 개선하겠다고 약속합니다.
특정 벤치마크에서 부진이 보이면 즉각 원인 분석 및 업스트림 패치를 제출할 예정입니다.
"여러분이 찾은 느린 벤치마크, 재현 코드와 함께 보내주시면 즉시 분석하고 개선해 공유하겠습니다!"
이번 벤치마크 논란을 통해 Cloudflare는 플랫폼과 오픈소스 생태계 양쪽 모두에서 전방위적 성능 개선을 이뤄냈습니다.
불필요한 편향이 들어간 벤치마크도, 실전에서 도움이 되는 인사이트와 개선점을 찾는 기회가 될 수 있습니다.
Cloudflare는 앞으로도 투명하게 이런 이슈를 개선하며, 전체 개발 커뮤니티와 그 이득을 나눌 계획입니다.
키워드:
👩💻 계속되는 개선의 과정이 오픈소스 생태계 전체의 발전으로 이어지고 있습니다