From a44867a9818d983b34f1ce2374346543b376a71c Mon Sep 17 00:00:00 2001 From: Kevin McConnell Date: Fri, 26 Jul 2024 14:32:03 +0100 Subject: [PATCH] Use a buffer pool when proxying Improves performance by reducing allocations. --- internal/server/proxy_buffer_pool.go | 25 +++++++++++++++++++++++++ internal/server/service.go | 1 + internal/server/target.go | 3 +++ 3 files changed, 29 insertions(+) create mode 100644 internal/server/proxy_buffer_pool.go diff --git a/internal/server/proxy_buffer_pool.go b/internal/server/proxy_buffer_pool.go new file mode 100644 index 0000000..9505b11 --- /dev/null +++ b/internal/server/proxy_buffer_pool.go @@ -0,0 +1,25 @@ +package server + +import "sync" + +func NewBufferPool(bufferSize int64) *BufferPool { + return &BufferPool{ + pool: sync.Pool{ + New: func() interface{} { + return make([]byte, bufferSize) + }, + }, + } +} + +type BufferPool struct { + pool sync.Pool +} + +func (b *BufferPool) Get() []byte { + return b.pool.Get().([]byte) +} + +func (b *BufferPool) Put(content []byte) { + b.pool.Put(content) +} diff --git a/internal/server/service.go b/internal/server/service.go index 0f97592..9a78b13 100644 --- a/internal/server/service.go +++ b/internal/server/service.go @@ -32,6 +32,7 @@ const ( DefaultHealthCheckTimeout = time.Second * 5 MaxIdleConnsPerHost = 100 + ProxyBufferSize = 32 * KB DefaultTargetTimeout = time.Second * 10 DefaultMaxRequestMemoryBufferSize = 1 * MB diff --git a/internal/server/target.go b/internal/server/target.go index 901e449..1663db6 100644 --- a/internal/server/target.go +++ b/internal/server/target.go @@ -251,7 +251,10 @@ func (t *Target) recordTargetNameForRequest(req *http.Request) { } func (t *Target) createProxyHandler() http.Handler { + bufferPool := NewBufferPool(ProxyBufferSize) + return &httputil.ReverseProxy{ + BufferPool: bufferPool, Rewrite: t.Rewrite, ErrorHandler: t.handleProxyError, Transport: &http.Transport{