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  }