General metrics
一个区块执行&校验的时间可以包含以下几部分内容:
- 区块执行(从数据库中读取数据,EVM执行合约,将脏内容写回Trie,并且重新计算Trie hash)
- 区块验证(验证tx root, receipt root等,占比很小可忽略)
- 数据写回(从脏的trie写回数据库,但是这里的数据库在Geth内部指代的是内存数据库,即cache,并不会发生直接的磁盘io)
因此以上三部分组成了执行一个区块所需要的时间开销,即execution, validation, commit。
假设geth以geth --metrics
启动,则以上三类数据会被统计到execution
, validation
, commit
三个metrics中并在grafana显示。
Detail metrics
除了粗粒度地显示Geth执行区块的各部分时间开销外,geth还能提供更加细粒度的时间开销统计。
启动方式geth --metrics --metrics.expensive
。
其中execution
部分可以细分成以下几部分内容:
内容 | metrics名称 | 类别 |
---|---|---|
EVM execution | execution | 注意此时execution谨代表evm执行时间而非“完整”的执行部分开销 |
Account Trie Read | account read | Account数据读取,占比较大可优化 |
Storage Trie Read | storage read | 合约数据读取,占比较大可优化 |
Account Trie Update | account update | Account数据整理&哈希计算 |
Storage Trie Update | storage update | 合约数据整理&哈希计算 |
Account Trie Hash | account hash | Account数据整理&哈希计算 |
Storage Trie Hash | storage hash | 合约数据整理&哈希计算 |
此外commit
部分可以细分为以下几部分内容:
内容 | metrics名称 | 类别 |
---|---|---|
Account Commit | account commit | 将脏的trie写回内存数据库 |
Storage Commit | storage commit | 将脏的storage trie写回内存数据库 |
Chain write | commit | 将新的区块链数据写入数据库 |
内容 | metrics名称 | 类别 |
---|---|---|
known | known | 重复交易 |
valid | valid | 合约交易 |
invalid | invalid | 非法交易,直接拒绝 |
underpriced | underpriced | 低价交易,直接拒绝 |