缓存比特币数据目录以提高性能?增加比特币数据库缓存大小?

比特币是非常密集的磁盘,这减慢了它。它似乎经常将数据刷新到磁盘,从而阻止了正确的缓存。使用RAMdisk上的datadir,速度要快得多。
是否可以增加数据库缓存大小或执行其他操作来提高缓存性能。
当然,保存钱包和重要数据会很好,但我不介意区块链被大量缓存。
我问的主要是Windows操作系统。
数据库
隐藏物
分享
改进这个问题
跟随
两小时前编辑的
迈克尔·福克森
582077银牌2222铜牌
2012年2月22日17:57问
克米特
194911金徽章1515银徽章2626铜徽章
你问的不太清楚。非常密集的磁盘什么时候?启动期间?下载区块链时?处理GUI请求时?操作系统应该已经在缓存所有磁盘数据,它可以容纳在内存中David Schwartz 2012年2月23日10:32
一个getnewaddress花了20秒左右。。。我减少了虚拟内存,并将缓存设置更改为“服务器”-不确定它是否做了什么,但它现在快多了。将结束问题克米特2012年2月24日19:32
1
这很可能是因为您将它设置为在用完时创建几百个地址。之后没多久,因为它给了你它预先生成的地址大卫·施瓦茨2012年2月24日22:42
嗯,我至少测试了五次,而且总是花很长时间克米特3月8日12点16分29秒
添加评论
3个答案
7
最近发布的bitcoin v0.6.0修改了bdb缓存设置(默认为25兆字节),并提供了一种通过命令行选项-dbcache=N来更改此设置的方法,其中N是以兆字节为单位的数字。
这一变化确实大大加快了区块链的同步速度。
分享
改进这个答案
跟随

将分配给缓存的MB数设置为大于机器RAM的MB数是否可以进一步提高同步速度?例如,在我只有2GB内存的笔记本电脑上,将缓存设置为2500MB(而不是2000MB)会提高同步速度吗杰兹布尔兹óska 1月14日15:45
2
@杰兹布尔兹ó斯卡,这是个很坏的主意。您可以将其设置得更高,但此时您的系统可能会耗尽内存并杀死某些东西,或者它将开始使用交换空间,这将导致比仅使用较小的缓存慢得多的速度皮尔维尔1月14日17:49
添加评论
2
比特币(通过BerkleyDB)经常将写入光盘的内容刷新到wallet.dat和区块链数据库中的主交易完整性。操作系统可以正常缓存整个区块链,
我已经多次重启比特币,并让它立即启动,因为整个区块链已经被操作系统缓存。
分享
改进这个答案
跟随
2012年3月30日11:07答复
暗黑破坏神-D3
40322银牌88铜牌
添加评论
0
记录在案:
文件数据库配置:
设置目录数据库
设置\u lk \u max \u锁120000
设置缓存大小2 524288000 1
–>2.5GB缓存
http://docs.oracle.com/cd/E17076_02/html/api_reference/C/set_cachesize_parameter.html
对于版本更高的v0.6版,Pieter的方法肯定更好。这对于旧版本仍然有用。
不幸的是,我不能让它与Namecoin 3.50一起工作
分享
改进这个答案
跟随
于2013年5月19日16:42编辑

时光素材-香车美女  (1420)blockchainBTC比特币区块链www.qkl91.com

区块链世界是最公平的世界

区块链用数字加密技术将所有已经发生的事实都记录在案,无人可以改写。所有的事情只要查就能水落石出。无论再位高权重还是手眼通天,都不可能对做过的事情进行遮掩,我认为这才是最公平的世界。时光素材-香车美女  (142)_20210317215647blockchainBTC比特币区块链www.qkl91.com

当缓存中的UTXO已满时,使用什么策略将缓存中的一个UTXO替换为另一个UTXO?

