Sản phẩm
Tối ưu hóa dung lượng lưu trữ cache khổng lồ nhờ Zstandard và Pingora
(giờ Việt Nam)
Tóm tắt AI
Cloudflare thử nghiệm tích hợp nén dữ liệu trực tiếp vào hệ thống cache, giúp mở rộng không gian lưu trữ mà không cần nâng cấp phần cứng.
Bản dịch AI

Chi phí bộ nhớ đang tăng lên đáng kể. Giá của cả RAM và ổ cứng đều đã tăng vọt trong năm qua. Tại Cloudflare, chúng tôi vận hành nhiều sản phẩm lưu trữ phân tán quy mô lớn (bao gồm cả CDN nổi tiếng của chúng tôi), vốn dựa vào việc sử dụng hiệu quả bộ nhớ đã triển khai để có thể tiếp tục phục vụ tất cả khách hàng.
Với suy nghĩ đó, chúng tôi đã tạo mẫu một phương pháp để mở rộng dung lượng bộ nhớ đệm hiệu dụng. Bằng cách mã hóa các tài nguyên đủ điều kiện bằng Zstandard bên trong Pingora, kiến trúc này đánh đổi một mức tăng CPU nhỏ để tiết kiệm đáng kể dung lượng lưu trữ và băng thông giữa các trung tâm dữ liệu.
Chúng tôi đã tạo mẫu một hệ thống có tên là Cache Transcoding, hệ thống mà tôi đã xây dựng trong thời gian thực tập tại Cloudflare như một phần của Chương trình thực tập 1.1.1.1. Khi một phản hồi đủ điều kiện đi vào bộ nhớ đệm, chúng tôi mã hóa nó bằng Zstandard (hay zstd) trước khi ghi vào đĩa. Chúng tôi giữ nguyên dạng nén đó trong khi tài nguyên nằm trong bộ nhớ đệm và di chuyển giữa các trung tâm dữ liệu thông qua Tiered Cache, sau đó giải mã nó trước khi gửi phản hồi cho khách hàng.
Trong các thử nghiệm ban đầu, quá trình mã hóa này đã thu nhỏ các tài nguyên đủ điều kiện xuống trung bình 1/3 kích thước gốc trên đĩa. Chi phí CPU tăng thêm ước tính trong proxy hướng nguồn của chúng tôi là nhỏ, nhưng đó là sự đánh đổi. Một mức tăng CPU nhỏ mang lại cho Cloudflare dung lượng bộ nhớ đệm hiệu dụng lên tới hàng petabyte và giảm lượng dữ liệu truyền tải giữa các trung tâm dữ liệu của chúng tôi. Chi phí mã hóa chỉ phải trả một lần khi tài nguyên đi vào bộ nhớ đệm. Việc tiết kiệm lưu trữ và băng thông sẽ tiếp tục diễn ra mỗi khi tài nguyên đó được tái sử dụng.
Zstandard là gì?
Zstandard, hay zstd, là một thuật toán nén không mất dữ liệu (lossless) được phát triển bởi Yann Collet tại Facebook và được mở mã nguồn vào năm 2016. "Không mất dữ liệu" có nghĩa là sau khi dữ liệu nén được giải mã, mọi byte đều giống hệt với bản gốc. Chúng ta có thể thay đổi cách một tài nguyên được biểu diễn trên đĩa mà không làm thay đổi chính tài nguyên đó.
Zstd được thiết kế để cân bằng giữa tỷ lệ nén và tốc độ. Trong các thử nghiệm nén trên trình duyệt trước đây của chúng tôi, nó nén dữ liệu 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. Sự cân bằng đó rất quan trọng vì Cache Transcoding sẽ xử lý một lượng lớn lưu lượng truy cập, do đó cả việc mã hóa và giải mã đều cần phải duy trì tốc độ nhanh.
Bản mẫu sử dụng zstd cấp độ 3, mang lại cho chúng tôi hầu hết lợi ích về nén mà không biến việc lấp đầy bộ nhớ đệm thành nút thắt cổ chai về CPU.
Theo truyền thống, Cloudflare lưu trữ một tài nguyên bằng cách sử dụng mã hóa nội dung (content encoding) do nguồn cung cấp. Nếu một nguồn gửi phản hồi không nén, chúng tôi lưu trữ các byte không nén đó trên đĩa và truyền chúng giữa các trung tâm dữ liệu ở cùng định dạng đó. Cache Transcoding bổ sung tính năng nén ngay bên trong bộ nhớ đệm.
Không phải mọi thứ đều đáng để nén
Transcoding không có nghĩa là nén mọi thứ. Hình ảnh, video và phông chữ thường đã được nén sẵn. Trong mẫu lưu lượng truy cập của chúng tôi, phân khúc phương tiện này chiếm 21,4% số yêu cầu nhưng lại chiếm tới 63,3% dung lượng byte. Việc nén lại chúng sẽ chỉ gây lãng phí CPU vô ích.
Văn bản có thể nén được thì khác. HTML, JSON, CSS và JavaScript chiếm 67,3% số yêu cầu và 22,3% dung lượng byte. Trong phân khúc văn bản đó, khoảng 71% đến mà không được nén (Content-Encoding chưa được thiết lập) và chúng nén rất hiệu quả.
Trong tập dữ liệu thử nghiệm có kiểm soát của chúng tôi, các tài nguyên đủ điều kiện đã được nén khoảng 2,8 lần.
Chỉ số
Giá trị
Tỷ lệ nén
2,834x
Chi phí mã hóa
4,31 ns mỗi byte, khoảng 232 MB/s, trả một lần mỗi lần nạp
Chi phí giải mã
1,56 ns mỗi byte, khoảng 641 MB/s, trả mỗi lần phục vụ
Mã hóa tốn kém hơn trên mỗi byte, nhưng tài nguyên được phục vụ thường xuyên hơn nhiều so với số lần được nạp vào.
Bằng cách thay đổi cách biểu diễn tài nguyên, phần cứng hiện có có thể lưu trữ nhiều nội dung khách hàng hơn.
Ít byte hơn trên đĩa có nghĩa là mỗi máy chủ có thể lưu giữ nhiều đối tượng hơn. Điều này làm tăng mật độ bộ nhớ đệm và giảm khả năng nội dung hữu ích bị loại bỏ do một bản biểu diễn không nén chiếm nhiều không gian hơn mức cần thiết.
Bản biểu diễn nhỏ hơn cũng hữu ích khi tài nguyên di chuyển qua Tiered Cache vì nó làm giảm dữ liệu truyền tải giữa các trung tâm dữ liệu của Cloudflare, giúp việc sử dụng đường truyền trục (backbone) hiệu quả hơn.
Trả chi phí nén một lần
Nén không bao giờ là miễn phí. Cả mã hóa và giải mã đều sử dụng CPU, vì vậy câu hỏi quan trọng là liệu việc tiết kiệm byte có xứng đáng với chi phí xử lý hay không.
Ở zstd cấp độ 3 (thường là mức cân bằng mặc định giữa tốc độ và kích thước nén đầu ra), mô hình của chúng tôi giữ chi phí CPU tăng thêm ở mức vài phần trăm dựa trên các giả định về lưu lượng và tái sử dụng mà chúng tôi đã thử nghiệm.
Ban đầu, chúng tôi cân nhắc việc giới hạn transcoding chỉ cho các nội dung phổ biến, vì các tài nguyên "nóng" được tái sử dụng nhiều hơn, nhưng điều đó không mang lại hiệu quả. Việc giải mã diễn ra mỗi khi tài nguyên được phục vụ, vì vậy việc giới hạn tính năng này chỉ cho các nội dung "nóng" nhất đã làm giảm khả năng tiết kiệm lưu trữ mà không cắt giảm được lượng CPU tương ứng.
Chính sách đơn giản hơn lại hoạt động tốt hơn. Transcoding tất cả văn bản có thể nén đủ điều kiện từ 4 kibibytes (KiB) trở lên đã đạt được gần như toàn bộ lợi ích lưu trữ đo lường được, trong khi vẫn nằm trong ngân sách CPU cho phép.
Cách thức hoạt động của Cache Transcoding
Khi xảy ra cache miss (trượt bộ nhớ đệm), proxy dựa trên Pingora của chúng tôi sẽ mã hóa phần thân bằng zstd trước khi ghi vào đĩa. Siêu dữ liệu bộ nhớ đệm ghi lại rằng bản biểu diễn được lưu trữ đã bị nén và bảo toàn độ dài nội dung gốc. Trước khi phản hồi rời khỏi proxy, phần thân được giải mã trở lại định dạng gốc ban đầu.
Khi xảy ra cache hit (trúng bộ nhớ đệm), đối tượng zstd được lưu trữ sẽ được đọc từ đĩa và giải mã. Với Tiered Cache, bản biểu diễn nén được truyền từ tầng trên xuống tầng dưới ở dạng nén. Việc giải mã chỉ diễn ra ở chặng hướng về phía khách hàng.
Khi xảy ra full cache miss (trượt hoàn toàn), tầng trên sẽ lấy các byte gốc từ nguồn. Các byte đó được mã hóa một lần, lưu trữ dưới dạng zstd và truyền đến tầng dưới ở dạng nén. Tầng dưới cũng lưu trữ bản biểu diễn zstd, sau đó giải mã nó cho đường dẫn yêu cầu.
Nếu tầng dưới bị trượt nhưng tầng trên đã có đối tượng, nguồn sẽ không bị ảnh hưởng. Đối tượng nén di chuyển trực tiếp giữa các tầng bộ nhớ đệm. Nó vẫn ở dạng nén trên đường truyền và trên đĩa, sau đó được giải mã một lần tại tầng dưới.
Nếu tầng dưới đã có đối tượng, không cần truyền tải mạng hoặc mã hóa nào cả. Tầng dưới đọc các byte zstd từ đĩa, giải mã chúng và chuyển tài nguyên gốc đi tiếp.
Đánh dấu mã hóa lưu trữ giúp ngăn chặn một đối tượng bị mã hóa nhiều lần. Một tầng bộ nhớ đệm nhận đối tượng từ một tầng khác có thể thấy rằng nó đã được lưu trữ bằng zstd và giữ nguyên ở dạng đó.
Tại sao chúng tôi chỉ transcode một số loại văn bản nhất định
Thao tác nén nhanh nhất là thao tác mà chúng ta không cần phải thực hiện. Do đó, Cache Transcoding sử dụng một loạt các kiểm tra điều kiện để tránh các nội dung không có khả năng mang lại lợi ích.
Bài viết được AI dịch và tổng hợp tự động từ Cloudflare Blog. Liên kết bài gốc ở phía trên. AIHOT.vn luôn dẫn nguồn đầy đủ — nếu bạn thấy điểm cần chỉnh sửa, hãy gửi ý kiến tại trang phản hồi.