@
Sekai bitcoin core 同步区块,最慢的一般不是下载本身,而是下载后验证区块内容、根据区块内容对 UTXO 进行查询和增删。尤其是机械硬盘,慢到令人发指,主要就是 chainstate 这个目录,UTXO 集合就保存在这里。
这个问题的对策,就是把 UTXO 集合全部放到内存里。
如果是从头开始同步,直接把 dbcache (也就是图形界面设置里的“数据库缓存”)调大就可以了,上次我记得得调到 8GB 左右。
如果不是从头开始同步,我没找到能“预加载”到内存里的办法,后来我就想了个能奏效的 trick,也就是利用操作系统的磁盘(或者说文件系统?)缓存,用 cat ( linux/mac )或 type ( windows cmd )命令把 chainstate 里的东西读取出来然后重定向到 /dev/null ( linux/mac )或 nul,也就是单纯读一遍,然后操作系统就会把文件读到内存里缓存起来。
另外还有一个问题不知道现在修正了没,就是开启修剪的时候,上述办法不奏效,每次删掉老区块文件时都会把内存里的 UTXO 数据写入磁盘,于是速度又显著拖慢了。对于这个,有个蛋疼的对策是用 ramdisk 和 ntfs junction ( windows,linux 的话整个 tmpfs 然后 ln -s 更简单),但这样加一层 ramdisk 有性能开销(尤其是受 spectre 漏洞影响的老 CPU……)。