UTXO集存储在磁盘上,但一些UTXO也存储在缓存中。验证事务时,需要查询事务输入所指向的UTXO。首先,你去缓存找到它,如果找不到,你需要去磁盘找到UTXO。由于levelDB的特性,需要将磁盘上搜索到的UTXO写入缓存。如果此时缓存已满,那么节点如何在缓存中为刚刚找到的UTXO腾出空间?
交易验证
utxo公司
级别DB
utxo集合
隐藏物
分享
改进这个问题
跟随
两小时前编辑的
迈克尔·福克森
582077银牌2222铜牌
12月29日13:15问
戈涅夫
10377青铜徽章
添加评论
1个答案
4
UTXO集缓存不是固定大小,限制也不是硬限制。可以将新条目添加到缓存中,而不考虑最大缓存大小。事实上,缓存对象本身甚至不知道限制是什么。
相反,所发生的是缓存定期刷新。由于UTXO集仅在块验证期间更改(mempool UTXO集在其他地方单独处理),因此此定期刷新主要与传入块相关联,而不是与计时器相关联。验证每个块之后,节点确定是否应该将缓存刷新到磁盘。有几种情况会导致刷新,包括接近缓存限制和超过缓存限制。
因此,如果在验证一个块的过程中,缓存变满了,它实际上会一直增长,直到该块被完全验证。最后,整个缓存将被刷新到磁盘,缓存将被清空。
请注意,LevelDB本身有一个独立于UTXO集缓存的缓存。
分享
改进这个答案
跟随
回复时间:12月29日19:20
麻吉弟弟周立铭♦
52.9k44金徽章5555银徽章108108铜徽章
谢谢,我明白了。但我还有一个问题,节点是否每次都将整个缓存刷新到磁盘上?或者节点可以将缓存的一部分刷新到磁盘上?节点能否决定冲水间隔GoneV 20年12月30日6:41
也许我上面说的不太清楚。我的意思是,节点每次都会将整个缓存刷新到磁盘,或者只刷新刚刚验证的块中的UTXOsGoneV 20年12月30日6:56
1
整个缓存都会被刷新,但是会进行一些优化,以避免将不必要的项写入磁盘。例如,如果创建了一个UTXO并在两次刷新之间使用,则该UTXO永远不会写入磁盘麻吉弟弟周立铭♦ 20年12月30日18:37
mempool UTXO集是什么?在验证新事务时,节点查询哪个缓存?–GoneV 3月12日0:45

时光素材-香车美女  (1419)blockchainBTC比特币区块链www.qkl91.com

节点可以缓存的孤立事务数是否有限制?

我´我问这个问题是因为一个可能的攻击将发送大量的孤立事务,这些事务永远不会被赎回。然后客户端将不得不缓存它们,从而增加存储需求并减少查找时间。这可能导致资源耗尽攻击。
如果对缓存的大小有限制,则可以安装DoS以耗尽该限制。在这两种情况下,都可以发起拒绝服务攻击。
如果没有保护,则为每个事务添加工作证明将有助于防止此类攻击。
交易
隐藏物
分享
改进这个问题
跟随
两小时前编辑的
迈克尔·福克森
582077银牌2222铜牌
2月10日12:06问
SDL公司
53911金徽章33银徽章88铜徽章
你指的是什么缓存开膛手234 2012年2月10日13:02
1
我去了比特币源代码以供参考。请参见main.cpp:mapornTransactions。事务由AddOrphanTx()添加。可以插入mapOrphanTransactions的孤立事务数没有限制。因此,问题是:DoS攻击可能吗SDL 2012年2月10日13:25
mapornTransactionsByPrev也可能受到攻击,但c++映射查找是O(N logN)这一事实可能会阻止攻击的有效性SDL 2012年2月10日13:49
虽然它是O(N log N),但是您可以用发送大量trx的DDoS攻击来填充计算机内存。我错过什么了吗?–usr本地-ΕΨΗΕΛΩΝ 2012年2月10日15:29
@SDL“c++映射查找是O(N logN)”。我觉得很难相信。通过元素的线性搜索将是O(N),这比您建议的O(N logn)便宜。也许你想写“is O(logn)”(另请参见en.cppreference.com/w/cpp/container/map,其中指出“搜索、删除和插入操作具有对数复杂性”)。-克里斯·摩尔,2012年2月10日19:06
再显示3条评论
1个答案

