From b79bb082abca3703d8dbcfebfc1049d04b1ba1f7 Mon Sep 17 00:00:00 2001 From: nnbcccscdscdsc <2709767634@qq.com> Date: Tue, 24 Mar 2026 13:35:40 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E8=AE=BE=E7=BD=AE=E7=BC=93=E5=86=B2?= =?UTF-8?q?=E5=8C=BAbuffer=EF=BC=8C=E8=AE=BE=E7=BD=AE=E8=B6=B3=E5=A4=9F?= =?UTF-8?q?=E5=A4=A7=E7=9A=84=20oob=20buffer=20=E6=9D=A5=E6=8E=A5=E6=94=B6?= =?UTF-8?q?=E6=8E=A7=E5=88=B6=E6=B6=88=E6=81=AF=EF=BC=8C=E8=B0=83=E7=94=A8?= =?UTF-8?q?=20recvmsg=20=E4=BB=8E=20errqueue=20=E8=AF=BB=E4=B8=80=E6=9D=A1?= =?UTF-8?q?=E6=B6=88=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/internal/transport/tcp_linux.go | 21 ++++++++++++++++++++- cmd/internal/transport/tcp_linux_test.go | 2 +- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/cmd/internal/transport/tcp_linux.go b/cmd/internal/transport/tcp_linux.go index e753791..6578bf1 100644 --- a/cmd/internal/transport/tcp_linux.go +++ b/cmd/internal/transport/tcp_linux.go @@ -15,7 +15,8 @@ import ( ) const ( - linuxTimestampControlBufferSize = 256 // 控制消息缓冲区。 + linuxTimestampControlBufferSize = 2560 // 控制消息缓冲区。 + linuxSocketWriteBufferSize = 10 * 1024 * 1024 // 请求把 socket 发送缓冲区调到 10 MiB。 linuxTXTimestampWaitTimeout = 250 * time.Millisecond // 等待 TX 时间戳的上限。 linuxTXTimestampPollInterval = time.Millisecond // 轮询 errqueue 的间隔。 linuxDataPollInterval = time.Millisecond // 轮询普通收发的间隔。 @@ -88,6 +89,10 @@ func (c *TCPConn) initLinuxTimestamping() error { return fmt.Errorf("transport: missing syscall conn") } + if err := configureLinuxSocketWriteBuffer(rawConn); err != nil { + return fmt.Errorf("transport: configure socket write buffer: %w", err) + } + //socket是否可以成功打开 timestamping 取决于内核版本和配置,尝试多个 flag 组合直到成功或遇到非 EINVAL 错误。 if err := enableLinuxTimestamping(rawConn); err != nil { return fmt.Errorf("transport: enable linux timestamping: %w", err) @@ -97,6 +102,20 @@ func (c *TCPConn) initLinuxTimestamping() error { return nil } +// 设置 TCP缓冲区buffer size +func configureLinuxSocketWriteBuffer(rawConn syscall.RawConn) error { + var lastErr error + + err := rawConn.Control(func(fd uintptr) { + lastErr = syscall.SetsockoptInt(int(fd), syscall.SOL_SOCKET, syscall.SO_SNDBUF, linuxSocketWriteBufferSize) + }) + if err != nil { + return err + } + + return lastErr +} + // 给 socket开权限打开TX software timestamping。 func enableLinuxTimestamping(rawConn syscall.RawConn) error { flagCandidates := []int{ //不同linux版本可能支持不同的 flag 组合,尝试多个组合直到成功。 diff --git a/cmd/internal/transport/tcp_linux_test.go b/cmd/internal/transport/tcp_linux_test.go index ac1e46e..114f685 100644 --- a/cmd/internal/transport/tcp_linux_test.go +++ b/cmd/internal/transport/tcp_linux_test.go @@ -182,7 +182,7 @@ func TestSelectTXTimestampEventsFallsBackToHighestObservedID(t *testing.T) { func TestLinuxTimestampingDebugLoggerCapturesChunkAndErrqueueEvents(t *testing.T) { clientConn, serverConn := newTCPPair(t) - setTCPWriteBuffer(t, clientConn, 4096) + setTCPWriteBuffer(t, clientConn, 10*1024*1024) debugLogger := &recordingTXTimestampDebugLogger{} senderLogger := &recordingLogger{}