Bởi ITCuli

Nhìn nhanh Introducing demand memory profiling: lợi ích, rủi ro và lưu ý triển khai

Nhìn nhanh Introducing demand memory profiling: lợi ích, rủi ro và lưu ý triển khai

Cloudflare đã bổ sung chức năng lập hồ sơ CPU và bộ nhớ theo yêu cầu cho Workers và Durable Objects. Thay vì chỉ suy luận từ log hoặc biểu đồ tổng hợp, đội vận hành có thể lấy mẫu trực tiếp trên lưu lượng thật, xem flamegraph tương tác và tải file profile để phân tích sâu hơn.

Trên flamegraph, mỗi khối là một lời gọi hàm. Độ rộng khối thể hiện lượng CPU hoặc bộ nhớ mà hàm đó sử dụng. Kỹ sư có thể bấm vào một nhánh, xem chi tiết khi rê chuột và dùng chế độ bảng để xếp theo số mẫu. Đây là khác biệt quan trọng khi xử lý một Worker chậm, chi phí tăng hoặc lỗi thiếu bộ nhớ.

Workers flamegraph

Cách chạy profile

Trong Cloudflare Dashboard, vào Build → Compute → Workers & Pages, chọn Worker, mở tab Observability, rồi chọn Flamegraph. Chọn CPU hoặc memory, phiên bản đã triển khai và thời lượng trước khi bấm Capture Profile. Worker phải có đủ traffic; Cloudflare không tạo isolate mới chỉ để lấy profile vì mục tiêu là quan sát hành vi production.

CLI dùng gói cf. Ví dụ CPU profile: cf workers versions profile latest --worker-id "$WORKER_ID_OR_NAME" --duration-ms 5000 --profile-type cpu > worker-cpu.pprof. Với TypeScript, cần bật source maps. Nếu không, tên hàm trong profile có thể bị obfuscate và việc truy vết hot path trở nên kém tin cậy.

Profile settings

Bằng chứng thực tế từ Cloudflare

Ở Worker phục vụ R2 binding, Cloudflare chạy CPU trace 50 giây. Hàm genericR2JsonReplacer chiếm trên 5% CPU. Nguyên nhân là hàm này tự duyệt cây JSON trong khi JSON.stringify cũng gọi nó trên từng node. Một giá trị nằm sâu năm cấp bị xử lý tới năm lần. Loại bỏ công việc trùng lặp giúp hàm này nhanh hơn 2,7 lần. Một profile khác phát hiện registry.metrics() bị gọi lặp; chỉ cần lưu kết quả lần đầu đã tránh được thao tác tốn kém vốn chiếm 1% CPU.

Ví dụ bộ nhớ còn đáng chú ý hơn. Một Worker nội bộ có P999 khoảng 133 MB trong khi giới hạn là 128 MB, gây các lần eviction với lỗi Exceeded Memory. Heap profile cho thấy mã Prometheus chiếm khoảng 66,7% allocation dù đội ngũ tưởng rằng nó đã tắt. Sau khi loại bỏ đường mã này, P50 giảm từ 70 xuống 54 MB, P90 từ 94 xuống 79 MB, P99 từ 113 xuống 97 MB và P999 từ 133 xuống 118 MB. Nhờ đó Worker có khoảng 10 MB headroom dưới giới hạn.

Memory improvement

Checklist cho quản trị viên

  • Chọn version đang phục vụ traffic đại diện; Worker nhàn rỗi khó cho profile hữu ích.
  • Bắt đầu với cửa sổ ngắn như 5.000 ms, sau đó lặp lại đúng thời điểm lỗi xuất hiện.
  • Kiểm tra khối rộng nhất và bảng theo samples; xác nhận trong code trước khi sửa.
  • Đối chiếu allocation với instrumentation hoặc feature flag chỉ bị tắt một phần.
  • Lưu file profile vào hồ sơ incident, triển khai thay đổi nhỏ, rồi so sánh percentile và error rate trước/sau.
  • Với Durable Objects, chọn đúng object theo tên vì đây là actor stateful, không giống Worker stateless.

Giới hạn cần biết

Runtime chỉ giữ isolate lock lúc khởi động và dừng profiler, sau đó nhả lock để request bình thường tiếp tục chạy. Vì vậy profile không làm ngừng JavaScript. Tuy nhiên, đây chưa phải continuous profiling: phải tự khởi động phiên; sự cố hiếm có thể bị lỡ. Memory profile chỉ ghi nhận allocation trong cửa sổ đo, không nhìn thấy allocation lúc khởi động. Cloudflare cho biết họ đang phát triển continuous profiling.

Kết luận

CPU và memory profiling theo yêu cầu giúp biến cảnh báo mơ hồ thành hàm, allocation và đường code cụ thể. Hãy gắn việc capture với alert, dùng source maps, sửa có kiểm soát và đo lại kết quả.

Nguồn: Cloudflare: Introducing on-demand CPU and memory profiling with flamegraphs for Workers and Durable Objects.