0.6版本包括对几个拒绝服务漏洞的修复,包括这一个(请参阅commit 142e6041)。
在将来的版本中,可能会实现断开发送“太多”孤立项的对等点的连接。
将来,如果您在比特币实现中发现DoS或安全漏洞,最好向一个或多个开发人员发送电子邮件,以便他们尽快了解问题。
分享
改进这个答案
跟随
3月5日15:06答复
加文安德烈森
32921717银牌2222铜牌
抱歉,我在编写问题后注意到代码中存在(可能)缺陷SDL 2012年3月7日13:44
如果您在比特币发行日志中发布一条简单的感谢信,我将非常高兴SDL公司

时光素材-香车美女  (1418)blockchainBTC比特币区块链www.qkl91.com

比特币核心LevelDB dbcache中有什么?是完整记录还是元数据?

比特币核心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。

时光素材-香车美女  (1417)blockchainBTC比特币区块链www.qkl91.com

比特币核心debug.log中的这些内存配置代表什么?

在比特币核心的debug.log文件中,缓存配置描述如下。
缓存配置:
使用2.0 MiB建立块索引数据库
用8.0 MiB实现链式状态数据库
将441.0 MiB用于内存中的UTXO集(加上多达286.1 MiB的未使用内存池空间)
这里为chainstate数据库分配的8MB缓存空间是用来做什么的?它和内存中的UTXO集有什么区别和联系?
比特币核心
utxo集合
调试
隐藏物
分享
改进这个问题
跟随
两小时前编辑的
迈克尔·福克森
582077银牌2222铜牌
3月27日4:05问
戈涅夫
10377青铜徽章
添加评论
1个答案
1
块索引和链状态数据库是LevelDB数据库。LevelDB有自己的缓存和缓存管理。因此,为块索引的LevelDB数据库缓存分配了2个MiB,为链状态的LevelDB数据库缓存分配了8个MiB。
然而,比特币核心本身会进行额外的缓存,尤其是存储在链状态数据库中的UTXO集。因此比特币核心也为自己分配了441个MiB来管理UTXO集合条目的缓存。
不同之处在于,LevelDB的缓存组织方式不同于比特币核心的内存UTXO集,因为LevelDB是一个数据库系统。因此,它针对数据处理进行了优化,并且具有一种可推广到各种数据库用途的策略。然而,比特币核心知道它将哪些数据放入数据库,因此它可以更有效地缓存这些数据。它在需要序列化和写入数据库之前缓存数据。因为比特币核心知道如何使用数据,所以它通过内存中的UTXO集进行缓存可以针对实际用例进行优化。
分享
改进这个答案
跟随
3月27日4:49回答
麻吉弟弟周立铭♦
52.9k44金徽章5555银徽章108108铜徽章
非常感谢。你的回答很有帮助。因此,我对这些缓存的用途的理解如下(如果我错了,请纠正我):当一个节点验证一个事务时,对于块中使用的UTXO,该节点首先在441MiB内存UTXO集中执行一个查询。如果找不到,则需要访问磁盘中的levelDB数据库。但是,由于levelDB还有一个8MiB缓存,因此节点需要首先查询这个8MiB缓存。如果仍然找不到,请转到磁盘进行搜索,并将搜索结果写入8MiB缓存,而不是441MiB内存UTXO集。是吗?——戈涅夫3月27日5点47分
@好的,没错麻吉弟弟周立铭♦ 3月27日17:53
添加评论

时光素材-香车美女  (1416)blockchainBTC比特币区块链www.qkl91.com

