Skip to content

Commit

Permalink
Merge pull request #7 from flywukong/IO-metrics
Browse files Browse the repository at this point in the history
Io metrics
  • Loading branch information
forcodedancing authored Mar 1, 2022
2 parents fcc70df + 5381bc9 commit f14d2ed
Show file tree
Hide file tree
Showing 2 changed files with 71 additions and 12 deletions.
12 changes: 6 additions & 6 deletions core/state/snapshot/disklayer.go
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ func (dl *diskLayer) AccountRLP(hash common.Hash) ([]byte, error) {

hitInL3 := false
hitInDisk := false
startGetInDisk := time.Now()
var startGetInDisk time.Time
defer func() {
// if mainProcess
if isSyncMainProcess {
Expand All @@ -131,7 +131,7 @@ func (dl *diskLayer) AccountRLP(hash common.Hash) ([]byte, error) {
syncL3AccountMissMeter.Mark(1)
cachemetrics.RecordCacheDepth("DISK_L4_ACCOUNT")
cachemetrics.RecordCacheMetrics("DISK_L4_ACCOUNT", startGetInDisk)
cachemetrics.RecordTotalCosts("DISK_L4_ACCOUNT", start)
cachemetrics.RecordTotalCosts("DISK_L4_ACCOUNT", startGetInDisk)
}
}
if isMinerMainProcess {
Expand All @@ -147,8 +147,8 @@ func (dl *diskLayer) AccountRLP(hash common.Hash) ([]byte, error) {
// layer 3 miss
minerL3AccountMissMeter.Mark(1)
cachemetrics.RecordMinerCacheDepth("MINER_L4_ACCOUNT")
cachemetrics.RecordMinerCacheMetrics("MINER_L4_ACCOUNT", start)
cachemetrics.RecordMinerTotalCosts("MINER_L4_ACCOUNT", start)
cachemetrics.RecordMinerCacheMetrics("MINER_L4_ACCOUNT", startGetInDisk)
cachemetrics.RecordMinerTotalCosts("MINER_L4_ACCOUNT", startGetInDisk)
}
}
}()
Expand Down Expand Up @@ -204,7 +204,7 @@ func (dl *diskLayer) Storage(accountHash, storageHash common.Hash) ([]byte, erro
syncL3StorageMissMeter.Mark(1)
cachemetrics.RecordCacheDepth("DISK_L4_STORAGE")
cachemetrics.RecordCacheMetrics("DISK_L4_STORAGE", startGetInDisk)
cachemetrics.RecordTotalCosts("DISK_L4_STORAGE", start)
cachemetrics.RecordTotalCosts("DISK_L4_STORAGE", startGetInDisk)
}
}
if isMinerMainProcess {
Expand All @@ -221,7 +221,7 @@ func (dl *diskLayer) Storage(accountHash, storageHash common.Hash) ([]byte, erro
minerL3StorageMissMeter.Mark(1)
cachemetrics.RecordMinerCacheDepth("MINER_L4_STORAGE")
cachemetrics.RecordMinerCacheMetrics("MINER_L4_STORAGE", startGetInDisk)
cachemetrics.RecordMinerTotalCosts("MINER_L4_STORAGE", start)
cachemetrics.RecordMinerTotalCosts("MINER_L4_STORAGE", startGetInDisk)
}
}
}()
Expand Down
71 changes: 65 additions & 6 deletions core/state/statedb.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,11 @@ var (
l1StorageMeter = metrics.NewRegisteredMeter("state/cache/storage/total", nil)
minerL1StorageMeter = metrics.NewRegisteredMeter("state/minercache/storage/total", nil)

getStatetSyncIOCost = metrics.NewRegisteredTimer("state/getcache/sync/delay", nil)
getStatetMinerIOCost = metrics.NewRegisteredTimer("state/getcache/miner/delay", nil)
getStatetSyncIOCounter = metrics.NewRegisteredCounter("state/getcache/sync/counter", nil)
getStatetMinerIOCounter = metrics.NewRegisteredCounter("state/getcache/miner/counter", nil)

totalSyncIOCost = metrics.NewRegisteredTimer("state/cache/sync/delay", nil)
totalMinerIOCost = metrics.NewRegisteredTimer("state/cache/miner/delay", nil)
totalSyncIOCounter = metrics.NewRegisteredCounter("state/cache/sync/counter", nil)
Expand Down Expand Up @@ -348,6 +353,8 @@ func (s *StateDB) Empty(addr common.Address) bool {

// GetBalance retrieves the balance from the given address or 0 if object not found
func (s *StateDB) GetBalance(addr common.Address) *big.Int {
start := time.Now()
defer s.markMetrics(start, false)
stateObject := s.getStateObject(addr)
if stateObject != nil {
return stateObject.Balance()
Expand All @@ -356,11 +363,12 @@ func (s *StateDB) GetBalance(addr common.Address) *big.Int {
}

func (s *StateDB) GetNonce(addr common.Address) uint64 {
start := time.Now()
defer s.markMetrics(start, false)
stateObject := s.getStateObject(addr)
if stateObject != nil {
return stateObject.Nonce()
}

return 0
}

Expand All @@ -375,6 +383,8 @@ func (s *StateDB) BlockHash() common.Hash {
}

func (s *StateDB) GetCode(addr common.Address) []byte {
start := time.Now()
defer s.markMetrics(start, false)
stateObject := s.getStateObject(addr)
if stateObject != nil {
return stateObject.Code(s.db)
Expand All @@ -383,6 +393,8 @@ func (s *StateDB) GetCode(addr common.Address) []byte {
}

func (s *StateDB) GetCodeSize(addr common.Address) int {
start := time.Now()
defer s.markMetrics(start, false)
stateObject := s.getStateObject(addr)
if stateObject != nil {
return stateObject.CodeSize(s.db)
Expand All @@ -391,36 +403,63 @@ func (s *StateDB) GetCodeSize(addr common.Address) int {
}

func (s *StateDB) GetCodeHash(addr common.Address) common.Hash {
start := time.Now()
defer s.markMetrics(start, false)
stateObject := s.getStateObject(addr)
if stateObject == nil {
return common.Hash{}
}
return common.BytesToHash(stateObject.CodeHash())
}

func (s *StateDB) markMetrics(start time.Time, reachStorage bool) {
goid := cachemetrics.Goid()
isSyncMainProcess := cachemetrics.IsSyncMainRoutineID(goid)
isMinerMainProcess := cachemetrics.IsMinerMainRoutineID(goid)
// record metrics of syncing main process
if isSyncMainProcess {
totalSyncIOCounter.Inc(time.Since(start).Nanoseconds())
l1AccountMeter.Mark(1)
if reachStorage {
l1StorageMeter.Mark(1)
}
}
// record metrics of mining main process
if isMinerMainProcess {
totalMinerIOCounter.Inc(time.Since(start).Nanoseconds())
minerL1AccountMeter.Mark(1)
if reachStorage {
l1StorageMeter.Mark(1)
}
}

}

// GetState retrieves a value from the given account's storage trie.
func (s *StateDB) GetState(addr common.Address, hash common.Hash) common.Hash {
start := time.Now()
goid := cachemetrics.Goid()

isSyncMainProcess := cachemetrics.IsSyncMainRoutineID(goid)
isMinerMainProcess := cachemetrics.IsMinerMainRoutineID(goid)
defer func() {
// record metrics of syncing main process
if isSyncMainProcess {
syncGetDelay := time.Since(start)
totalSyncIOCost.Update(syncGetDelay)
totalSyncIOCounter.Inc(syncGetDelay.Nanoseconds())
totalSyncIOCounter.Inc(time.Since(start).Nanoseconds())
getStatetSyncIOCost.Update(syncGetDelay)
getStatetSyncIOCounter.Inc(syncGetDelay.Nanoseconds())
l1AccountMeter.Mark(1)
}
// record metrics of mining main process
if isMinerMainProcess {
minerIOCost := time.Since(start)
totalMinerIOCost.Update(minerIOCost)
totalMinerIOCounter.Inc(minerIOCost.Nanoseconds())
totalMinerIOCounter.Inc(time.Since(start).Nanoseconds())
getStatetMinerIOCost.Update(minerIOCost)
getStatetMinerIOCounter.Inc(minerIOCost.Nanoseconds())
minerL1AccountMeter.Mark(1)
}
}()

stateObject := s.getStateObject(addr)
if stateObject != nil {
if isSyncMainProcess {
Expand Down Expand Up @@ -473,9 +512,13 @@ func (s *StateDB) GetStorageProofByHash(a common.Address, key common.Hash) ([][]

// GetCommittedState retrieves a value from the given account's committed storage trie.
func (s *StateDB) GetCommittedState(addr common.Address, hash common.Hash) common.Hash {
start := time.Now()
needStorage := false
defer s.markMetrics(start, needStorage)
stateObject := s.getStateObject(addr)
hit := false
if stateObject != nil {
needStorage = true
return stateObject.GetCommittedState(s.db, hash, &hit)
}
return common.Hash{}
Expand Down Expand Up @@ -512,6 +555,8 @@ func (s *StateDB) HasSuicided(addr common.Address) bool {

// AddBalance adds amount to the account associated with addr.
func (s *StateDB) AddBalance(addr common.Address, amount *big.Int) {
start := time.Now()
defer s.markMetrics(start, false)
stateObject := s.GetOrNewStateObject(addr)
if stateObject != nil {
stateObject.AddBalance(amount)
Expand All @@ -520,36 +565,48 @@ func (s *StateDB) AddBalance(addr common.Address, amount *big.Int) {

// SubBalance subtracts amount from the account associated with addr.
func (s *StateDB) SubBalance(addr common.Address, amount *big.Int) {
start := time.Now()
defer s.markMetrics(start, false)
stateObject := s.GetOrNewStateObject(addr)
if stateObject != nil {
stateObject.SubBalance(amount)
}
}

func (s *StateDB) SetBalance(addr common.Address, amount *big.Int) {
start := time.Now()
defer s.markMetrics(start, false)
stateObject := s.GetOrNewStateObject(addr)
if stateObject != nil {
stateObject.SetBalance(amount)
}
}

func (s *StateDB) SetNonce(addr common.Address, nonce uint64) {
start := time.Now()
defer s.markMetrics(start, false)
stateObject := s.GetOrNewStateObject(addr)
if stateObject != nil {
stateObject.SetNonce(nonce)
}
}

func (s *StateDB) SetCode(addr common.Address, code []byte) {
start := time.Now()
defer s.markMetrics(start, false)
stateObject := s.GetOrNewStateObject(addr)
if stateObject != nil {
stateObject.SetCode(crypto.Keccak256Hash(code), code)
}
}

func (s *StateDB) SetState(addr common.Address, key, value common.Hash) {
start := time.Now()
markStorage := false
defer s.markMetrics(start, markStorage)
stateObject := s.GetOrNewStateObject(addr)
if stateObject != nil {
markStorage = true
stateObject.SetState(s.db, key, value)
}
}
Expand Down Expand Up @@ -866,6 +923,8 @@ func (s *StateDB) createObject(addr common.Address) (newobj, prev *StateObject)
//
// Carrying over the balance ensures that Ether doesn't disappear.
func (s *StateDB) CreateAccount(addr common.Address) {
start := time.Now()
defer s.markMetrics(start, false)
newObj, prev := s.createObject(addr)
if prev != nil {
newObj.setBalance(prev.data.Balance)
Expand Down

0 comments on commit f14d2ed

Please sign in to comment.