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