比特币核心LevelDB dbcache中有什么?是完整记录还是元数据?
这个问题是匿名者在IRC上提出的。
比特币核心
比特币核心开发
数据库
级别DB
隐藏物
分享
改进这个问题
跟随
两小时前编辑的
9月18日15:49问
迈克尔·福克森
582077银牌2222铜牌
添加评论
1个答案
2
比特币核心文档将dbcache描述为UTXO数据库的缓存。
Wikipedia将缓存描述为:
存储数据的软件组件,以便将来对该数据的请求可以更快地得到服务;存储在缓存中的数据可能是早期计算的结果,也可能是存储在其他地方的数据的副本。
格雷格·麦克斯韦在IRC上补充道:
基本上有两种不同的用途:基本上是元数据的块索引和UTXO数据库。
dbcache并不是真正的缓存,它是一个写缓冲区,它可以防止需要同步磁盘或进行随机写入。作为一个缓存,它没有做什么,也不需要。它也可以作为一个缓存,但是如果您取消了这个好处,那么即使有一个巨大的dbcache,也只会降低大约10%的速度。
对于快速SSD(例如NVMe),我认为400MB缓存和5GB缓存之间的区别“只是”IBD时间的一半(从LAN对等点同步时)。
为了防止损坏,数据库更新必须包括同步写入。
我们改变了dbcache刷新的工作方式,明确的意图是使后台刷新成为可能,这样它就可以同时不断地刷新和处理块,而不是在磁盘上等待的地方插入这些气泡。即使一致性要求现在使这成为可能(UTXO数据库不必是一致的,除非有一个记录表明,在它被绝对地应用到数据库之前的所有块),实际上进行更改仍然是极其复杂的。
每次处理一个块时,一旦缓存填满,就可以将剩余最旧块的剩余脏项刷新到磁盘上,直到它再次低于限制。。所以基本上是冲洗背景中的每一块。然后每隔一段时间,你做一次磁盘同步,并更新记录,说完全一致的点在哪里,而不必刷新任何额外的。所以在运行时几乎没有延迟峰值。
这对挖掘是有好处的,但要做到这一点,需要一堆机器来有效地跟踪事物,同时用某种类型的开放哈希表替换dbcache的映射,以将malloc通信量减少10倍,可能是有意义的。我预计有一个因素2 IBD加速等待这些变化。我不确定它是否会发生,但这是一个大而复杂的任务,任何错误都是一个共识错误。
您甚至可以通过替换最旧的UTXO和“足够远”的flush来解决开放哈希表中的冲突。这张桌子随时都可能非常接近完全装满。
我个人喜欢布谷鸟桌。如果每个项目都有少量可能的位置,比如两个随机的桶,每个桶装4个项目,如果这些位置已满,则选择一个,将项目插入其中,将该插槽中的内容撞到另一个位置。
如果桌子有一点松弛(例如,对于2桶4件物品,不超过95%的空间),那么在踢几下之后,它总是能成功地找到一个空的位置。查找速度非常快,因为您只需要进行两次随机内存访问。有一堆不同的设计,虽然大多数是最好的时候,你可以保持表<50%满,但布谷鸟的设计很容易采取了任意高满。
比特币使用的STL集是一个哈希表,但冲突是通过哈希表中的每个条目都是一个链表来解决的,因此每次访问都涉及几个指针跟踪,每次插入都需要一个malloc。