From 42214c32875009905a4b37d846cf9a457a25c4f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=A3=8E=E6=89=87=E6=BB=91=E7=BF=94=E7=BF=BC?= Date: Mon, 22 Dec 2025 02:44:45 +0000 Subject: [PATCH] Use bufferSize to calc channel buffer --- common/buf/copy.go | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/common/buf/copy.go b/common/buf/copy.go index 55881ebd6..6219b30bc 100644 --- a/common/buf/copy.go +++ b/common/buf/copy.go @@ -5,6 +5,7 @@ import ( "sync" "time" + "github.com/xtls/xray-core/features/policy" "github.com/xtls/xray-core/common/errors" "github.com/xtls/xray-core/common/signal" "github.com/xtls/xray-core/features/stats" @@ -141,8 +142,16 @@ func CopyOnceTimeout(reader Reader, writer Writer, timeout time.Duration) error } func copyV(r *SingleReader, w Writer, handler *copyHandler) error { - // max packet len is 8192, so buffer channel size is 512, about 4MB memory usage - cache := make(chan *Buffer, 512) + // channel buffer size is maxBuffer/maxPerPacketLen (ignore the case of many small packets) + // default buffer size: + // 0 in ARM MIPS MIPSLE + // 4kb in ARM64 MIPS64 MIPS64LE + // 512kb in others + channelBuffer := (policy.SessionDefault().Buffer.PerConnection)/Size + if channelBuffer <= 0 { + channelBuffer = 4 + } + cache := make(chan *Buffer, channelBuffer) stopRead := make(chan struct{}) var rErr error var wErr error