Reference

Configuration fields

Complete public-beta field and default reference. Every field can be overridden as NEXIR__SECTION__FIELD; nested TLS fields use another double underscore.

Server

FieldEnvironment suffixDefault
redis_bindSERVER__REDIS_BIND127.0.0.1:6379
grpc_bindSERVER__GRPC_BIND127.0.0.1:50051
default_read_modeSERVER__DEFAULT_READ_MODELINEARIZABLE
enable_admin_commandsSERVER__ENABLE_ADMIN_COMMANDSfalse
max_connectionsSERVER__MAX_CONNECTIONS10,000
max_inflight_commands_globalSERVER__MAX_INFLIGHT_COMMANDS_GLOBAL100,000
max_inflight_commands_per_connectionSERVER__MAX_INFLIGHT_COMMANDS_PER_CONNECTION1,000
max_inflight_bytes_globalSERVER__MAX_INFLIGHT_BYTES_GLOBAL536,870,912
max_inflight_bytes_per_connectionSERVER__MAX_INFLIGHT_BYTES_PER_CONNECTION67,108,864
max_client_buffer_bytesSERVER__MAX_CLIENT_BUFFER_BYTES67,108,864
max_buffered_client_bytes_globalSERVER__MAX_BUFFERED_CLIENT_BYTES_GLOBAL536,870,912
client_idle_timeout_secsSERVER__CLIENT_IDLE_TIMEOUT_SECS300
client_write_timeout_secsSERVER__CLIENT_WRITE_TIMEOUT_SECS30
max_concurrent_reads_per_connectionSERVER__MAX_CONCURRENT_READS_PER_CONNECTION16
max_buffered_response_bytes_per_connectionSERVER__MAX_BUFFERED_RESPONSE_BYTES_PER_CONNECTION67,108,864
max_buffered_response_bytes_globalSERVER__MAX_BUFFERED_RESPONSE_BYTES_GLOBAL536,870,912

TLS

Prefix every suffix with NEXIR__. Each surface accepts mode=disabled|require; require needs readable, matching PEM files.

FieldEnvironment suffixDefault
server.tls.client.modeSERVER__TLS__CLIENT__MODEdisabled
server.tls.client.cert_fileSERVER__TLS__CLIENT__CERT_FILEempty
server.tls.client.key_fileSERVER__TLS__CLIENT__KEY_FILEempty
server.tls.client.ca_bundleSERVER__TLS__CLIENT__CA_BUNDLEempty
server.tls.cluster.modeSERVER__TLS__CLUSTER__MODEdisabled
server.tls.cluster.cert_fileSERVER__TLS__CLUSTER__CERT_FILEempty
server.tls.cluster.key_fileSERVER__TLS__CLUSTER__KEY_FILEempty
server.tls.cluster.ca_bundleSERVER__TLS__CLUSTER__CA_BUNDLEempty

Storage

