aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorgary rong <garyrong0905@gmail.com>2019-08-15 20:54:16 +0800
committerFelix Lange <fjl@twurst.com>2019-08-15 20:54:16 +0800
commit2c50b2c90431ec6663ad7504ce1edf60786191c4 (patch)
tree90a53e3f6d3c9ffe2383b836538cd75dc532e937
parent9bad7fa717cf92d6c1c8836ea2c42f0d66cc21ea (diff)
downloadgo-tangerine-2c50b2c90431ec6663ad7504ce1edf60786191c4.tar
go-tangerine-2c50b2c90431ec6663ad7504ce1edf60786191c4.tar.gz
go-tangerine-2c50b2c90431ec6663ad7504ce1edf60786191c4.tar.bz2
go-tangerine-2c50b2c90431ec6663ad7504ce1edf60786191c4.tar.lz
go-tangerine-2c50b2c90431ec6663ad7504ce1edf60786191c4.tar.xz
go-tangerine-2c50b2c90431ec6663ad7504ce1edf60786191c4.tar.zst
go-tangerine-2c50b2c90431ec6663ad7504ce1edf60786191c4.zip
cmd/geth: set up cache and metrics when starting node (#19911)
-rw-r--r--cmd/geth/consolecmd.go1
-rw-r--r--cmd/geth/main.go85
2 files changed, 46 insertions, 40 deletions
diff --git a/cmd/geth/consolecmd.go b/cmd/geth/consolecmd.go
index d4443b328..83614f60e 100644
--- a/cmd/geth/consolecmd.go
+++ b/cmd/geth/consolecmd.go
@@ -77,6 +77,7 @@ JavaScript API. See https://github.com/ethereum/go-ethereum/wiki/JavaScript-Cons
// same time.
func localConsole(ctx *cli.Context) error {
// Create and start the node based on the CLI flags
+ prepare(ctx)
node := makeFullNode(ctx)
startNode(ctx, node)
defer node.Close()
diff --git a/cmd/geth/main.go b/cmd/geth/main.go
index 5ae358d52..4c51f092d 100644
--- a/cmd/geth/main.go
+++ b/cmd/geth/main.go
@@ -242,46 +242,6 @@ func init() {
if err := debug.Setup(ctx, logdir); err != nil {
return err
}
- // If we're a full node on mainnet without --cache specified, bump default cache allowance
- if ctx.GlobalString(utils.SyncModeFlag.Name) != "light" && !ctx.GlobalIsSet(utils.CacheFlag.Name) && !ctx.GlobalIsSet(utils.NetworkIdFlag.Name) {
- // Make sure we're not on any supported preconfigured testnet either
- if !ctx.GlobalIsSet(utils.TestnetFlag.Name) && !ctx.GlobalIsSet(utils.RinkebyFlag.Name) && !ctx.GlobalIsSet(utils.GoerliFlag.Name) && !ctx.GlobalIsSet(utils.DeveloperFlag.Name) {
- // Nope, we're really on mainnet. Bump that cache up!
- log.Info("Bumping default cache on mainnet", "provided", ctx.GlobalInt(utils.CacheFlag.Name), "updated", 4096)
- ctx.GlobalSet(utils.CacheFlag.Name, strconv.Itoa(4096))
- }
- }
- // If we're running a light client on any network, drop the cache to some meaningfully low amount
- if ctx.GlobalString(utils.SyncModeFlag.Name) == "light" && !ctx.GlobalIsSet(utils.CacheFlag.Name) {
- log.Info("Dropping default light client cache", "provided", ctx.GlobalInt(utils.CacheFlag.Name), "updated", 128)
- ctx.GlobalSet(utils.CacheFlag.Name, strconv.Itoa(128))
- }
- // Cap the cache allowance and tune the garbage collector
- var mem gosigar.Mem
- // Workaround until OpenBSD support lands into gosigar
- // Check https://github.com/elastic/gosigar#supported-platforms
- if runtime.GOOS != "openbsd" {
- if err := mem.Get(); err == nil {
- allowance := int(mem.Total / 1024 / 1024 / 3)
- if cache := ctx.GlobalInt(utils.CacheFlag.Name); cache > allowance {
- log.Warn("Sanitizing cache to Go's GC limits", "provided", cache, "updated", allowance)
- ctx.GlobalSet(utils.CacheFlag.Name, strconv.Itoa(allowance))
- }
- }
- }
- // Ensure Go's GC ignores the database cache for trigger percentage
- cache := ctx.GlobalInt(utils.CacheFlag.Name)
- gogc := math.Max(20, math.Min(100, 100/(float64(cache)/1024)))
-
- log.Debug("Sanitizing Go's GC trigger", "percent", int(gogc))
- godebug.SetGCPercent(int(gogc))
-
- // Start metrics export if enabled
- utils.SetupMetrics(ctx)
-
- // Start system runtime metrics collection
- go metrics.CollectProcessMetrics(3 * time.Second)
-
return nil
}
@@ -299,6 +259,50 @@ func main() {
}
}
+// prepare manipulates memory cache allowance and setups metric system.
+// This function should be called before launching devp2p stack.
+func prepare(ctx *cli.Context) {
+ // If we're a full node on mainnet without --cache specified, bump default cache allowance
+ if ctx.GlobalString(utils.SyncModeFlag.Name) != "light" && !ctx.GlobalIsSet(utils.CacheFlag.Name) && !ctx.GlobalIsSet(utils.NetworkIdFlag.Name) {
+ // Make sure we're not on any supported preconfigured testnet either
+ if !ctx.GlobalIsSet(utils.TestnetFlag.Name) && !ctx.GlobalIsSet(utils.RinkebyFlag.Name) && !ctx.GlobalIsSet(utils.GoerliFlag.Name) && !ctx.GlobalIsSet(utils.DeveloperFlag.Name) {
+ // Nope, we're really on mainnet. Bump that cache up!
+ log.Info("Bumping default cache on mainnet", "provided", ctx.GlobalInt(utils.CacheFlag.Name), "updated", 4096)
+ ctx.GlobalSet(utils.CacheFlag.Name, strconv.Itoa(4096))
+ }
+ }
+ // If we're running a light client on any network, drop the cache to some meaningfully low amount
+ if ctx.GlobalString(utils.SyncModeFlag.Name) == "light" && !ctx.GlobalIsSet(utils.CacheFlag.Name) {
+ log.Info("Dropping default light client cache", "provided", ctx.GlobalInt(utils.CacheFlag.Name), "updated", 128)
+ ctx.GlobalSet(utils.CacheFlag.Name, strconv.Itoa(128))
+ }
+ // Cap the cache allowance and tune the garbage collector
+ var mem gosigar.Mem
+ // Workaround until OpenBSD support lands into gosigar
+ // Check https://github.com/elastic/gosigar#supported-platforms
+ if runtime.GOOS != "openbsd" {
+ if err := mem.Get(); err == nil {
+ allowance := int(mem.Total / 1024 / 1024 / 3)
+ if cache := ctx.GlobalInt(utils.CacheFlag.Name); cache > allowance {
+ log.Warn("Sanitizing cache to Go's GC limits", "provided", cache, "updated", allowance)
+ ctx.GlobalSet(utils.CacheFlag.Name, strconv.Itoa(allowance))
+ }
+ }
+ }
+ // Ensure Go's GC ignores the database cache for trigger percentage
+ cache := ctx.GlobalInt(utils.CacheFlag.Name)
+ gogc := math.Max(20, math.Min(100, 100/(float64(cache)/1024)))
+
+ log.Debug("Sanitizing Go's GC trigger", "percent", int(gogc))
+ godebug.SetGCPercent(int(gogc))
+
+ // Start metrics export if enabled
+ utils.SetupMetrics(ctx)
+
+ // Start system runtime metrics collection
+ go metrics.CollectProcessMetrics(3 * time.Second)
+}
+
// geth is the main entry point into the system if no special subcommand is ran.
// It creates a default node based on the command line arguments and runs it in
// blocking mode, waiting for it to be shut down.
@@ -306,6 +310,7 @@ func geth(ctx *cli.Context) error {
if args := ctx.Args(); len(args) > 0 {
return fmt.Errorf("invalid command: %q", args[0])
}
+ prepare(ctx)
node := makeFullNode(ctx)
defer node.Close()
startNode(ctx, node)