| ▲ | We could save petabytes of cache storage with Zstandard and Pingora(blog.cloudflare.com) |
| 48 points by torutofu a day ago | 18 comments |
| |
|
| ▲ | zahlman 6 minutes ago | parent | next [-] |
| It could save PyPI petabytes per month of bandwidth, too. (But it seems like this is also caused by broken CI systems failing to cache things locally.) |
|
| ▲ | r3trohack3r 17 minutes ago | parent | prev | next [-] |
| Tangentially related, I applied a similar approach to compress the npm registry by over 90% on disk a few years back. Since most versions of a package are similar, you can delta encode them first and then compress them. The deltas are small and compress well as a collection with the original source files. For another use case, prior to compressing, I’ve applied a rolling hash to deterministically split the file. Then compressed the chunks and stored them in a CID filesystem. The result is that files that are largely similar share compressed chunks. There are a lot of things we can do to be substantially more efficient with the computers we have, but engineers often cost more than hardware. With recent supply chain constraints that calculus is changing! |
|
| ▲ | thinkindie 2 hours ago | parent | prev | next [-] |
| Why not serving files compressed if the client supports it even though the origin served an uncompressed file? |
| |
|
| ▲ | nijave 44 minutes ago | parent | prev | next [-] |
| Curious how this application scheme compares to filesystem + transport compression. You'd end up potentially compressing and decompressing more often but the higher software doesn't need to know what's happening and the compression happens in kernel space. ie btrfs You could also layer on out of band dedupe and probably push out cache updates with btrfs snapshots although maybe that ends too convoluted |
|
| ▲ | MayeulC 3 hours ago | parent | prev | next [-] |
| > We initially considered limiting transcoding to popular content Weird, I would have compressed cold content instead, if the goal was to save on CPU time during decode. |
| |
| ▲ | genxy 2 hours ago | parent | next [-] | | I would compress it all, and then selectively recompress at higher compression levels depending on the link, read frequency, diversity and capabilities of the clients. Zstd 3 to 5 is nearly free in terms of not bottlenecking disk or network. Zstd 12 to 19 gives amazing compression results and still result in speedups when reading from disk. It really is a wonderful all purpose compressor. One of the nice things about Zstd is if you try to compress an already compressed stream, it short circuits. So even if you are given say HVEC MP4 and run zstd -19 on it, it will "compress" immediately and not DOS your pipeline. | | |
| ▲ | mort96 an hour ago | parent [-] | | It has mostly become my go-to as well. Just wish it wasn't a Facebook product. |
| |
| ▲ | nijave 35 minutes ago | parent | prev | next [-] | | That part is a little bit confusing. I think they probably don't care about storage on the devices that do the compressing and are optimizing for quickly pushing hot content to edge locations. So the compression at the source saves bandwidth during the pushing to edge phase and allows the edges to hold more (reducing churn, further saving bandwidth back to the source). Put a different way, they're trying to make cache evictions cheaper (less bandwidth to refill) and less likely (bigger cache on same disk size) "Ignore cold assets" makes more sense with that framing Although if that's the case, the CPU statement still is a bit confusing. | |
| ▲ | articulatepang an hour ago | parent | prev [-] | | I agree! I came to the comment section to say exactly this. In any cache hierarchy you want to put colder content in cheaper but slower storage. Here, compression is the cheaper but slower form of storage. |
|
|
| ▲ | CodesInChaos 2 hours ago | parent | prev [-] |
| I'm confused by how this affects range requests. Without compression, those can be easily satisfied by reading the relevant part of the cached complete file. But how are they handled now? The article claims "range requests remain unchanged", but I don't see how that's possible if the cache no longer stores the uncompressed data. |
| |
| ▲ | gopalv an hour ago | parent | next [-] | | > I don't see how that's possible if the cache no longer stores the uncompressed data. Zstd has a seekable format for frames, similar to pigz --independent works. [1] - https://github.com/facebook/zstd/blob/dev/contrib/seekable_f... | |
| ▲ | pkulak 2 hours ago | parent | prev | next [-] | | I assume the entire resource needs to be decompressed first, then indexed into, served, and discarded. Well, actually, you could just decompress up to the end of the range. | | |
| ▲ | kccqzy an hour ago | parent | next [-] | | Actually zstd internally splits data into frames, and frames can indicate the decompressed data size. So if we control the compressor we can make it so that all frames have the size information; it isn’t exactly seekable but at least it will not need to decompress the resource. https://python-zstandard.readthedocs.io/en/latest/concepts.h... Given how fast zstd can decompress, this might not actually be a win. | |
| ▲ | CodesInChaos 2 hours ago | parent | prev | next [-] | | Which would have terrible performance for range requests starting late in a large file. For files that are frequently accessed that way, this could be prohibitive. You could split the file into independently compressed blocks as well. But that'd reduce compression rate and require adding some kind of index for seeking. Or they have an upper size limit for the file size they compress, since large files are rarely compressible text. In any case it is something that needs the be handled before going live with a compressed cache. But the article sounds like they simply didn't implement compressed caching for those cases, which makes no sense. | |
| ▲ | genxy 2 hours ago | parent | prev [-] | | Not with zstd, you could still support range requests. https://en.wikipedia.org/wiki/Zstd this whole subthread should take 10 minutes and glance over the spec and the capabilities. It would end a lot of wasted premature pontificating. | | |
| |
| ▲ | nijave an hour ago | parent | prev [-] | | Idk but btrfs and zfs manage to pull it off Seekable OCI (SOCI) uses an index so I imagine that's an option (real byte range a-b maps to compressed range x-y). Presumably you'd still need to read the header and some additional pieces |
|