帮助里查不到的三个数据库开关:dbbatchsize、dbcrashratio 与 forcecompactdb 图 1
帮助里查不到的三个数据库开关:dbbatchsize、dbcrashratio 与 forcecompactdb · 图 1

节点同步到一半卡在 “Rewinding blocks” 或 “Writing batch” 之类的日志上,磁盘指标却看着正常——这类排查到数据库层的故障,比特币核心留了两个几乎无人提及的旋钮:-dbbatchsize,以及藏在暗处的 -dbcrashratio-forcecompactdb。前者的官方定义是”数据库写批处理的最大字节数”,后两个则连帮助文本都不给。本文按 v31.0 源码说明三者的真实作用点,顺便澄清它们管不到什么。

dbbatchsize:唯一进帮助的那一个

默认值来自 kernel/caches.h 的常量 DEFAULT_DB_CACHE_BATCH,等于 32 MiB,帮助文本标注为仅调试参数,普通 --help 看不到,要 bitcoind -help-debug。它的作用点在 UTXO 落盘路径:txdb.cpp 逐条把变更攒进批处理对象,每攒到近似体积超过这个字节数就先把这批写进 LevelDB、清空、继续攒,直到整次刷新结束。日志里对应那行 “Writing partial batch of … MiB”。

由此可知它的敏感性区间很窄。调大意味着单次崩溃时未落盘的批量窗口更大、恢复期重放更长;调小则写盘次数变碎。它只在”一次性写入大量条目”的场景(初始同步、重组回滚、快照校验)中体现存在感,日常转笔交易时你根本观察不到它。对普通用户,正确的建议就一条:别动。

帮助里查不到的三个数据库开关:dbbatchsize、dbcrashratio 与 forcecompactdb 图 2
帮助里查不到的三个数据库开关:dbbatchsize、dbcrashratio 与 forcecompactdb · 图 2

dbcrashratio:帮助里没有,源码里有

这个参数不在参数注册表里,而是躺在 init.cpp 的一份隐藏名单上。它被消费的位置在 UTXO 落盘循环内部:每写完一个批次,掷一次骰子,若抽中指定分之一就直接 _Exit(0) 让进程原地消失——注释风格相当幽默,日志留下一句 “Simulating a crash. Goodbye.”。它的用途只有一个:在测试里验证”崩溃发生在批次中间时,重启后数据库能否恢复一致”。

隐藏不等于无害。配置文件里若残留了别人抄来的 dbcrashratio=1000,节点就会在每次同步的某个随机批次后突然死亡,表现为一台”周期性崩溃的节点”,而所有常规日志排查都找不到原因——因为它不是错误,是它被要求去死。这也是本文写这一段的动机:隐藏参数没有帮助文本,误配的报错路径极差,值得被更多人知道。

forcecompactdb:开机先做一遍大扫除

同样在隐藏名单上。dbwrapper.cpp 在打开 LevelDB 成功后检查该标志,若为真,对整个数据库执行一次范围压缩,日志显示开始与结束两行。压缩是 LevelDB 归还磁盘空间的手段,平时由数据库按内部策略自动安排;这个开关提供的是一次手动、全量、发生在启动瞬间的整理。它适用的场景极窄——比如数据库长期积累了大量删除后想立即回收空间——代价是启动时间显著拉长。对绝大多数节点,这项工作在后台自动进行,无需干预。

三个参数的共同画像

它们都属于”调试与测试基建泄露到了配置系统”这一类:确实注册、确实生效、但从不面向日常运维。辨认方法很实用——-help-debug 里带”调试”标记的参数、以及帮助里完全查不到却能改变行为的参数(后者用 bitcoind -conf=/dev/null -printtoconsole 启动配合源码搜索核实),都应当定期与自己的配置文件做交叉清点。多机运维场景里,一次”谁在配置里塞了奇怪参数”的事故复盘,往往就是从这份隐藏名单开始的。

顺带一句边界:这三者与 dbcache(数据库缓存大小)互不相干。缓存决定读路径命中率与内存占用,批量大小决定写路径的节拍,压缩则是一次性整理,三者常被混为”数据库调优三件套”传播,实际上管的问题、影响的面完全不同。

顺带一句版本口径

需要提醒的是,这三者的存在与拼写都可能随重构漂移:隐藏名单每年都在变动,某个版本消失的调试参数不会出现在迁移指南里。引用它们之前,最可靠的做法是直接 grep 所用版本的源码目录——隐藏参数没有发布说明,搜索引擎给出的二手描述往往停留在几年前的实现上。把”以源码为准”落实到这一步,才算真正落实。

风险提示:本文为节点数据库参数机制说明,对应 Bitcoin Core v31.0 源码;隐藏调试参数可能随版本变化而无公告移除,误配可导致数据目录状态异常,操作前请完整备份;不构成投资建议。