github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/app/config/pprof.go (about) 1 package config 2 3 import ( 4 "github.com/fibonacci-chain/fbc/libs/system/trace" 5 "path" 6 7 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/server" 8 9 "github.com/fibonacci-chain/fbc/libs/tendermint/libs/cli" 10 tmos "github.com/fibonacci-chain/fbc/libs/tendermint/libs/os" 11 "github.com/mosn/holmes" 12 "github.com/spf13/viper" 13 ) 14 15 type PporfConfig struct { 16 autoDump bool 17 collectInterval string 18 coolDown string 19 dumpPath string 20 cpuTriggerPercentMin int 21 cpuTriggerPercentDiff int 22 cpuTriggerPercentAbs int 23 memTriggerPercentMin int 24 memTriggerPercentDiff int 25 memTriggerPercentAbs int 26 triggerAbciElapsed int64 27 useCGroup bool 28 } 29 30 const ( 31 FlagPprofAutoDump = "pprof-auto-dump" 32 FlagPprofCollectInterval = "pprof-collect-interval" 33 FlagPprofCpuTriggerPercentMin = "pprof-cpu-trigger-percent-min" 34 FlagPprofCpuTriggerPercentDiff = "pprof-cpu-trigger-percent-diff" 35 FlagPprofCpuTriggerPercentAbs = "pprof-cpu-trigger-percent-abs" 36 FlagPprofMemTriggerPercentMin = "pprof-mem-trigger-percent-min" 37 FlagPprofMemTriggerPercentDiff = "pprof-mem-trigger-percent-diff" 38 FlagPprofMemTriggerPercentAbs = "pprof-mem-trigger-percent-abs" 39 FlagPprofCoolDown = "pprof-cool-down" 40 FlagPprofAbciElapsed = "pprof-trigger-abci-elapsed" 41 FlagPprofUseCGroup = "pprof-use-cgroup" 42 ) 43 44 // PprofDownload auto dump pprof 45 func PprofDownload(context *server.Context) { 46 c := LoadPprofFromConfig() 47 if !c.autoDump { 48 return 49 } 50 51 // auto download pprof by analyzer 52 trace.InitializePprofDumper(context.Logger, c.dumpPath, c.coolDown, c.triggerAbciElapsed) 53 54 // auto download pprof by holmes 55 h, err := holmes.New( 56 holmes.WithCollectInterval(c.collectInterval), 57 holmes.WithCoolDown(c.coolDown), 58 holmes.WithDumpPath(c.dumpPath), 59 holmes.WithCPUDump(c.cpuTriggerPercentMin, c.cpuTriggerPercentDiff, c.cpuTriggerPercentAbs), 60 holmes.WithMemDump(c.memTriggerPercentMin, c.memTriggerPercentDiff, c.memTriggerPercentAbs), 61 holmes.WithGoroutineDump(2000, 50, 5000), 62 holmes.WithBinaryDump(), 63 holmes.WithCGroup(c.useCGroup), 64 ) 65 if err != nil { 66 tmos.Exit(err.Error()) 67 } 68 h.EnableCPUDump().EnableMemDump().EnableGoroutineDump() 69 // start the metrics collect and dump loop 70 h.Start() 71 } 72 73 func LoadPprofFromConfig() *PporfConfig { 74 autoDump := viper.GetBool(FlagPprofAutoDump) 75 collectInterval := viper.GetString(FlagPprofCollectInterval) 76 dumpPath := path.Join(viper.GetString(cli.HomeFlag), "pprof") 77 cpuTriggerPercentMin := viper.GetInt(FlagPprofCpuTriggerPercentMin) 78 cpuTriggerPercentDiff := viper.GetInt(FlagPprofCpuTriggerPercentDiff) 79 cpuTriggerPercentAbs := viper.GetInt(FlagPprofCpuTriggerPercentAbs) 80 memTriggerPercentMin := viper.GetInt(FlagPprofMemTriggerPercentMin) 81 memTriggerPercentDiff := viper.GetInt(FlagPprofMemTriggerPercentDiff) 82 memTriggerPercentAbs := viper.GetInt(FlagPprofMemTriggerPercentAbs) 83 coolDown := viper.GetString(FlagPprofCoolDown) 84 triggerAbciElapsed := viper.GetInt64(FlagPprofAbciElapsed) 85 useCGroup := viper.GetBool(FlagPprofUseCGroup) 86 c := &PporfConfig{ 87 autoDump: autoDump, 88 collectInterval: collectInterval, 89 coolDown: coolDown, 90 dumpPath: dumpPath, 91 cpuTriggerPercentMin: cpuTriggerPercentMin, 92 cpuTriggerPercentDiff: cpuTriggerPercentDiff, 93 cpuTriggerPercentAbs: cpuTriggerPercentAbs, 94 memTriggerPercentMin: memTriggerPercentMin, 95 memTriggerPercentDiff: memTriggerPercentDiff, 96 memTriggerPercentAbs: memTriggerPercentAbs, 97 triggerAbciElapsed: triggerAbciElapsed, 98 useCGroup: useCGroup, 99 } 100 return c 101 }