FieldEnvironment suffixDefault
pathSTORAGE__PATH./data/nexir
block_cache_size_mbSTORAGE__BLOCK_CACHE_SIZE_MB0 (derived: 50% of the process target P; one block cache shared by the whole node)
write_buffer_size_mbSTORAGE__WRITE_BUFFER_SIZE_MB128
max_write_buffersSTORAGE__MAX_WRITE_BUFFERS4
enable_bloom_filtersSTORAGE__ENABLE_BLOOM_FILTERStrue
read_io_threadsSTORAGE__READ_IO_THREADS0 (auto: cores clamped 4–64)
read_io_queue_depthSTORAGE__READ_IO_QUEUE_DEPTH0 (auto: threads × 256)
read_inline_cache_fast_pathSTORAGE__READ_INLINE_CACHE_FAST_PATHfalse
write_io_threadsSTORAGE__WRITE_IO_THREADS2
write_io_queue_depthSTORAGE__WRITE_IO_QUEUE_DEPTH0 (auto: threads × 64)
cleanup_io_threadsSTORAGE__CLEANUP_IO_THREADS1
cleanup_io_queue_depthSTORAGE__CLEANUP_IO_QUEUE_DEPTH1
max_read_reply_bytesSTORAGE__MAX_READ_REPLY_BYTES0 (resolves to 67,108,864)
max_reader_pin_msSTORAGE__MAX_READER_PIN_MS300,000
max_snapshot_filesSTORAGE__MAX_SNAPSHOT_FILES10,000
max_snapshot_size_bytesSTORAGE__MAX_SNAPSHOT_SIZE_BYTES68,719,476,736 (64 GiB; must match across nodes)
max_archive_bytesSTORAGE__MAX_ARCHIVE_BYTES68,719,476,736 (64 GiB; must match across nodes)
level0_file_num_compaction_triggerSTORAGE__LEVEL0_FILE_NUM_COMPACTION_TRIGGER4 (RocksDB compaction and write-admission tuning, both databases, every column family; validation requires trigger < slowdown < stop)
level0_slowdown_writes_triggerSTORAGE__LEVEL0_SLOWDOWN_WRITES_TRIGGER20
level0_stop_writes_triggerSTORAGE__LEVEL0_STOP_WRITES_TRIGGER36
soft_pending_compaction_bytes_limitSTORAGE__SOFT_PENDING_COMPACTION_BYTES_LIMIT68,719,476,736 (64 GiB; below the hard limit)
hard_pending_compaction_bytes_limitSTORAGE__HARD_PENDING_COMPACTION_BYTES_LIMIT274,877,906,944 (256 GiB)
max_background_jobsSTORAGE__MAX_BACKGROUND_JOBS4 (at least 2; measured on i4i-class instances — re-measure on smaller hosts)
max_subcompactionsSTORAGE__MAX_SUBCOMPACTIONS2
max_concurrent_snapshot_receivesSTORAGE__MAX_CONCURRENT_SNAPSHOT_RECEIVES2
max_retained_snapshot_bytesSTORAGE__MAX_RETAINED_SNAPSHOT_BYTES274,877,906,944 (256 GiB; at least max_archive_bytes)
min_free_disk_bytesSTORAGE__MIN_FREE_DISK_BYTES1,073,741,824

Raft

FieldEnvironment suffixDefault
node_idRAFT__NODE_ID1
install_snapshot_timeout_msRAFT__INSTALL_SNAPSHOT_TIMEOUT_MS60,000
snapshot_install_margin_msRAFT__SNAPSHOT_INSTALL_MARGIN_MS10,000
snapshot_max_chunk_size_bytesRAFT__SNAPSHOT_MAX_CHUNK_SIZE_BYTES4,194,304
snapshot_policy_logsRAFT__SNAPSHOT_POLICY_LOGS100,000
max_in_snapshot_log_to_keepRAFT__MAX_IN_SNAPSHOT_LOG_TO_KEEP100,000 (the baseline below which catch-up retention never purges)
log_retention_budget_bytesRAFT__LOG_RETENTION_BUDGET_BYTES34,359,738,368 (32 GiB; must be positive; lower it on disks well below 200 GiB)
log_retention_retry_spacing_secsRAFT__LOG_RETENTION_RETRY_SPACING_SECS15 (must be positive and below the episode limit)
log_retention_episode_max_secsRAFT__LOG_RETENTION_EPISODE_MAX_SECS1,800 (must be positive)
log_retention_cooldown_secsRAFT__LOG_RETENTION_COOLDOWN_SECS1,800 (must be positive)
max_payload_entriesRAFT__MAX_PAYLOAD_ENTRIES300
max_pending_write_tasksRAFT__MAX_PENDING_WRITE_TASKS10,000
max_pending_write_bytesRAFT__MAX_PENDING_WRITE_BYTES268,435,456
reserved_system_write_tasksRAFT__RESERVED_SYSTEM_WRITE_TASKS64
reserved_system_write_bytesRAFT__RESERVED_SYSTEM_WRITE_BYTES8,388,608
max_inflight_proposalsRAFT__MAX_INFLIGHT_PROPOSALS512
reserved_system_inflight_proposalsRAFT__RESERVED_SYSTEM_INFLIGHT_PROPOSALS1
raft_log_append_batch_max_entriesRAFT__RAFT_LOG_APPEND_BATCH_MAX_ENTRIES256
raft_log_group_commit_enabledRAFT__RAFT_LOG_GROUP_COMMIT_ENABLEDtrue
raft_log_group_commit_max_entriesRAFT__RAFT_LOG_GROUP_COMMIT_MAX_ENTRIES256
raft_log_group_commit_max_bytesRAFT__RAFT_LOG_GROUP_COMMIT_MAX_BYTES4,194,304
raft_log_group_commit_max_delay_microsRAFT__RAFT_LOG_GROUP_COMMIT_MAX_DELAY_MICROS1,000
max_inflight_read_barriersRAFT__MAX_INFLIGHT_READ_BARRIERS10
max_queued_linearizable_readsRAFT__MAX_QUEUED_LINEARIZABLE_READS100,000
linearizable_read_batch_linger_microsRAFT__LINEARIZABLE_READ_BATCH_LINGER_MICROS100
membership_preflight_timeout_msRAFT__MEMBERSHIP_PREFLIGHT_TIMEOUT_MS3,000
membership_change_timeout_msRAFT__MEMBERSHIP_CHANGE_TIMEOUT_MS30,000
add_learner_catchup_timeout_msRAFT__ADD_LEARNER_CATCHUP_TIMEOUT_MS300,000
transfer_leader_timeout_msRAFT__TRANSFER_LEADER_TIMEOUT_MS10,000
heartbeat_interval_msRAFT__HEARTBEAT_INTERVAL_MS1,000
election_timeout_min_msRAFT__ELECTION_TIMEOUT_MIN_MS3,000
election_timeout_max_msRAFT__ELECTION_TIMEOUT_MAX_MS5,000