比特币核心如何按费用对内存池交易进行排序?

我试图理解比特币核心用来按费用对内存池事务进行排序的算法。
加文的费用重做建议指出:
接下来,按每千字节支付的费用对所有剩余内存池事务进行排序,并包括尽可能多的事务,直到块的大小达到最大块大小字节为止,不包括“免费”事务(每kb费用小于默认垃圾邮件阈值0.0001 BTC/千字节的事务)。
这是有意义的,因为矿工应该希望在块中加载具有最多“费用密度”或每字节费用的事务。
然而,回顾miner.cpp中的CreateNewBlock函数,我们不清楚在对内存池项目进行优先级排序时,比特币核心是如何计算事务长度的:
//一旦超过优先级大小,就按费用进行优先级排序,否则我们就没有高优先级了
//交易记录:
如果(!fSortedByFee公司&amp;&amp;
((nBlockSize+nTxSize>=nBlockPrioritySize)| |!允许(优先权)
{
fSortedByFee=真;
comparer=TxPriorityCompare(fSortedByFee);
std::make_heap(vecPriority.begin(),vecPriority.end(),comparer);
}
TXPriorityCompare似乎只关注绝对费用:
公众:
TxPriorityCompare(bool\u byFee):byFee(\u byFee){}
bool运算符()(const TxPriority&amp;a,const TxPriority&amp;b)
{
if(收费)
{
如果(a.get<1>()==b.get<1>())
返回a.get<0>()<b.get<0>();
返回a.get<1>()<b.get<1>();
}
其他的
{
如果(a.get<0>()==b.get<0>())
返回a.get<1>()<b.get<1>();
返回a.get<0>()<b.get<0>();
}
}
};
换句话说,这看起来像是一种绝对交易费用,而不是费用密度。我错过了什么?
比特币核心
交易费用
内存池
事务处理选择
分享
改进这个问题
跟随
1小时前编辑
迈克尔·福克森
582077银牌2222铜牌
7月8日15:54问
富阿波达卡
211622金徽章1212银徽章3333铜徽章
添加评论
1个答案
1
你展示的节选是以块为单位的优先区域。源代码中的“优先级”概念对应于每千字节销毁的修改比特币天数。它只用于块大小的一小部分(比特币核心0.11.x默认最大50kB,0.12.x默认最大0kB,可以通过配置设置进行更改)。
看看CreateNewBlock的其余部分,它使用feerate排序,通过迭代mempool上按feerate(=satoshi/kB)预先排序的索引。
分享

时光素材-香车美女  (1415)blockchainBTC比特币区块链www.qkl91.com

什么是ccache?在构建和审查比特币核心PRs时,我应该何时使用它?

什么是ccache?您能提供一些指导,说明何时使用它来构建比特币核心PRs以及如何使用它?
比特币核心开发
BitConcore审查
隐藏物
分享
改进这个问题
跟随
1小时前编辑
20年9月18日14:40询问
迈克尔·福克森
582077银牌2222铜牌
添加评论
2个答案
1
工具ccache帮助存储中间编译结果,因此如果经常更改分支并重新构建,它可以显著加快这样做。
要使用它,您需要为平台安装ccache。就这样。比特币核心配置脚本将检测到它的存在,并自动使用它。
分享
改进这个答案
跟随
于20年9月19日1:29答复
皮耶特·乌维尔
67.7k88金徽章S146146银徽章2222222青铜徽章
添加评论
0
ccache是编译器缓存。
它通过缓存以前的编译和检测何时再次执行相同的编译来加快重新编译。
与dbcache不同,决定分配多少ccache并没有那么关键。比特币核心生产力文档建议您将类似的内容放入~/.ccache/ccache.conf:
最大值=50.0Gා或您喜欢的任何缓存大小;默认值为5G;0表示无限
baseŠdir=/home/yournameා或保存源文件的任何地方
注意:ccache需要base_udir在不同的存储库/路径上共享同一文件的缓存编译;它只会对基本目录下的路径执行此操作。因此,为了有效地使用带有git工作树的ccache,需要使用此选项。
您不能将base_udir设置为“/”,也不能将包含系统标头的任何位置(根据ccache文档)。

使用ccache似乎没有任何明显的缺点。但在ccache网站上有几个警告。
编译器是移动的目标。较新的编译器版本可能,而且经常会引入ccache无法预见的特性。

最快的模式(“直接模式”)有一个角落的情况下,可能会导致误报缓存命中。
一般来说,尽管看起来你可以安装它(正如Pieter所说),然后忘记它,这将节省你编译比特币核心PRs的时间。
有关加快C++编译的其他信息,请参见Martin Ho的优秀博客文章řeň奥夫斯克ý.

时光素材-香车美女  (1414)blockchainBTC比特币区块链www.qkl91.com

除了ccache,还有其他方法加快比特币核心减贫战略建设吗?

在构建比特币核心PRs时,我已经在使用ccache来加速重新编译。有没有其他方法可以加快这一进程?
比特币核心开发
隐藏物
分享
改进这个问题
跟随
1小时前编辑
11月27日13:26问
迈克尔·福克森
582077银牌2222铜牌
添加评论
1个答案
1
威尔·克拉克在IRC上回答了这个问题。
您可以使用./configure-q-C来减少运行./configure所需的时间-q是安静的,-C删除终端打印并使用缓存(如ccache)。它将威尔的配置时间从29秒减少到10秒。有关详细信息,请参阅此信息页。
分享
改进这个答案
跟随
11月27日16:28编辑
回复时间:11月27日13:26
迈克尔·福克森
582077银牌2222铜牌
添加评论

时光素材-香车美女  (1413)blockchainBTC比特币区块链www.qkl91.com

急跌不转熊,只会延长牛市周期

 

菜大哥投资日记 副船长 2021-05-20 13:45:05 发布在 区块链社区

6494 1

昨天跌的有点猛,大盘全体下挫,山寨主流币统统腰斩。这是距312过后幅度比较大的暴跌了,市场恐慌到了极点。比特币最低跌到了2.9万美元。
  爆仓的爆仓,割肉的割肉。
  这回市场上的杠杠是被彻底扫清了。
  牛市结束了吗?
  我认为还没有。
  急跌不转熊,只会延长牛市周期,并无法影响牛熊的运行轨迹。
  94事件影响牛熊轨迹了吗?
  312事件影响牛熊轨迹了吗?
  312暴跌/94暴跌哪次不是机构抄底的机会?
  带血筹码充分换手到机构手里后,散户空仓的钱以后就用来全面追涨,完美。
  暴跌过后会引发更猛烈的上涨,耐心等吧。
  今年上半年涨得有些猛,本来我还以为这轮牛市会比2017年短一两个月。现在我越来越相信,本轮持续时间将会长于2017年。
  昨晚有个人加上我,说比特币都跌破1月份4万美元的高点,你还看多?
  我说,虽然跌破4万美元,但并不妨碍我继续看多。
  他说,继续做多,10倍20倍往死里干,你别停啊!
  我觉得很搞笑,为什么要做多?我只拿现货,又不碰合约。
  他说,那你抄底。
  我觉得这更搞笑了,每次回调都是加仓的机会。但这是别人的机会,又不是我的机会。
  我早在2019年满仓了,2020年就是全年等待。2021上半年每个月取钱出来消费,剩下的就是准备等到牛市陷入狂热后再出货。
  至于短期暴跌,如果还有钱的话。我倒会趁着暴跌,再加点以太坊。
  我不知道他为什么那么情绪化。
  如果你看空,就应该去关注看空的人。
  如果你看多,就应该去关注看多的人。
  什么立场关注什么样的人,何必自找麻烦?

时光素材-香车美女  (1412)blockchainBTC比特币区块链www.qkl91.com