Storage and OS Tuning
The host settings used to keep Agave stable under network, storage, and file-descriptor pressure.
Storage and OS tuning is the host-level configuration that gives a validator enough disk throughput, network buffers, memory mappings, and file descriptors to keep up with the cluster. Agave performance problems are often storage, networking, or operating-system-limit problems before they are client problems.
Storage layout
Keep operating-system, ledger, and accounts data on separate storage where possible. Ledger and accounts are write-heavy and recovery-sensitive; fast local NVMe is the default target for those paths. Record disk growth per day for the actual workload and set capacity alerts before the disk becomes an incident.
The upstream Agave guidance also separates accounts, ledger, snapshots, and optionally the OS. Its baseline recommendation is high-end NVMe for accounts, ledger, and snapshots; accounts and ledger should not share a disk in a production validator because of their IO profile. See the Agave requirements for current hardware guidance.
Measure disk growth
Record a daily sample for every mounted path:
Do not publish a generic “GB per day” number until it is measured against a named network, version, enabled RPC indexes, snapshot retention policy, and transaction load. All of those inputs materially change disk growth.
Applied host limits
These values form a host-service baseline. A Kubernetes container does not receive a systemd unit or host PAM limits automatically, so verify effective limits from inside the actual validator container as part of its deployment acceptance.
| Setting | Value | Purpose |
|---|---|---|
net.core.rmem_default | 134217728 | Larger default UDP receive buffer. |
net.core.rmem_max | 134217728 | Larger maximum UDP receive buffer. |
net.core.wmem_default | 134217728 | Larger default UDP send buffer. |
net.core.wmem_max | 134217728 | Larger maximum UDP send buffer. |
vm.max_map_count | 1000000 | Allows the validator to create the memory mappings it needs. |
nofile soft and hard limit | 1000000 | Prevents file-descriptor exhaustion under a large workload. |
systemd LimitNOFILE | 1000000 for a host-managed service | Ensures the service receives the same limit. This is not, by itself, a Kubernetes container setting. |
The official validator setup additionally sets fs.nr_open=1000000 and recommends a memory-lock limit for the service/session. A containerized validator may require suitable capabilities and runtime limits to achieve the same result. Confirm all active limits from the process that starts Agave; writing a configuration file without reloading systemd or logging in again does not change an already-running process, and it does not prove the container inherited the intended limits.
For a Kubernetes validator, execute the equivalent ulimit -n and sysctl checks in the running container and record the result. Do not rely on the presence of the host script alone.
Additional checks
- Disable swap for validator hosts unless there is a deliberate, tested reason not to.
- Use a performance-oriented CPU governor and verify the setting survives reboot.
- Measure disk latency and throughput on the actual mounted paths, not only on an unused device.
- Alert on filesystem usage, inode pressure, IO wait, and validator restart count.
These settings are a baseline, not a substitute for capacity testing on the hardware that will run the node.
Failure signatures
| Symptom | First checks |
|---|---|
| Frequent leader-slot skips | CPU frequency/governor, VM steal time, network packet loss, and disk latency. |
| Validator refuses to start | vm.max_map_count, open-file limits, mount permissions, and available disk. |
| Slow catch-up or replay | Ledger/accounts IO saturation, snapshot source, and CPU contention. |
| Intermittent peer connectivity | UDP buffers, dynamic range firewall rules, public IP/NAT behavior, and NIC counters. |