diff --git a/interface.go b/interface.go index 0402e68b..d903a8e7 100644 --- a/interface.go +++ b/interface.go @@ -41,6 +41,7 @@ type InterfaceConfig struct { DropLocalBroadcast bool DropMulticast bool routines int + batchSize int MessageMetrics *MessageMetrics version string relayManager *relayManager @@ -80,6 +81,7 @@ type Interface struct { dropLocalBroadcast bool dropMulticast bool routines int + batchSize int disconnectInvalid atomic.Bool closed atomic.Bool // cpuAffinity, when non-empty, names the CPUs each TUN reader goroutine @@ -209,6 +211,7 @@ func NewInterface(ctx context.Context, c *InterfaceConfig) (*Interface, error) { dropLocalBroadcast: c.DropLocalBroadcast, dropMulticast: c.DropMulticast, routines: c.routines, + batchSize: c.batchSize, version: c.version, writers: make([]udp.Conn, c.routines), readers: make([]tio.Queue, c.routines), @@ -286,11 +289,11 @@ func (f *Interface) activate() error { // is on, everything else (and either lane disabled) falls // through to passthrough so non-IP / non-TCP-UDP traffic still // reaches the TUN. - arena := batch.NewArena(batch.DefaultMultiArenaCap) + arena := batch.NewArena(max(f.batchSize, 1) * 65535) f.batchers[i] = batch.NewMultiCoalescer(f.readers[i], f.l, arena, caps.TSO, caps.USO) } else { - arena := batch.NewArena(batch.DefaultPassthroughArenaCap) - f.batchers[i] = batch.NewPassthrough(f.readers[i], arena) + arena := batch.NewArena(max(f.batchSize, 1) * udp.MTU) + f.batchers[i] = batch.NewPassthrough(f.readers[i], f.batchSize, arena) } } diff --git a/main.go b/main.go index 0258fec3..183e0eb9 100644 --- a/main.go +++ b/main.go @@ -221,6 +221,7 @@ func Main(c *config.C, configTest bool, buildVersion string, l *slog.Logger, dev DropLocalBroadcast: c.GetBool("tun.drop_local_broadcast", false), DropMulticast: c.GetBool("tun.drop_multicast", false), routines: routines, + batchSize: c.GetInt("listen.batch", 64), MessageMetrics: messageMetrics, version: buildVersion, relayManager: NewRelayManager(ctx, l, hostMap, c), diff --git a/overlay/batch/passthrough.go b/overlay/batch/passthrough.go index 6b216005..db62ab85 100644 --- a/overlay/batch/passthrough.go +++ b/overlay/batch/passthrough.go @@ -21,10 +21,10 @@ const passthroughBaseNumSlots = 128 // standalone Passthrough batcher: 128 slots × udp.MTU ≈ 1.1 MiB. const DefaultPassthroughArenaCap = passthroughBaseNumSlots * udp.MTU -func NewPassthrough(w io.Writer, arena *Arena) *Passthrough { +func NewPassthrough(w io.Writer, slots int, arena *Arena) *Passthrough { return &Passthrough{ out: w, - slots: make([][]byte, 0, passthroughBaseNumSlots), + slots: make([][]byte, 0, slots), arena: arena, } }