Memory

A node plans its memory once at startup from T, the smaller of the host's memory and any memory-cgroup limit that applies. Every value is in bytes and 0 means derived. These are planned targets and capacities, not hard ceilings on resident memory. A plan that cannot fit stops the node before any database opens, with a message that begins memory budget: and names the setting to change.

FieldEnvironment suffixDefault
memory.process_target_bytesMEMORY__PROCESS_TARGET_BYTES0 (derived: 75% of T; never above T)
memory.state_memtable_bytesMEMORY__STATE_MEMTABLE_BYTES0 (derived: 75% of the smaller of P/8 and 2 GiB)
memory.log_memtable_bytesMEMORY__LOG_MEMTABLE_BYTES0 (derived: the remaining quarter of that share)
memory.reserved_headroom_bytesMEMORY__RESERVED_HEADROOM_BYTES0 (derived: what remains of P after the cache and memtables; must be above 0)

With the other defaults, the client response allowance needs a process target of about 4.4 GB (host memory of about 5.9 GB). A 4 GiB node stops at startup until server.max_connections, server.max_inflight_commands_global or server.max_buffered_response_bytes_global is lowered. Under memory pressure a leader refuses new writes with -TRYAGAIN memory pressure; request not submitted; a refused write has no effect and can be retried.

Top level, Prometheus, and logging

Top-level accept_terms (default false) is a noninteractive acceptance mechanism for the Nexir Binary License and Use Terms in Official Binaries; NEXIR_ACCEPT_TERMS=1 is the usual container and automation equivalent. prometheus.bind / NEXIR__PROMETHEUS__BIND defaults to 127.0.0.1:9090. NEXIR__PROMETHEUS__PORT is deprecated. RUST_LOG controls tracing and defaults to info.

The client response budget

Before a node allocates memory for a reply, it reserves that memory from one node-wide budget, server.max_buffered_response_bytes_global (512 MiB by default). Reads, the previous value returned by SET … GET, and large operational replies all draw on it. When there is no room the request is refused at once: a read gets -ERR read refused: response memory not available, SET … GET gets -ERR Server overloaded, nothing is changed, and the client can retry. Startup requires the budget to hold one maximum-size value (191,890,432 bytes) and the whole response allowance to fit in half of the reserved headroom. max_buffered_response_bytes_per_connection still paces one connection's writes. The budget's state is exported as nexir_client_response_budget_bytes, nexir_client_response_reserved_bytes and nexir_client_response_refused_total{path}.

Before tuningKeep auto-sized I/O pools unless metrics show queue pressure and the host has CPU, memory, and disk headroom. Startup validation enforces all documented relationships and safe minimums.