Files
Brad Fitzpatrick 0cd86f6b26 net/msgx, net/batching, wgengine/magicsock: batch UDP syscalls on macOS
Add net/msgx, which sends and receives multiple datagrams per system call
on macOS using the kernel's recvmsg_x and sendmsg_x entry points, the
Darwin counterparts of recvmmsg and sendmmsg. They are declared only in
xnu's private socket_private.h, so msgx invokes them as raw system calls
by number rather than through libSystem. That keeps their names out of
the binary, returns errno reliably from the trap itself, and avoids a cgo
transition per call. The calls need no privileges, but msgx.Available
limits their use: never in a sandboxed App Store process (Tailscale's own
GUI builds, detected by bundle ID, or a third-party app embedding tsnet,
detected by the App Sandbox's APP_SANDBOX_CONTAINER_ID environment
variable), and only after a loopback self-test with the running kernel
passes, since Apple does not promise these numbers or layouts stay
stable. Otherwise callers fall back to one datagram per call. Whether the
self-test ran, whether it passed, and which step failed are exported as
client metrics so a kernel change in the wild is visible.

On top of it, add a Darwin batching.Conn: reads are batched on every
socket (the main magicsock sockets included); writes are batched only on
connected sockets, since sendmsg_x takes no per-message destination,
which is what the per-peer connected sockets are for. connBind.BatchSize
now comes from batching.MaxBatchSize rather than a GOOS switch.

Measured between two M5 Pro Mac minis on a 10 Gbps LAN (iperf3 over
Tailscale, 10 second runs, tailscaled CPU seconds sender/receiver), with
per-packet utun I/O still in place:

  baseline                         1.37 Gbps   29.3s / 22.1s
  connected sockets only           1.41 Gbps   24.8s / 15.6s
  connected sockets + msgx         1.44 Gbps   25.3s /  9.4s

Throughput is bounded by the utun path (addressed separately); receiver
CPU drops by more than half here.

Three debug knobs (TS_DEBUG_MSGX, TS_DEBUG_MSGX_RX_MAIN,
TS_DEBUG_MSGX_BATCHSIZE) remain for evaluation.

Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
Change-Id: I4e9b7d2c8a1f5063b9e2d7c4a8f1e6b3d5c2a9f7
2026-09-25 19:12:47 +00:00
..
2026-07-10 14:26:11 -07:00
2026-07-10 14:26:11 -07:00
2026-07-10 14:26:11 -07:00