From 64afa4a68d1096cec925a81f58c53d53b11f662f Mon Sep 17 00:00:00 2001 From: SunBK201 Date: Tue, 9 Dec 2025 11:52:48 +0800 Subject: [PATCH] feat: introduce buf pool and reduce reader bufffer size --- src/internal/server/base/server.go | 19 +++++++++++++------ src/internal/server/http/http.go | 7 +++++++ .../server/redirect/redirect_linux.go | 7 +++++++ src/internal/server/socks5/socks5.go | 7 +++++++ src/internal/server/tproxy/tproxy_linux.go | 7 +++++++ 5 files changed, 41 insertions(+), 6 deletions(-) diff --git a/src/internal/server/base/server.go b/src/internal/server/base/server.go index ee2829b..b12ba2b 100644 --- a/src/internal/server/base/server.go +++ b/src/internal/server/base/server.go @@ -8,6 +8,7 @@ import ( "net" "net/http" "strings" + "sync" "time" "github.com/hashicorp/golang-lru/v2/expirable" @@ -19,11 +20,12 @@ import ( ) type Server struct { - Cfg *config.Config - Rewriter *rewrite.Rewriter - Recorder *statistics.Recorder - Cache *expirable.LRU[string, struct{}] - SkipIpChan chan *net.IP + Cfg *config.Config + Rewriter *rewrite.Rewriter + Recorder *statistics.Recorder + Cache *expirable.LRU[string, struct{}] + SkipIpChan chan *net.IP + BufioReaderPool sync.Pool } func (s *Server) ServeConnLink(connLink *ConnLink) { @@ -48,7 +50,12 @@ func (s *Server) ServeConnLink(connLink *ConnLink) { } func (s *Server) ProcessLR(c *ConnLink) (err error) { - reader := bufio.NewReaderSize(c.LConn, 64*1024) + reader := s.BufioReaderPool.Get().(*bufio.Reader) + reader.Reset(c.LConn) + defer func() { + reader.Reset(nil) + s.BufioReaderPool.Put(reader) + }() defer func() { if err != nil { diff --git a/src/internal/server/http/http.go b/src/internal/server/http/http.go index e6282bf..38ef678 100644 --- a/src/internal/server/http/http.go +++ b/src/internal/server/http/http.go @@ -1,10 +1,12 @@ package http import ( + "bufio" "fmt" "io" "log/slog" "net/http" + "sync" "time" "github.com/hashicorp/golang-lru/v2/expirable" @@ -29,6 +31,11 @@ func New(cfg *config.Config, rw *rewrite.Rewriter, rc *statistics.Recorder) *Ser Rewriter: rw, Recorder: rc, Cache: expirable.NewLRU[string, struct{}](512, nil, 30*time.Minute), + BufioReaderPool: sync.Pool{ + New: func() interface{} { + return bufio.NewReaderSize(nil, 16*1024) + }, + }, }, so_mark: base.SO_MARK, } diff --git a/src/internal/server/redirect/redirect_linux.go b/src/internal/server/redirect/redirect_linux.go index 080cb92..6eebc47 100644 --- a/src/internal/server/redirect/redirect_linux.go +++ b/src/internal/server/redirect/redirect_linux.go @@ -3,10 +3,12 @@ package redirect import ( + "bufio" "errors" "fmt" "log/slog" "net" + "sync" "syscall" "time" @@ -34,6 +36,11 @@ func New(cfg *config.Config, rw *rewrite.Rewriter, rc *statistics.Recorder) *Ser Recorder: rc, Cache: expirable.NewLRU[string, struct{}](512, nil, 30*time.Minute), SkipIpChan: make(chan *net.IP, 512), + BufioReaderPool: sync.Pool{ + New: func() interface{} { + return bufio.NewReaderSize(nil, 16*1024) + }, + }, }, so_mark: base.SO_MARK, } diff --git a/src/internal/server/socks5/socks5.go b/src/internal/server/socks5/socks5.go index 5bdf0e9..826ece5 100644 --- a/src/internal/server/socks5/socks5.go +++ b/src/internal/server/socks5/socks5.go @@ -1,11 +1,13 @@ package socks5 import ( + "bufio" "bytes" "errors" "fmt" "log/slog" "net" + "sync" "syscall" "time" @@ -30,6 +32,11 @@ func New(cfg *config.Config, rw *rewrite.Rewriter, rc *statistics.Recorder) *Ser Rewriter: rw, Recorder: rc, Cache: expirable.NewLRU[string, struct{}](512, nil, 30*time.Minute), + BufioReaderPool: sync.Pool{ + New: func() interface{} { + return bufio.NewReaderSize(nil, 16*1024) + }, + }, }, so_mark: base.SO_MARK, } diff --git a/src/internal/server/tproxy/tproxy_linux.go b/src/internal/server/tproxy/tproxy_linux.go index dab24b9..8932a06 100644 --- a/src/internal/server/tproxy/tproxy_linux.go +++ b/src/internal/server/tproxy/tproxy_linux.go @@ -3,11 +3,13 @@ package tproxy import ( + "bufio" "context" "errors" "fmt" "log/slog" "net" + "sync" "syscall" "time" @@ -40,6 +42,11 @@ func New(cfg *config.Config, rw *rewrite.Rewriter, rc *statistics.Recorder) *Ser Recorder: rc, Cache: expirable.NewLRU[string, struct{}](512, nil, 30*time.Minute), SkipIpChan: make(chan *net.IP, 512), + BufioReaderPool: sync.Pool{ + New: func() interface{} { + return bufio.NewReaderSize(nil, 16*1024) + }, + }, }, so_mark: base.SO_MARK, tproxyFwMark: "0x1c9",