Skip to content

Benchmark Report — Join Latency

2026-08-24

Summary

Time from a node's daemons starting to its first successful write, and what that join does to the throughput of the nodes already running under load — etcfs only (scripts/bench/compare/bench-join-latency.sh). A joining node claims its own arena, so the expected impact on the survivors is none, and that claim is what this measures. GFS2 has no equivalent number to take: journals are allocated at mkfs, one per provisioned node, so a node past that count does not join slowly, it fails to join at all.

The departing node now leaves cleanly — SIGTERM plus unmount — and a clean leave no longer causes a fencing detach, since a node that shuts down gracefully gives back its locks and arenas and announces the departure in the same transaction that removes it from membership. An earlier figure for this scenario included an EBS reattach that this path no longer triggers, which is what the re-run was for.

Single isolated 3-node etcfs cluster.

Results

Metric 2026-08-24 2026-08-17 (with reattach)
Join time 6.685 s 4.492 s
Survivor baseline throughput 2.39 MiB/s 13.74 MiB/s
Survivor throughput during join 1.44 MiB/s 9.49 MiB/s
Survivor impact 39.75% 30.93%

Reading these numbers

The join itself is a process start, not a stall: 6.7 s from launching two daemons to a mount that answers a write. That is slower than the previous run's 4.5 s despite no longer paying for an EBS reattach, so the reattach was evidently not the dominant term — daemon start, etcd membership registration and arena claim are. Both runs are in the same 4–7 s band, which is the honest statement about this number.

The survivor-impact percentage should not be read as a throughput claim in either direction. The load here is 4 KiB random writes with direct=1 on a 1000-IOPS volume, so the survivors' baseline is 2.39 MiB/s — roughly 600 IOPS across two nodes — and a 40% "impact" is a swing of about 240 IOPS on a volume whose provisioned rate the two survivors and the joiner are all sharing. Under a load that small, a joiner doing its own first writes is enough to move the number, and nothing here separates "membership costs the cluster something" from "a third writer appeared on a 1000-IOPS volume".

The scenario that answers the same question under a load worth measuring is Elasticity, where the load is 1 MiB sequential writes at 258 MiB/s and the join costs the survivors 11.3% with a 0.09 s worst stall, and Leave and Rejoin Under Load, where three leave/rejoin cycles cost 3.0%. Those are the numbers to quote; this one is a join time.

Caveats

  • One run.
  • The survivor load is deliberately the small-random-write shape, which makes the percentage column noisy; see above.
  • etcfs only, by design — there is no comparable operation on GFS2.