Files
nfs/docs/_results/2026-09-22-wire-baseline.md
petrbalvin a9b8039ef7
Test / test (push) Successful in 2m4s
Release / gates (push) Successful in 2m5s
Release / build (amd64, freebsd) (push) Successful in 1m27s
Release / build (amd64, linux) (push) Successful in 1m22s
Release / build (amd64, netbsd) (push) Successful in 1m19s
Release / build (amd64, openbsd) (push) Successful in 1m20s
Release / build (arm64, darwin) (push) Successful in 1m21s
Release / build (arm64, freebsd) (push) Successful in 1m26s
Release / build (arm64, linux) (push) Successful in 1m25s
Release / build (arm64, netbsd) (push) Successful in 1m31s
Release / build (arm64, openbsd) (push) Successful in 1m27s
Release / build (loong64, linux) (push) Successful in 1m37s
Release / build (riscv64, linux) (push) Successful in 1m21s
Release / release (push) Successful in 40s
feat: full NFSv4.2 server and client in pure Go
Assisted-by: GLM 5.3 Flash
2026-09-21 18:51:17 +02:00

1.3 KiB

Measurement: the wire level baseline

  • Date: 2026-09-22
  • Machine: AMD Ryzen AI Max+ Pro 395 (32 threads), idle
  • Toolchain: go1.27.1, no build flags
  • Command: go test ./internal/nfs4server/ -run '^$' -bench=Wire -benchmem -count=5

Baseline

The commit 354760b, the head of development: the wire benchmarks are new, so this report is the baseline every later optimisation of the request path measures against. One benchmark iteration is one COMPOUND of the client library against the server handler over a loopback connection, sessions included.

Result

Median of five runs, same session, same machine.

Benchmark Throughput Latency Allocations
BenchmarkWireRead64K 805 MB/s 81.4 µs/op 78 allocs, 628 KiB/op
BenchmarkWireWrite64K 1062 MB/s 61.7 µs/op 76 allocs, 428 KiB/op
BenchmarkWireGetattr - 14.2 µs/op 85 allocs, 4.1 KiB/op
BenchmarkWireLookup - 15.0 µs/op 81 allocs, 4.4 KiB/op

READ of a 64 KiB chunk is slower than WRITE of the same chunk, and the allocation columns show where the request path spends its memory: around 80 allocations per COMPOUND regardless of the operation, on top of the data copies the read and write paths make. Both facts are the starting point for the optimisations of the request path; neither is a claim about any other setup.