Tried on 2026-10-18 to cut the HDD reads: at 200 MB the P2P thread alone read ~4 MB/s validating relayed transactions. Steady-state reads did drop (to ~0.4 MB/s) and RPC rejections went to zero. But block validation got SLOWER over the next 14 blocks: median 60s against 11s before. bitcoind's bench log puts all of it in input lookups at ~5 ms each. The likely cause is that the extra GB came out of the guest's page cache, which holds compressed chainstate files far more densely than bitcoind's cache holds decoded coins. Committed because it is what is running; probably to be reverted. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
93 lines
4.2 KiB
YAML
93 lines
4.2 KiB
YAML
# Bitcoin Knots Configuration Variables
|
|
|
|
# Version - REQUIRED: Specify exact version/tag to build
|
|
# The only version string. There used to be a second, v-prefixed copy
|
|
# (bitcoin_knots_version) that nothing read - two hand-maintained copies of one
|
|
# fact, with nothing keeping them in step.
|
|
bitcoin_knots_version_short: "29.2.knots20251110"
|
|
|
|
# Directories
|
|
bitcoin_knots_dir: /opt/bitcoin-knots
|
|
bitcoin_knots_source_dir: "{{ bitcoin_knots_dir }}/source"
|
|
bitcoin_data_dir: /var/lib/bitcoin # Standard location for config, logs, wallets
|
|
bitcoin_large_data_dir: /mnt/knots_data # Custom location for blockchain data (blocks, chainstate)
|
|
bitcoin_conf_dir: /etc/bitcoin
|
|
|
|
# Network
|
|
bitcoin_rpc_port: 8332
|
|
# The edge host's socket-proxy/Caddy play needs this too, and a role default is
|
|
# invisible outside this role. The authoritative value for the live deployment is
|
|
# in host_vars/knots_box_local/main.yml, which outranks this; the value here is the
|
|
# protocol standard, so the role still works standalone.
|
|
bitcoin_p2p_port: 8333
|
|
bitcoin_rpc_bind: "0.0.0.0"
|
|
|
|
# RPC capacity. When a block lands, Fulcrum, mempool and DATUM all fetch it at
|
|
# once while validation holds the node busy on a saturated HDD; with the
|
|
# defaults the queue overflowed and bitcoind REJECTED calls ("http work queue
|
|
# depth exceeded" - 93 times on 2026-10-18), which also made the health probe
|
|
# flap. A deeper queue lets those bursts wait instead of failing. Costs a few
|
|
# idle threads and a little memory.
|
|
bitcoin_rpcworkqueue: 64
|
|
bitcoin_rpcthreads: 8
|
|
|
|
# Build options
|
|
bitcoin_build_jobs: 4 # Parallel build jobs (-j flag), adjust based on CPU cores
|
|
bitcoin_build_prefix: /usr/local
|
|
|
|
# Configuration options
|
|
bitcoin_enable_txindex: true # Set to true if transaction index needed (REQUIRED for Electrum servers like Electrs/ElectrumX)
|
|
bitcoin_max_connections: 125
|
|
# dbcache will be calculated as 90% of host RAM automatically in playbook
|
|
|
|
# ZMQ Configuration
|
|
bitcoin_zmq_enabled: true
|
|
bitcoin_zmq_bind: "tcp://0.0.0.0"
|
|
bitcoin_zmq_port_rawblock: 28332
|
|
bitcoin_zmq_port_rawtx: 28333
|
|
bitcoin_zmq_port_hashblock: 28334
|
|
bitcoin_zmq_port_hashtx: 28335
|
|
|
|
# Service user
|
|
bitcoin_user: bitcoin
|
|
bitcoin_group: bitcoin
|
|
|
|
# --- Health check ----------------------------------------------------------
|
|
# Checks bitcoind RPC and records the answer in its exit code, which systemd
|
|
# keeps: `systemctl is-failed bitcoin-knots-healthcheck.service`.
|
|
#
|
|
# WHERE TO REPORT HEALTH — the one place to plug in monitoring. Empty means
|
|
# check, exit honestly, report nowhere. Any endpoint accepting an HTTP ping
|
|
# works; nothing here is specific to a monitoring product.
|
|
healthcheck_push_url: ""
|
|
# Bearer token for the Gatus external endpoint. Required whenever a push URL
|
|
# is set: Gatus rejects an unauthenticated push with 401.
|
|
healthcheck_push_token: ""
|
|
|
|
# --- Logging ----------------------------------------------------------------
|
|
# The live node logs to a file. Set to "" to use printtoconsole=1 (journald).
|
|
bitcoin_logfile: "{{ bitcoin_data_dir }}/debug.log"
|
|
|
|
# --- dbcache ----------------------------------------------------------------
|
|
# Computed as 90% of RAM unless this is set. As with fulcrum, note that
|
|
# set_fact outranks role defaults, so the CALCULATION has to honour this - a
|
|
# value pinned only in defaults/ is silently ignored.
|
|
#
|
|
# 1200, raised from a hand-tuned 200 on 2026-10-18. At 200 MB almost no UTXO
|
|
# lookup hit memory: the P2P thread alone read ~4 MB/s off the saturated HDD
|
|
# mirror validating relayed transactions, and block validation took a median
|
|
# 11 s, p90 103 s, max 344 s - long enough for RPC to stall and the health
|
|
# probe to fail. 1200 is what fits in the 4 GB VM (bitcoind ~1.5 GB RSS at
|
|
# 200, mempool ~3 MB in practice). Raising the VM to 6 GB would allow ~3000.
|
|
bitcoin_dbcache_mb_override: 1200
|
|
|
|
# --- DATUM Gateway ----------------------------------------------------------
|
|
# This node feeds block templates to datum_gateway on knots-box. These settings
|
|
# were hand-added to bitcoin.conf and were missing from the template, so a
|
|
# playbook run would have removed them and broken the mining setup.
|
|
bitcoin_datum_gateway_enabled: true
|
|
bitcoin_blockmaxsize: 3985000
|
|
bitcoin_blockmaxweight: 3985000
|
|
bitcoin_blocknotify: "killall -USR1 datum_gateway"
|
|
bitcoin_maxmempool: 1000
|
|
bitcoin_blockreconstructionextratxn: 1000000
|