mirror of
https://github.com/kopia/kopia.git
synced 2026-01-23 22:07:54 -05:00
This helps recycle buffers more efficiently during snapshots. Also, improved memory tracking, enabled profiling flags and added pprof by default.
47 lines
1.3 KiB
Go
47 lines
1.3 KiB
Go
package cli
|
|
|
|
import (
|
|
"github.com/alecthomas/kingpin"
|
|
"github.com/pkg/profile"
|
|
)
|
|
|
|
type profileFlags struct {
|
|
profileDir string
|
|
profileCPU bool
|
|
profileMemory int
|
|
profileBlocking bool
|
|
profileMutex bool
|
|
}
|
|
|
|
func (c *profileFlags) setup(app *kingpin.Application) {
|
|
app.Flag("profile-dir", "Write profile to the specified directory").Hidden().StringVar(&c.profileDir)
|
|
app.Flag("profile-cpu", "Enable CPU profiling").Hidden().BoolVar(&c.profileCPU)
|
|
app.Flag("profile-memory", "Enable memory profiling").Hidden().IntVar(&c.profileMemory)
|
|
app.Flag("profile-blocking", "Enable block profiling").Hidden().BoolVar(&c.profileBlocking)
|
|
app.Flag("profile-mutex", "Enable mutex profiling").Hidden().BoolVar(&c.profileMutex)
|
|
}
|
|
|
|
// withProfiling runs the given callback with profiling enabled, configured according to command line flags.
|
|
func (c *profileFlags) withProfiling(callback func() error) error {
|
|
if c.profileDir != "" {
|
|
pp := profile.ProfilePath(c.profileDir)
|
|
if c.profileMemory > 0 {
|
|
defer profile.Start(pp, profile.MemProfileRate(c.profileMemory)).Stop()
|
|
}
|
|
|
|
if c.profileCPU {
|
|
defer profile.Start(pp, profile.CPUProfile).Stop()
|
|
}
|
|
|
|
if c.profileBlocking {
|
|
defer profile.Start(pp, profile.BlockProfile).Stop()
|
|
}
|
|
|
|
if c.profileMutex {
|
|
defer profile.Start(pp, profile.MutexProfile).Stop()
|
|
}
|
|
}
|
|
|
|
return callback()
|
|
}
|