Last reviewed: 2026-05-05.
This file is the durable replacement for old one-off benchmark output
directories. Keep raw benchmark runs out of the repo; rerun them into /tmp or
another artifact directory, then copy only stable findings here.
- File content now lives in external Redis content keys rather than inline inode hash fields.
- On Redis servers without Array support, files use external string keys
(
content_ref = "ext"). - On Redis servers with Array support, new and rewritten files prefer chunked
Redis Array content keys (
content_ref = "array"), while existingextfiles remain readable. - Byte-range reads and writes use
GETRANGE/SETRANGEforextfiles and chunked Array reads / writes forarrayfiles. - Sync uses chunked delta transfer for files above 1 MB, with 256 KB chunks and 16 chunks per Redis pipeline batch.
- The default sync file-size cap is 2 GB.
- The NFS write path includes the HSETNX create fast path and batched
SetAttrspath.
afs fs grep has two paths:
- Simple literal searches try the RediSearch-backed trigram index when Redis search commands are available and the index is ready.
- When RediSearch is unavailable and a file is Array-backed, the client can use
ARGREPas a conservative prefilter before loading full content for exact verification. - Regex, glob, and advanced grep options fall back to collecting candidate files and verifying content through the AFS client path.
Historical benchmark context from the removed task artifacts:
- On a 4,000-file markdown corpus (31.5 MiB), indexed literal searches were in the low tens of milliseconds once Redis 8 search was available.
- Regex-style escalation remained much slower than local
ripgrepbecause it still needed content verification over the AFS client path.
Latest local rerun on macOS/arm64, 4,000 markdown files, 31.5 MiB, 5 measured rounds:
- With Docker
redis:8and RediSearch available, indexedafs fs greptook 17.35 ms for a rare literal and 42.56 ms for a common literal. Local BSDgreptook 371.74 ms and 381.71 ms for the same searches;ripgreptook 37.99 ms and 41.10 ms. - Regex escalation still used the advanced non-indexed path:
afs fs greptook 1078.74 ms versus 213.16 ms for BSDgrepand 67.53 ms forripgrep. - On the existing local control plane at
http://127.0.0.1:8091, the backinglocalhost:6379Redis did not expose RediSearch commands. The same corpus imported through the control plane usedfast_backend_grepwithsearch_unavailable: literalafs fs grepwas about 187 ms, and regex escalation was about 196 ms. Treat those as non-indexed local-database numbers, not the indexed Redis 8 baseline.
The old NFS perf notes produced two changes that are now part of the codebase:
createFileIfMissinguses an HSETNX name claim instead of the older WATCH/MULTI flow.- NFS
SETATTRdispatches through a batchedSetAttrsfast path instead of separate chmod/chown/utimens calls when the filesystem supports it.
The remaining high-value benchmark target is not another raw output directory; it is a repeatable comparison after storage or sync behavior changes.
Markdown/search workload:
go run ./tests/bench_md_workloads --markdown-files 4000 --rounds 5 --output-dir /tmp/afs-bench-md-$(date +%Y%m%d)Mounted NFS comparison:
scripts/bench_compare.sh 5 /tmp/afs-perf-run-$(date +%Y%m%d-%H%M%S)After a meaningful rerun, summarize the stable result here rather than committing the generated CSV/JSON output.