Browse Source

cmd, core/state: allow configurable trie cache generations

Péter Szilágyi 9 years ago
parent
commit
4f46bd19d0
5 changed files with 29 additions and 12 deletions
  1. 1 1
      cmd/geth/chaincmd.go
  2. 2 1
      cmd/geth/main.go
  3. 6 0
      cmd/geth/usage.go
  4. 15 5
      cmd/utils/flags.go
  5. 5 5
      core/state/statedb.go

+ 1 - 1
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
 }

+ 2 - 1
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,

+ 6 - 0
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,
 		},
 	},
 	{

+ 15 - 5
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)

+ 5 - 5
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) {