Go 1.20 introduces an experimental concept of “arenas” for memory management, which can be used to improve the performance of your Go programs. In this blog post, we’ll take a look at:
- What are arenas
- How do they work
- How can you determine if your programs could benefit from using arenas
- How we used arenas to optimize one of our services
What Are Memory Arenas?#
Go is a programming language that utilizes garbage collection, meaning that the runtime automatically manages memory allocation and deallocation for the programmer. This eliminates the need for manual memory management, but it comes with a cost:
The Go runtime must keep track of every object that is allocated, leading to increased performance overhead.
In certain scenarios, such as when an HTTP server processes requests with large protobuf blobs (which contain many small objects), this can result in the Go runtime spending a significant amount of time tracking each of those individual allocations, and then deallocating them. As a result this also causes signicant performance overhead.
Arenas offer a solution to this problem, by reducing the overhead associated with many smaller allocations. In this protobuf blob example, a large chunk of memory (an arena) can be allocated before parsing enabling all parsed objects to then be placed within the arena and tracked as a collective unit.
Once parsing is completed, the entire arena can be freed at once, further reducing the overhead of freeing many small objects.
Identifying Code That Could Benefit From Arenas#
Any code that allocates many small objects could benefit from arenas. But how do you know if your code allocates too many? In our experience, the best way to do that is to profile your program.