diff --git a/config/config.go b/config/config.go index 580c507a6..93e460d72 100644 --- a/config/config.go +++ b/config/config.go @@ -78,6 +78,8 @@ const ( const ( defaultConfigFile = "config.json" estimatedHeaderSize = 418 + defaultSyncStateMaxPeer = 10 + defaultSyncStateThreadMemory = 30 * 1024 * 1024 defaultSyncHeaderMaxMemoryPercent = 2.0 defaultSyncHeaderMaxSize = 32768 defaultSyncMaxMemoryPercent = 25 @@ -267,6 +269,7 @@ var ( LogLevel: 1, MaxLogFileSize: 20, MaxLogFileTotalSize: 100, + SyncStateMaxThread: 0, SyncHeaderMaxSize: 0, SyncHeaderMaxMemorySize: 0, SyncBatchWindowSize: 0, @@ -357,6 +360,7 @@ type Configuration struct { Mining bool `json:"Mining"` MiningDebug bool `json:"MiningDebug"` BeneficiaryAddr string `json:"BeneficiaryAddr"` + SyncStateMaxThread uint32 `json:"SyncStateMaxThread"` SyncHeaderMaxSize uint32 `json:"SyncHeaderMaxSize"` SyncHeaderMaxMemorySize uint32 `json:"SyncHeaderMaxMemorySize"` SyncBatchWindowSize uint32 `json:"SyncBatchWindowSize"` @@ -461,6 +465,15 @@ func Init() error { Parameters.SyncMode = SyncMode } + if Parameters.SyncStateMaxThread == 0 { + syncStateMaxPeer := uint32(float64(memory.TotalMemory() / defaultSyncStateThreadMemory)) + Parameters.SyncStateMaxThread = syncStateMaxPeer + if Parameters.SyncStateMaxThread == 0 { + Parameters.SyncStateMaxThread = defaultSyncStateMaxPeer + } + log.Printf("Set SyncStateMaxThread to %v", Parameters.SyncStateMaxThread) + } + if Parameters.SyncHeaderMaxSize == 0 { syncHeaderMaxMemorySize := uint64(Parameters.SyncHeaderMaxMemorySize) * 1024 * 1024 if syncHeaderMaxMemorySize == 0 { diff --git a/node/stateSync.go b/node/stateSync.go index 571a76495..bf6e55b90 100644 --- a/node/stateSync.go +++ b/node/stateSync.go @@ -1,6 +1,7 @@ package node import ( + "github.com/nknorg/nkn/v2/config" "math" "time" @@ -171,10 +172,14 @@ func (s *stateSync) run() error { func (s *stateSync) startWorkerThread() { var workerId uint32 - peersNum := len(s.peers) - for workerId = 0; workerId < uint32(peersNum*concurrentSyncRequestPerNeighbor); workerId++ { + peersNum := uint32(len(s.peers)) + workerNum := peersNum * concurrentSyncRequestPerNeighbor + if workerNum > config.Parameters.SyncStateMaxThread { + workerNum = config.Parameters.SyncStateMaxThread + } + for workerId = 0; workerId < workerNum; workerId++ { go func(workerId uint32) { - s.startWorker(s.peers[workerId%uint32(peersNum)]) + s.startWorker(s.peers[workerId%peersNum]) }(workerId) } }