启动才几天的 EOS 测试网络,在昨晚悄无声息的挂了,看了一下挂掉的原因,竟然是
Details: 3060101 database_guard_exception: Database usage is at unsafe levels
于是一阵谷歌,找到了一个解释 https://github.com/EOSIO/eos/issues/5107
原因竟然是因为我启用了 eosio::history_api_plugin
插件和设置了 --filter-on='*'
nodeos -e -p eosio --plugin eosio::producer_plugin --plugin eosio::history_plugin --plugin eosio::chain_api_plugin --plugin eosio::history_plugin --plugin eosio::history_api_plugin --plugin eosio::http_plugin -d ~/Downloads/eosio --config-dir ~/Downloads/eosio/config --http-server-address=0.0.0.0:8888 --access-control-allow-origin='*' --contracts-console --http-validate-host=false --filter-on='*' --verbose-http-errors --replay
这个插件和选项的意思就是把所有的链和块还有事务的状态都保存起来。
然而,现在的 EOS 链的状态是非常大的,好几百 G 。而我又使用了默认的配置
cat config.ini | grep "chain-state-db-size-mb" chain-state-db-size-mb = 1024
单位是 m
。 也就是 1G
,于是就出错了。
这个错误,也是导致 eosio::history_api_plugin
被废弃的原因。
而官方的推荐是使用数据库来保存,比如 jgiszczak
的原话是这样的
With history_plugin enabled and a filter-on of "*", the chain state on a node synced with mainnet is absolutely massive. Impractically massive, which is why history_plugin is deprecated. If you wish to retain a completely unfiltered history, you should be using mongo_db_plugin or sql_db_plugin. Without the history plugin, chain state on mainnet is currently ~1.8GiB. The default size is 1GiB, which is no longer large enough to accommodate even the minimal state size of mainnet. Out of an abundance of caution, producer nodes are using chain-state-db-size-mb = 65536.
它推荐我们使用 mongo_db_plugin
或 sql_db_plugin
来代替 history_plugin
插件来保存链的状态。
另外,主网的链状态数据大约在 ~1.8GiB
左右,而主网的默认大小为 1GiB
,早已经是溢出太多了。
出于谨慎的考虑,生产者节点正在使用 chain-state-db-size-mb = 65536
,也就是 64G
目前尚无回复