Skip to content

Commit c27bb07

Browse files
committed
core: add state disk hit rates
1 parent 792f45e commit c27bb07

File tree

3 files changed

+87
-40
lines changed

3 files changed

+87
-40
lines changed

core/blockchain.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2037,16 +2037,16 @@ func (bc *BlockChain) ProcessBlock(parentRoot common.Hash, block *types.Block, s
20372037
// Upload the statistics of reader at the end
20382038
defer func() {
20392039
pStat := prefetch.GetStats()
2040-
accountCacheHitPrefetchMeter.Mark(pStat.AccountHit)
2041-
accountCacheMissPrefetchMeter.Mark(pStat.AccountMiss)
2042-
storageCacheHitPrefetchMeter.Mark(pStat.StorageHit)
2043-
storageCacheMissPrefetchMeter.Mark(pStat.StorageMiss)
2040+
accountCacheHitPrefetchMeter.Mark(pStat.AccountCacheHit)
2041+
accountCacheMissPrefetchMeter.Mark(pStat.AccountCacheMiss)
2042+
storageCacheHitPrefetchMeter.Mark(pStat.StorageCacheHit)
2043+
storageCacheMissPrefetchMeter.Mark(pStat.StorageCacheMiss)
20442044

20452045
rStat := process.GetStats()
2046-
accountCacheHitMeter.Mark(rStat.AccountHit)
2047-
accountCacheMissMeter.Mark(rStat.AccountMiss)
2048-
storageCacheHitMeter.Mark(rStat.StorageHit)
2049-
storageCacheMissMeter.Mark(rStat.StorageMiss)
2046+
accountCacheHitMeter.Mark(rStat.AccountCacheHit)
2047+
accountCacheMissMeter.Mark(rStat.AccountCacheMiss)
2048+
storageCacheHitMeter.Mark(rStat.StorageCacheHit)
2049+
storageCacheMissMeter.Mark(rStat.StorageCacheMiss)
20502050

20512051
if result != nil {
20522052
result.stats.StatePrefetchCacheStats = pStat

core/blockchain_stats.go

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -86,15 +86,15 @@ func (s *ExecuteStats) reportMetrics() {
8686
chainMgaspsMeter.Update(time.Duration(s.MgasPerSecond)) // TODO(rjl493456442) generalize the ResettingTimer
8787

8888
// Cache hit rates
89-
accountCacheHitPrefetchMeter.Mark(s.StatePrefetchCacheStats.AccountHit)
90-
accountCacheMissPrefetchMeter.Mark(s.StatePrefetchCacheStats.AccountMiss)
91-
storageCacheHitPrefetchMeter.Mark(s.StatePrefetchCacheStats.StorageHit)
92-
storageCacheMissPrefetchMeter.Mark(s.StatePrefetchCacheStats.StorageMiss)
93-
94-
accountCacheHitMeter.Mark(s.StateReadCacheStats.AccountHit)
95-
accountCacheMissMeter.Mark(s.StateReadCacheStats.AccountMiss)
96-
storageCacheHitMeter.Mark(s.StateReadCacheStats.StorageHit)
97-
storageCacheMissMeter.Mark(s.StateReadCacheStats.StorageMiss)
89+
accountCacheHitPrefetchMeter.Mark(s.StatePrefetchCacheStats.AccountCacheHit)
90+
accountCacheMissPrefetchMeter.Mark(s.StatePrefetchCacheStats.AccountCacheMiss)
91+
storageCacheHitPrefetchMeter.Mark(s.StatePrefetchCacheStats.StorageCacheHit)
92+
storageCacheMissPrefetchMeter.Mark(s.StatePrefetchCacheStats.StorageCacheMiss)
93+
94+
accountCacheHitMeter.Mark(s.StateReadCacheStats.AccountCacheHit)
95+
accountCacheMissMeter.Mark(s.StateReadCacheStats.AccountCacheMiss)
96+
storageCacheHitMeter.Mark(s.StateReadCacheStats.StorageCacheHit)
97+
storageCacheMissMeter.Mark(s.StateReadCacheStats.StorageCacheMiss)
9898
}
9999

100100
// logSlow prints the detailed execution statistics if the block is regarded as slow.

core/state/reader.go

Lines changed: 70 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -87,25 +87,45 @@ type Reader interface {
8787

8888
// ReaderStats wraps the statistics of reader.
8989
type ReaderStats struct {
90-
AccountHit int64
91-
AccountMiss int64
92-
StorageHit int64
93-
StorageMiss int64
90+
// Cache stats
91+
AccountCacheHit int64
92+
AccountCacheMiss int64
93+
StorageCacheHit int64
94+
StorageCacheMiss int64
95+
96+
// Disk stats
97+
AccountDiskHit int64
98+
AccountDiskMiss int64
99+
StorageDiskHit int64
100+
StorageDiskMiss int64
94101
}
95102

96103
// String implements fmt.Stringer, returning string format statistics.
97104
func (s ReaderStats) String() string {
98105
var (
99-
accountRate float64
100-
storageRate float64
106+
accountCacheHitRate float64
107+
storageCacheHitRate float64
108+
accountDiskHitRate float64
109+
storageDiskHitRate float64
101110
)
102-
if s.AccountHit > 0 {
103-
accountRate = float64(s.AccountHit) / float64(s.AccountHit+s.AccountMiss) * 100
111+
if s.AccountCacheHit > 0 {
112+
accountCacheHitRate = float64(s.AccountCacheHit) / float64(s.AccountCacheHit+s.AccountCacheMiss) * 100
113+
}
114+
if s.AccountDiskHit > 0 {
115+
accountDiskHitRate = float64(s.AccountDiskHit) / float64(s.AccountDiskHit+s.AccountDiskMiss) * 100
104116
}
105-
if s.StorageHit > 0 {
106-
storageRate = float64(s.StorageHit) / float64(s.StorageHit+s.StorageMiss) * 100
117+
if s.StorageCacheHit > 0 {
118+
storageCacheHitRate = float64(s.StorageCacheHit) / float64(s.StorageCacheHit+s.StorageCacheMiss) * 100
107119
}
108-
return fmt.Sprintf("account (hit: %d, miss: %d, rate: %.2f), storage (hit: %d, miss: %d, rate: %.2f)", s.AccountHit, s.AccountMiss, accountRate, s.StorageHit, s.StorageMiss, storageRate)
120+
if s.StorageDiskHit > 0 {
121+
storageDiskHitRate = float64(s.StorageDiskHit) / float64(s.StorageDiskHit+s.StorageDiskMiss) * 100
122+
}
123+
msg := fmt.Sprintf("=== Reader statistics ===\n")
124+
msg += fmt.Sprintf("account: cache (hit: %d, miss: %d, rate: %.2f)\n", s.AccountCacheHit, s.AccountCacheMiss, accountCacheHitRate)
125+
msg += fmt.Sprintf("account: disk (hit: %d, miss: %d, rate: %.2f)\n", s.AccountDiskHit, s.AccountDiskMiss, accountDiskHitRate)
126+
msg += fmt.Sprintf("storage: cache (hit: %d, miss: %d, rate: %.2f)\n", s.StorageCacheHit, s.StorageCacheMiss, storageCacheHitRate)
127+
msg += fmt.Sprintf("storage: disk (hit: %d, miss: %d, rate: %.2f)\n", s.StorageDiskHit, s.StorageDiskMiss, storageDiskHitRate)
128+
return msg
109129
}
110130

111131
// ReaderWithStats wraps the additional method to retrieve the reader statistics from.
@@ -539,10 +559,16 @@ func (r *readerWithCache) Storage(addr common.Address, slot common.Hash) (common
539559

540560
type readerWithCacheStats struct {
541561
*readerWithCache
542-
accountHit atomic.Int64
543-
accountMiss atomic.Int64
544-
storageHit atomic.Int64
545-
storageMiss atomic.Int64
562+
563+
accountCacheHit atomic.Int64
564+
accountCacheMiss atomic.Int64
565+
storageCacheHit atomic.Int64
566+
storageCacheMiss atomic.Int64
567+
568+
accountDiskHit atomic.Int64
569+
accountDiskMiss atomic.Int64
570+
storageDiskHit atomic.Int64
571+
storageDiskMiss atomic.Int64
546572
}
547573

548574
// newReaderWithCacheStats constructs the reader with additional statistics tracked.
@@ -562,9 +588,17 @@ func (r *readerWithCacheStats) Account(addr common.Address) (*types.StateAccount
562588
return nil, err
563589
}
564590
if incache {
565-
r.accountHit.Add(1)
591+
r.accountCacheHit.Add(1)
566592
} else {
567-
r.accountMiss.Add(1)
593+
r.accountCacheMiss.Add(1)
594+
595+
// If the account was read from the underlying storage, count
596+
// the presence statistics.
597+
if account == nil {
598+
r.accountDiskMiss.Add(1)
599+
} else {
600+
r.accountDiskHit.Add(1)
601+
}
568602
}
569603
return account, nil
570604
}
@@ -580,19 +614,32 @@ func (r *readerWithCacheStats) Storage(addr common.Address, slot common.Hash) (c
580614
return common.Hash{}, err
581615
}
582616
if incache {
583-
r.storageHit.Add(1)
617+
r.storageCacheHit.Add(1)
584618
} else {
585-
r.storageMiss.Add(1)
619+
r.storageCacheMiss.Add(1)
620+
621+
// If the slot was read from the underlying storage, count
622+
// the presence statistics.
623+
if value == (common.Hash{}) {
624+
r.accountDiskMiss.Add(1)
625+
} else {
626+
r.accountDiskHit.Add(1)
627+
}
586628
}
587629
return value, nil
588630
}
589631

590632
// GetStats implements ReaderWithStats, returning the statistics of state reader.
591633
func (r *readerWithCacheStats) GetStats() ReaderStats {
592634
return ReaderStats{
593-
AccountHit: r.accountHit.Load(),
594-
AccountMiss: r.accountMiss.Load(),
595-
StorageHit: r.storageHit.Load(),
596-
StorageMiss: r.storageMiss.Load(),
635+
AccountCacheHit: r.accountCacheHit.Load(),
636+
AccountCacheMiss: r.accountCacheMiss.Load(),
637+
StorageCacheHit: r.storageCacheHit.Load(),
638+
StorageCacheMiss: r.storageCacheMiss.Load(),
639+
640+
AccountDiskHit: r.accountDiskHit.Load(),
641+
AccountDiskMiss: r.accountDiskMiss.Load(),
642+
StorageDiskHit: r.storageDiskHit.Load(),
643+
StorageDiskMiss: r.storageDiskMiss.Load(),
597644
}
598645
}

0 commit comments

Comments
 (0)