From 965dccd4fc63078df21505e22560ceaa44a9780a Mon Sep 17 00:00:00 2001 From: Josh Bleecher Snyder Date: Tue, 13 Jul 2021 18:01:56 -0700 Subject: [PATCH] net/tstun: buffer outbound channel The handoff between tstun.Wrap's Read and poll methods is one of the per-packet hotspots. It shows up in pprof. Making outbound buffered increases throughput. It is hard to measure exactly how much, because the numbers are highly variable, but I'd estimate it at about 1%, using the best observed max throughput across three runs. Signed-off-by: Josh Bleecher Snyder --- net/tstun/wrap.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/net/tstun/wrap.go b/net/tstun/wrap.go index 5bebf16ca..5297b4da7 100644 --- a/net/tstun/wrap.go +++ b/net/tstun/wrap.go @@ -153,9 +153,10 @@ func Wrap(logf logger.Logf, tdev tun.Device) *Wrapper { // a goroutine should not block when setting it, even with no listeners. bufferConsumed: make(chan struct{}, 1), closed: make(chan struct{}), - outbound: make(chan tunReadResult), - eventsUpDown: make(chan tun.Event), - eventsOther: make(chan tun.Event), + // outbound is buffered as an optimization. + outbound: make(chan tunReadResult, 1), + eventsUpDown: make(chan tun.Event), + eventsOther: make(chan tun.Event), // TODO(dmytro): (highly rate-limited) hexdumps should happen on unknown packets. filterFlags: filter.LogAccepts | filter.LogDrops, }