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 | 低价交易,直接拒绝 |