Tin tức

Transcoding bộ nhớ đệm của Cloudflare: Zstd bên trong Pingora để tiết kiệm petabyte

Cloudflare đã thử nghiệm nén các mục bộ nhớ đệm bằng Zstandard bên trong proxy Pingora của mình, giảm các tài sản đủ điều kiện xuống còn khoảng một phần ba kích thước ban đầu trên đĩa và cắt giảm băng thông giữa các trung tâm dữ liệu, với chi phí tăng nhẹ CPU.

September 1, 2026· 6 min read· Nguồn: Cloudflare Blog
Transcoding bộ nhớ đệm của Cloudflare: Zstd bên trong Pingora để tiết kiệm petabyte

Cloudflare đang phải đối mặt với chi phí bộ nhớ tăng cao — giá RAM và ổ cứng đã tăng vọt trong năm qua. Để kéo dài thời gian sử dụng bộ nhớ đã triển khai, công ty đã thử nghiệm một hệ thống gọi là Cache Transcoding, được xây dựng trong một kỳ thực tập tại Chương trình Thực tập 1.1.1.1. Ý tưởng: nén các tài sản đủ điều kiện bằng Zstandard (zstd) trước khi ghi vào bộ nhớ đệm, giữ chúng được nén trên đĩa và trong quá trình chuyển Tiered Cache, chỉ giải mã khi phục vụ cho khách hàng.

Trong thử nghiệm ban đầu, mã hóa này đã giảm các tài sản đủ điều kiện xuống còn khoảng một phần ba kích thước ban đầu trên đĩa trung bình. Sự đánh đổi là tăng nhẹ mức sử dụng CPU — trả một lần cho mỗi lần điền bộ nhớ đệm — để tiết kiệm đáng kể lưu trữ và băng thông, tích lũy mỗi khi tài sản được phục vụ.

Tại sao Zstandard?

Zstd là một thuật toán nén không mất dữ liệu được Facebook phát hành mã nguồn mở vào năm 2016. Nó cân bằng tỷ lệ nén với tốc độ. Thử nghiệm nén trình duyệt trước đó của Cloudflare cho thấy dữ liệu nén zstd nhanh hơn 42% so với Brotli trong khi tạo ra kích thước tệp gần như tương đương, và tạo ra các tệp nhỏ hơn 11,3% so với gzip ở tốc độ tương đương. Nguyên mẫu sử dụng zstd cấp độ 3, mang lại hầu hết lợi ích nén mà không biến việc điền bộ nhớ đệm thành nút thắt cổ chai CPU.

Theo truyền thống, Cloudflare lưu trữ một tài sản bằng cách sử dụng mã hóa nội dung do nguồn gốc cung cấp. Nếu nguồn gốc gửi các byte không nén, các byte đó được lưu trữ và chuyển như cũ. Cache Transcoding thêm nén bên trong bộ nhớ đệm.

Không phải mọi thứ đều đáng nén

Hình ảnh, video và phông chữ thường đã được nén. Trong mẫu lưu lượng của Cloudflare, phần phương tiện này chiếm 21,4% yêu cầu nhưng 63,3% byte — nén lại sẽ lãng phí CPU. Văn bản có thể nén (HTML, JSON, CSS, JavaScript) chiếm 67,3% yêu cầu và 22,3% byte. Trong phần văn bản đó, khoảng 71% đến không nén với Content-Encoding không được đặt và nó nén tốt. Trong kho dữ liệu thử nghiệm có kiểm soát, các tài sản đủ điều kiện nén khoảng 2,8 lần.

Chi phí đo được: mã hóa ở zstd cấp độ 3 tốn 4,31 ns mỗi byte (khoảng 232 MB/s), trả một lần cho mỗi lần điền; giải mã tốn 1,56 ns mỗi byte (khoảng 641 MB/s), trả cho mỗi lần phục vụ. Mã hóa đắt hơn mỗi byte, nhưng các tài sản được phục vụ thường xuyên hơn nhiều so với việc chúng được điền.

Trả chi phí nén một lần

