diff --git a/cmd/geth/chaincmd.go b/cmd/geth/chaincmd.go index 48aa0e4648..0b6ba77958 100644 --- a/cmd/geth/chaincmd.go +++ b/cmd/geth/chaincmd.go @@ -474,11 +474,12 @@ func showMetrics() { fmt.Println("StateCopyTime: ", state.StateCopyTime) fmt.Println("StateCopyNewTime: ", state.StateNewTime) fmt.Println("StateDeepCpTime: ", state.StateDeepCpTime) - fmt.Println("PrefetchBALTime: ", core.PrefetchBALTime) + fmt.Println("PrefetchBALtime: ", core.PrefetchBALTime) fmt.Println("PrefetchMergeTime:", core.PrefetchMergeBALTime) fmt.Println("ParallelExeTime: ", core.ParallelExeTime) fmt.Println("PostMergeTime: ", core.PostMergeTime) - fmt.Println("PrefetchTrieTime: ", core.PrefetchTrieTimer) + fmt.Println("PrefetchTrieWallTime: ", core.PrefetchTrieTimer) + // fmt.Println("PrefetchTrieCPUtime: ", state.PrefetchTrieCPUTime) // total fmt.Println("blockInsertTimer", blockInsertTimer.Total()) diff --git a/core/parallel_state_processor.go b/core/parallel_state_processor.go index aa08530be1..34f34fe20c 100644 --- a/core/parallel_state_processor.go +++ b/core/parallel_state_processor.go @@ -101,9 +101,9 @@ func (p *ParallelStateProcessor) Process(block *types.Block, statedb *state.Stat go func() { defer wg.Done() - start := time.Now() + preCalPostStart := time.Now() statedb.PreComputePostState(block.NumberU64(), runtime.NumCPU()/2) - PrefetchMergeBALTime += time.Since(start) + PrefetchMergeBALTime += time.Since(preCalPostStart) exeStart := time.Now() result, err = p.executeParallel(block, statedb, cfg, gp, signer, context, initialdb) diff --git a/core/state/statedb.go b/core/state/statedb.go index e9ffba5689..ecf06102cd 100644 --- a/core/state/statedb.go +++ b/core/state/statedb.go @@ -27,6 +27,7 @@ import ( "slices" "sync" "sync/atomic" + "syscall" "time" "github.com/ethereum/go-ethereum/common" @@ -217,7 +218,7 @@ func init() { case BalPreblockKeysPostValues: { println("bal preblock keys post values") - fileName = "access_lists_kpostv.2000.json" + fileName = "access_lists_kpostv.json" data, err := os.ReadFile(fileName) if err != nil { log.Error("Failed to load access lists", "err", err) @@ -732,9 +733,23 @@ func (s *StateDB) MergePostBalStates() { } } +// Must profile it seperately with sequentially processing postState merge and parallel processing in parallel_state_processor.go +var PrefetchTrieCPUTime = time.Duration(0) + +func GetCPU() int64 { + usage := new(syscall.Rusage) + syscall.Getrusage(syscall.RUSAGE_SELF, usage) + return usage.Utime.Nano() + usage.Stime.Nano() +} + func (s *StateDB) PrefetchTrie() { var workers errgroup.Group + cpuUsed := runtime.NumCPU() / 2 + workers.SetLimit(cpuUsed) + + start := GetCPU() + for addr := range s.journal.dirties { addr := addr // s.trie.GetAccount(addr) @@ -778,6 +793,8 @@ func (s *StateDB) PrefetchTrie() { tr, _ := s.db.OpenStorageTrie(s.originalRoot, params.BeaconRootsAddress, obj.data.Root, nil) obj.trie = tr } + + PrefetchTrieCPUTime += time.Duration((GetCPU() - start) / int64(cpuUsed) * 2) } func (s *StateDB) setRefund(gas uint64) {