Make reader and writer buffers configurable #2014
Merged
+143
−77
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Replace global sync pools with per-DB pools and make reader and writer buffers configurable.
Default buffer sizes: 1Mb for reader buffer, 64Kb for writer buffer.
Context:
DB connections are pooled, usually there are not much of them available, so this is a resource used by goroutines, which have to wait for their turn in order to get a connection and use it before returning it back to the pool.
Before getting into the waiting line every goroutine allocates a read and a write buffer from the sync.Pool of buffers.
Currently hardcoded reader buffer size is 1Mb, so when 1000 goroutines wait in the queue, you get 1000Mb of buffers pre-allocated. So when an application unexpectedly gets a spike of traffic and all the database connections are being used, we don't get request timeouts as one could be expecting, the application is being OOM-killed instead.
The patch addresses this issue by trading some allocations and (probably, though my benchmarks don't really show it) latency for the ability to serve more simultaneous connections.