cmd, core/state: allow configurable trie cache generations

This commit is contained in:
Péter Szilágyi 2016-10-19 14:55:13 +03:00
parent ca49510e6d
commit 4f46bd19d0
No known key found for this signature in database
GPG Key ID: 119A76381CCB7DD2
5 changed files with 29 additions and 12 deletions

@ -99,6 +99,7 @@ func importChain(ctx *cli.Context) error {
utils.Fatalf("Failed to read database stats: %v", err) utils.Fatalf("Failed to read database stats: %v", err)
} }
fmt.Println(stats) 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 // Compact the entire database to more accurately measure disk io and print the stats
start = time.Now() start = time.Now()
@ -113,7 +114,6 @@ func importChain(ctx *cli.Context) error {
utils.Fatalf("Failed to read database stats: %v", err) utils.Fatalf("Failed to read database stats: %v", err)
} }
fmt.Println(stats) fmt.Println(stats)
fmt.Println("Trie cache misses:", trie.CacheMisses())
} }
return nil return nil
} }

@ -134,8 +134,9 @@ participating.
utils.KeyStoreDirFlag, utils.KeyStoreDirFlag,
utils.OlympicFlag, utils.OlympicFlag,
utils.FastSyncFlag, utils.FastSyncFlag,
utils.CacheFlag,
utils.LightKDFFlag, utils.LightKDFFlag,
utils.CacheFlag,
utils.TrieCacheGenFlag,
utils.JSpathFlag, utils.JSpathFlag,
utils.ListenPortFlag, utils.ListenPortFlag,
utils.MaxPeersFlag, utils.MaxPeersFlag,

@ -73,7 +73,13 @@ var AppHelpFlagGroups = []flagGroup{
utils.IdentityFlag, utils.IdentityFlag,
utils.FastSyncFlag, utils.FastSyncFlag,
utils.LightKDFFlag, utils.LightKDFFlag,
},
},
{
Name: "PERFORMANCE TUNING",
Flags: []cli.Flag{
utils.CacheFlag, utils.CacheFlag,
utils.TrieCacheGenFlag,
}, },
}, },
{ {

@ -141,11 +141,6 @@ var (
Usage: "Document Root for HTTPClient file scheme", Usage: "Document Root for HTTPClient file scheme",
Value: DirectoryString{homeDir()}, 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{ FastSyncFlag = cli.BoolFlag{
Name: "fast", Name: "fast",
Usage: "Enable fast syncing through state downloads", Usage: "Enable fast syncing through state downloads",
@ -154,6 +149,17 @@ var (
Name: "lightkdf", Name: "lightkdf",
Usage: "Reduce key-derivation RAM & CPU usage at some expense of KDF strength", 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 // Fork settings
SupportDAOFork = cli.BoolFlag{ SupportDAOFork = cli.BoolFlag{
Name: "support-dao-fork", Name: "support-dao-fork",
@ -721,6 +727,10 @@ func RegisterEthService(ctx *cli.Context, stack *node.Node, extra []byte) {
} }
ethConf.PowTest = true 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) { if err := stack.Register(func(ctx *node.ServiceContext) (node.Service, error) {
return eth.New(ctx, ethConf) return eth.New(ctx, ethConf)

@ -38,14 +38,14 @@ import (
// created. // created.
var StartingNonce uint64 var StartingNonce uint64
// Trie cache generation limit after which to evic trie nodes from memory.
var MaxTrieCacheGen = uint16(120)
const ( const (
// Number of past tries to keep. This value is chosen such that // Number of past tries to keep. This value is chosen such that
// reasonable chain reorg depths will hit an existing trie. // reasonable chain reorg depths will hit an existing trie.
maxPastTries = 12 maxPastTries = 12
// Trie cache generation limit.
maxTrieCacheGen = 120
// Number of codehash->size associations to keep. // Number of codehash->size associations to keep.
codeSizeCacheSize = 100000 codeSizeCacheSize = 100000
) )
@ -89,7 +89,7 @@ type StateDB struct {
// Create a new state from a given trie // Create a new state from a given trie
func New(root common.Hash, db ethdb.Database) (*StateDB, error) { 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 { if err != nil {
return nil, err return nil, err
} }
@ -158,7 +158,7 @@ func (self *StateDB) openTrie(root common.Hash) (*trie.SecureTrie, error) {
return &tr, nil return &tr, nil
} }
} }
return trie.NewSecure(root, self.db, maxTrieCacheGen) return trie.NewSecure(root, self.db, MaxTrieCacheGen)
} }
func (self *StateDB) pushTrie(t *trie.SecureTrie) { func (self *StateDB) pushTrie(t *trie.SecureTrie) {