Nén không bao giờ miễn phí. Câu hỏi chính là liệu tiết kiệm byte có biện minh cho chi phí CPU hay không. Ở zstd cấp độ 3, mô hình giữ chi phí CPU thêm ở mức vài phần trăm trong các giả định lưu lượng và tái sử dụng được thử nghiệm. Giới hạn transcoding cho nội dung phổ biến không giúp ích — giải mã xảy ra trên mỗi lần phục vụ, vì vậy hạn chế tính năng cho các tài sản nóng làm giảm tiết kiệm lưu trữ mà không cắt giảm CPU tương ứng. Chính sách đơn giản hơn hoạt động tốt hơn: transcode tất cả văn bản có thể nén đủ điều kiện từ 4 KiB trở lên, nắm bắt gần như tất cả lợi ích lưu trữ đo được trong ngân sách CPU.

Cách Cache Transcoding hoạt động

Khi bỏ lỡ bộ nhớ đệm, proxy dựa trên Pingora mã hóa phần thân bằng zstd trước khi ghi vào đĩa, ghi lại rằng biểu diễn được lưu trữ được nén và bảo toàn độ dài nội dung gốc. Khi trúng bộ nhớ đệm, đối tượng zstd được lưu trữ được đọc và giải mã. Với Tiered Cache, biểu diễn nén di chuyển giữa các tầng ở dạng nén; giải mã chỉ xảy ra ở bước phục vụ khách hàng. Một điểm đánh dấu mã hóa lưu trữ ngăn một đối tượng được mã hóa nhiều lần.

Kiểm tra đủ điều kiện

Nguyên mẫu chỉ transcode phản hồi 200 OK khi Content-Encoding không được đặt, Content-Type là văn bản có thể nén và phản hồi có Content-Length đã biết ít nhất 4 KiB. Các yêu cầu con slice, phản hồi sử dụng nén thượng nguồn hoạt động, yêu cầu phạm vi, phản hồi được nén trước, phần thân có độ dài không xác định và nội dung nhị phân vẫn không thay đổi. Ngưỡng 4 KiB đã loại bỏ nhiều yêu cầu nhỏ trong khi chỉ loại trừ khoảng 1% byte đủ điều kiện khác.

Thử nghiệm với hơn một triệu yêu cầu

Cloudflare đã thử nghiệm nguyên mẫu trên một vùng thử nghiệm có kiểm soát, tương quan các yêu cầu qua nhật ký, số liệu Prometheus và dấu vết Jaeger. Một chiến dịch hiệu suất đã gửi hơn một triệu yêu cầu qua 10 máy chủ bộ nhớ đệm, một nửa với Tiered Cache bị vô hiệu hóa và một nửa được bật. Hai tài sản (khoảng 195 KiB và 272 KiB) nén khoảng 2,8 lần. Đây là một kho dữ liệu có thể nén một cách có chủ ý, vì vậy tỷ lệ đo được không phải là hằng số trên toàn hệ thống.

Nén một lần, hưởng lợi nhiều lần

Thử nghiệm cho thấy hiệu quả đáng kể vẫn có sẵn trong dịch vụ bộ nhớ đệm của Cloudflare. Sự đánh đổi là thuận lợi trong các điều kiện được thử nghiệm, bảo toàn nội dung và nằm trong ngân sách CPU. Các bước tiếp theo bao gồm đánh giá các cấp độ zstd cao hơn, loại nội dung và kích thước rộng hơn, khám phá các yêu cầu phạm vi, nguồn gốc được nén trước và chuyển các đối tượng nén trực tiếp đến các thành phần hạ nguồn hỗ trợ chúng.

Chi phí mã hóa được trả một lần khi một tài sản vào bộ nhớ đệm. Tiết kiệm lưu trữ và băng thông tiếp tục mỗi lần tài sản đó được tái sử dụng.
Ban biên tập Manul X
Chi phí đo được cho zstd cấp độ 3 trong nguyên mẫu Cache Transcoding
So sánh nhanh
Đo lườngGiá trị
Tỷ lệ nén2,834x
Chi phí mã hóa4,31 ns/byte (~232 MB/s), trả một lần cho mỗi lần điền
Chi phí giải mã1,56 ns/byte (~641 MB/s), trả cho mỗi lần phục vụ