From 2ec925ee25c59ffcce138c424bb540b55683486d Mon Sep 17 00:00:00 2001 From: Lucas Manning Date: Mon, 24 Oct 2022 16:58:12 -0700 Subject: [PATCH] Create buffer pooling blog. PiperOrigin-RevId: 483522945 --- website/_config.yml | 4 + .../2022-10-24-buffer-pooling-figure1.png | Bin 0 -> 21946 bytes .../2022-10-24-buffer-pooling-figure2.png | Bin 0 -> 55036 bytes website/blog/2022-10-24-buffer-pooling.md | 179 ++++++++++++++++++ website/blog/BUILD | 10 + 5 files changed, 193 insertions(+) create mode 100644 website/assets/images/2022-10-24-buffer-pooling-figure1.png create mode 100644 website/assets/images/2022-10-24-buffer-pooling-figure2.png create mode 100644 website/blog/2022-10-24-buffer-pooling.md diff --git a/website/_config.yml b/website/_config.yml index e394f39b4..6097a4062 100644 --- a/website/_config.yml +++ b/website/_config.yml @@ -25,6 +25,10 @@ defaults: layout: default analytics: "UA-150193582-1" authors: + lucasmanning: + name: Lucas Manning + email: lucasmanning@google.com + url: https://twitter.com/lucassmanning jsprad: name: Jeremiah Spradlin email: jsprad@google.com diff --git a/website/assets/images/2022-10-24-buffer-pooling-figure1.png b/website/assets/images/2022-10-24-buffer-pooling-figure1.png new file mode 100644 index 0000000000000000000000000000000000000000..6688cb0a76e7a43f3f6a5431c82438a39a927592 GIT binary patch literal 21946 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 C1Aw0Z literal 0 HcmV?d00001 diff --git a/website/blog/2022-10-24-buffer-pooling.md b/website/blog/2022-10-24-buffer-pooling.md new file mode 100644 index 000000000..32663d358 --- /dev/null +++ b/website/blog/2022-10-24-buffer-pooling.md @@ -0,0 +1,179 @@ +\# How we Eliminated 99% of gVisor Networking Memory Allocations with Enhanced +Buffer Pooling + +In an +[earlier blog post](https://gvisor.dev/blog/2020/04/02/gvisor-networking-security/) +about networking security, we described how and why gVisor implements its own +userspace network stack in the Sentry (gVisor kernel). In summary, we’ve +implemented our networking stack – aka Netstack – in Go to minimize exposure to +unsafe code and avoid using an unsafe Foreign Function Interface. With Netstack, +gVisor can do all packet processing internally and only has to enable a few host +I/O syscalls for near-complete networking capabilities. This keeps gVisor’s +exposure to host vulnerabilities as narrow as possible. + +Although writing Netstack in Go was important for runtime safety, up until now +it had an undeniable performance cost. iperf benchmarks showed Netstack was +spending between 20-30% of its processing time allocating memory and pausing for +garbage collection, a slowdown that limited gVisor’s ability to efficiently +sandbox networking workloads. In this blog we will show how we crafted a cure +for Netstack’s allocation addiction, reducing them by 99%, while also increasing +gVisor networking throughput by 30+%. + +![Figure 1](/assets/images/2022-10-24-buffer-pooling-figure1.png "Buffer pooling results.") + +## A Waste Management Problem + +Go guarantees a basic level of memory safety through the use of a garbage +collector (GC), which is described in great detail by the Go team +[here](https://tip.golang.org/doc/gc-guide). The Go runtime automatically tracks +and frees objects allocated from the heap, relieving the programmer of the often +painful and error-prone process of manual memory management. Unfortunately, +tracking and freeing memory during runtime comes at a performance cost. Running +the GC adds scheduling overhead, consumes valuable CPU time, and occasionally +pauses the entire program’s progress to track down garbage. + +Go’s GC is highly optimized, tunable, and sufficient for a majority of +workloads. Most of the other parts of gVisor happily use Go's GC with no +complaints. However, under high network stress, Netstack needed to aggressively +allocate buffers used for processing TCP/IP data and metadata. These buffers +often had short lifespans, and once the processing was done they were left to be +cleaned up by the GC. This meant Netstack was producing tons of garbage that +needed to be tracked and freed by GC workers. + +## Recycling to the Rescue + +Luckily, we weren't the only ones with this problem. This pattern of small, +frequently allocated and discarded objects was common enough that the Go team +introduced [`sync.Pool`](https://pkg.go.dev/sync#Pool) in Go1.3. `sync.Pool` is +designed to relieve pressure off the Go GC by maintaining a thread-safe cache of +previously allocated objects. `sync.Pool` can retrieve an object from the cache +if it exists or allocate a new one according to a user specified allocation +function. Once the user is finished with an object they can safely return it to +the cache to be reused again. + +While `sync.Pool` was exactly what we needed to reduce allocations, +incorporating it into Netstack wasn’t going to be as easy as just replacing all +our `make()`s with `pool.Get()`s. + +## Netstack Challenges + +Netstack uses a few different types of buffers under the hood. Some of these are +specific to protocols, like +[`segment`](https://github.com/google/gvisor/blob/master/pkg/tcpip/transport/tcp/segment.go) +for TCP, and others are more widely shared, like +[`PacketBuffer`](https://github.com/google/gvisor/blob/master/pkg/tcpip/stack/packet_buffer.go), +which is used for IP, ICMP, UDP, etc. Although each of these buffer types are +slightly different, they generally share a few common traits that made it +difficult to use `sync.Pool` out of the box: + +* The buffers were originally built with the assumption that a garbage + collector would clean them up automatically – there was little (if any) + effort put into tracking object lifetimes. This meant that we had no way to + know when it was safe to return buffers to a pool. +* Buffers have dynamic sizes that are determined during creation, usually + depending on the size of the packet holding them. A `sync.Pool` out of the + box can only accommodate buffers of a single size. One common solution to + this is to fill a pool with + [`bytes.Buffer`](https://pkg.go.dev/bytes#Buffer), but even a pooled + `bytes.Buffer` could incur allocations if it were too small and had to be + grown to the requested size. +* Netstack splits, merges, and clones buffers at various points during + processing (for example, breaking a large segment into smaller MTU-sized + packets). Modifying a buffer’s size during runtime could mean lots of + reallocating from the pool in a one-size-fits-all setup. This would limit + the theoretical effectiveness of a pooled solution. + +We needed an efficient, low-level buffer abstraction that had answers for the +Netstack specific challenges and could be shared by the various intermediate +buffer types. By sharing a common buffer abstraction, we could maximize the +benefits of pooling and avoid introducing additional allocations while minimally +changing any intermediate buffer processing logic. + +## Introducing bufferv2 + +Our solution was +[bufferv2](https://github.com/google/gvisor/tree/master/pkg/bufferv2). Bufferv2 +is a non-contiguous, reference counted, pooled, copy-on-write, buffer-like data +structure. + +Internally, a bufferv2 `Buffer` is a linked list of `View`s. Each `View` has +start/end indices and holds a pointer to a `Chunk`. A `Chunk` is a +reference-counted structure that’s allocated from a pool and holds data in a +byte slice. There are several `Chunk` pools, each of which allocates chunks with +different sized byte slices. These sizes start at 64 and double until 64k. + +![Figure 2](/assets/images/2022-10-24-buffer-pooling-figure2.png "bufferv2 implementation diagram.") + +The design of bufferv2 has a few key advantages over simpler object pooling: + +* **Zero-cost copies and copy-on-write**: Cloning a Buffer only increments the + reference count of the underlying chunks instead of reallocating from the + pool. Since buffers are much more frequently read than modified, this saves + allocations. In the cases where a buffer is modified, only the chunk that’s + changed has to be cloned, not the whole buffer. +* **Fast buffer transformations**: Truncating and merging buffers or appending + and prepending Views to Buffers are fast operations. Thanks to the + non-contiguous memory structure these operations are usually as quick as + adding a node to a linked list or changing the indices in a View. +* **Tiered pools**: When growing a Buffer or appending data, the new chunks + come from different pools of previously allocated chunks. Using multiple + pools means we are flexible enough to efficiently accommodate packets of all + sizes with minimal overhead. Unlike a one-size-fits-all solution, we don't + have to waste lots of space with a chunk size that is too big or loop + forever allocating small chunks. + +## Trade-offs + +Shifting Netstack to bufferv2 came with some costs. To start, rewriting all +buffers to use bufferv2 was a sizable effort that took many months to fully roll +out. Any place in Netstack that allocated or used a byte slice needed to be +rewritten. Reference counting had to be introduced so all the aforementioned +intermediate buffer types (`PacketBuffer`, `segment`, etc) could accurately +track buffer lifetimes, and tests had to be modified to ensure reference +counting correctness. + +In addition to the upfront cost, the shift to bufferv2 also increased the +engineering complexity of future Netstack changes. Netstack contributors must +adhere to new rules to maintain memory safety and maximize the benefits of +pooling. These rules are strict – there needs to be strong justification to +break them. They are as follows: + +* Never allocate a byte slice; always use `NewView()` instead. +* Use a `View` for simple data operations (e.g writing some data of a fixed + size) and a `Buffer` for more complex I/O operations (e.g appending data of + variable size, merging data, writing from an `io.Reader`). +* If you need access to the contents of a `View` as a byte slice, use + `View.AsSlice()`. If you need access to the contents of a `Buffer` as a byte + slice, consider refactoring, as this will cause an allocation. +* Never write or modify the slices returned by `View.AsSlice()`; they are + still owned by the view. +* Release bufferv2 objects as close to where they're created as possible. This + is usually most easily done with defer. +* Document function ownership of bufferv2 object parameters. If there is no + documentation, it is assumed that the function does not take ownership of + its parameters. +* If a function takes ownership of its bufferv2 parameters, the bufferv2 + objects must be cloned before passing them as arguments. +* All new Netstack tests must enable the leak checker and run a final leak + check after the test is complete. + +## Give it a Try + +Bufferv2 is enabled by default as of +[gVisor 20221017](https://github.com/google/gvisor/releases/tag/release-20221017.0), +and will be rolling out to +[GKE Sandbox](https://cloud.google.com/kubernetes-engine/docs/concepts/sandbox-pods) +soon, so no action is required to see a performance boost. Network-bound +workloads, such as web servers or databases like Redis, are the most likely to +see benefits. All the code implementing bufferv2 is public +[here](https://github.com/google/gvisor/tree/master/pkg/bufferv2), and +contributions are welcome! If you’d like to run the iperf benchmark for +yourself, you can run: + +``` +make run-benchmark BENCHMARKS_TARGETS=//test/benchmarks/network:iperf_test \ + RUNTIME=your-runtime-here BENCHMARKS_OPTIONS=-test.benchtime=60s +``` + +in the base gVisor directory. If you experience any issues, please feel free to +let us know at [gvisor.dev/issues](https://github.com/google/gvisor/issues). diff --git a/website/blog/BUILD b/website/blog/BUILD index 7c1fed439..65fcefbb8 100644 --- a/website/blog/BUILD +++ b/website/blog/BUILD @@ -80,6 +80,16 @@ doc( permalink = "/blog/2022/08/01/threat-detection/", ) +doc( + name = "buffer_pooling", + src = "2022-10-24-buffer-pooling.md", + authors = [ + "lucasmanning", + ], + layout = "post", + permalink = "/blog/2022/10/24/buffer-pooling/", +) + docs( name = "posts", deps = [