diff --git a/cmd/geth/chaincmd.go b/cmd/geth/chaincmd.go index d7cdf1064f957d3688a484d4938709b54772cfbf..c41375c4d0e6a46b91ebdddb632b6125dfc6d724 100644 --- a/cmd/geth/chaincmd.go +++ b/cmd/geth/chaincmd.go @@ -99,6 +99,7 @@ func importChain(ctx *cli.Context) error { utils.Fatalf("Failed to read database stats: %v", err) } fmt.Println(stats) + fmt.Printf("Trie cache misses: %d\n\n", trie.CacheMisses()) // Compact the entire database to more accurately measure disk io and print the stats start = time.Now() @@ -113,7 +114,6 @@ func importChain(ctx *cli.Context) error { utils.Fatalf("Failed to read database stats: %v", err) } fmt.Println(stats) - fmt.Println("Trie cache misses:", trie.CacheMisses()) } return nil } diff --git a/cmd/geth/main.go b/cmd/geth/main.go index 65311ca418de5235d002082618da3b0931810f3e..ccc42d3cf13df658d7d8332eee0a943502457d41 100644 --- a/cmd/geth/main.go +++ b/cmd/geth/main.go @@ -134,8 +134,9 @@ participating. utils.KeyStoreDirFlag, utils.OlympicFlag, utils.FastSyncFlag, - utils.CacheFlag, utils.LightKDFFlag, + utils.CacheFlag, + utils.TrieCacheGenFlag, utils.JSpathFlag, utils.ListenPortFlag, utils.MaxPeersFlag, diff --git a/cmd/geth/usage.go b/cmd/geth/usage.go index dc1788aad2731b24dc31263bd52b414bd9f79c13..2cb6e77e8608e3ff1aed20762ad69fd186ce899d 100644 --- a/cmd/geth/usage.go +++ b/cmd/geth/usage.go @@ -73,7 +73,13 @@ var AppHelpFlagGroups = []flagGroup{ utils.IdentityFlag, utils.FastSyncFlag, utils.LightKDFFlag, + }, + }, + { + Name: "PERFORMANCE TUNING", + Flags: []cli.Flag{ utils.CacheFlag, + utils.TrieCacheGenFlag, }, }, { diff --git a/cmd/utils/flags.go b/cmd/utils/flags.go index 0c5206a17adeea47ceed743c8cee9c24ba4593c8..1859f735d6bf7378b95e590e96f26ee914868be0 100644 --- a/cmd/utils/flags.go +++ b/cmd/utils/flags.go @@ -141,11 +141,6 @@ var ( Usage: "Document Root for HTTPClient file scheme", Value: DirectoryString{homeDir()}, } - CacheFlag = cli.IntFlag{ - Name: "cache", - Usage: "Megabytes of memory allocated to internal caching (min 16MB / database forced)", - Value: 128, - } FastSyncFlag = cli.BoolFlag{ Name: "fast", Usage: "Enable fast syncing through state downloads", @@ -154,6 +149,17 @@ var ( Name: "lightkdf", Usage: "Reduce key-derivation RAM & CPU usage at some expense of KDF strength", } + // Performance tuning settings + CacheFlag = cli.IntFlag{ + Name: "cache", + Usage: "Megabytes of memory allocated to internal caching (min 16MB / database forced)", + Value: 128, + } + TrieCacheGenFlag = cli.IntFlag{ + Name: "trie-cache-gens", + Usage: "Number of trie node generations to keep in memory", + Value: int(state.MaxTrieCacheGen), + } // Fork settings SupportDAOFork = cli.BoolFlag{ Name: "support-dao-fork", @@ -721,6 +727,10 @@ func RegisterEthService(ctx *cli.Context, stack *node.Node, extra []byte) { } ethConf.PowTest = true } + // Override any global options pertaining to the Ethereum protocol + if gen := ctx.GlobalInt(TrieCacheGenFlag.Name); gen > 0 { + state.MaxTrieCacheGen = uint16(gen) + } if err := stack.Register(func(ctx *node.ServiceContext) (node.Service, error) { return eth.New(ctx, ethConf) diff --git a/core/state/statedb.go b/core/state/statedb.go index 0e46e5e2cb1e774d8f573e8c0fe6219bec628cea..6a24d2865e49a2b8f416f3c1ffbf3defd370bcb1 100644 --- a/core/state/statedb.go +++ b/core/state/statedb.go @@ -38,14 +38,14 @@ import ( // created. var StartingNonce uint64 +// Trie cache generation limit after which to evic trie nodes from memory. +var MaxTrieCacheGen = uint16(120) + const ( // Number of past tries to keep. This value is chosen such that // reasonable chain reorg depths will hit an existing trie. maxPastTries = 12 - // Trie cache generation limit. - maxTrieCacheGen = 120 - // Number of codehash->size associations to keep. codeSizeCacheSize = 100000 ) @@ -89,7 +89,7 @@ type StateDB struct { // Create a new state from a given trie func New(root common.Hash, db ethdb.Database) (*StateDB, error) { - tr, err := trie.NewSecure(root, db, maxTrieCacheGen) + tr, err := trie.NewSecure(root, db, MaxTrieCacheGen) if err != nil { return nil, err } @@ -158,7 +158,7 @@ func (self *StateDB) openTrie(root common.Hash) (*trie.SecureTrie, error) { return &tr, nil } } - return trie.NewSecure(root, self.db, maxTrieCacheGen) + return trie.NewSecure(root, self.db, MaxTrieCacheGen) } func (self *StateDB) pushTrie(t *trie.SecureTrie) {