Merge pull request #69 from safing/feature/cpu-profiling

Add cpu profiling capability to base module
This commit is contained in:
Patrick Pacher 2020-06-04 08:00:04 +02:00 committed by GitHub
commit fdcacfdb61
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 54 additions and 1 deletions

View file

@ -8,8 +8,12 @@ import (
_ "github.com/safing/portbase/rng"
)
var (
module *modules.Module
)
func init() {
modules.Register("base", nil, registerDatabases, nil, "database", "config", "rng")
module = modules.Register("base", nil, start, nil, "database", "config", "rng")
// For prettier subsystem graph, printed with --print-subsystem-graph
/*
@ -23,3 +27,9 @@ func init() {
)
*/
}
func start() error {
startProfiling()
return registerDatabases()
}

43
core/base/profiling.go Normal file
View file

@ -0,0 +1,43 @@
package base
import (
"context"
"flag"
"fmt"
"os"
"runtime/pprof"
)
var (
cpuProfile string
)
func init() {
flag.StringVar(&cpuProfile, "cpuprofile", "", "write cpu profile to `file`")
}
func startProfiling() {
if cpuProfile != "" {
module.StartWorker("cpu profiler", cpuProfiler)
}
}
func cpuProfiler(ctx context.Context) error {
f, err := os.Create(cpuProfile)
if err != nil {
return fmt.Errorf("could not create CPU profile: %s", err)
}
if err := pprof.StartCPUProfile(f); err != nil {
return fmt.Errorf("could not start CPU profile: %s", err)
}
// wait for shutdown
<-ctx.Done()
pprof.StopCPUProfile()
err = f.Close()
if err != nil {
return fmt.Errorf("failed to close CPU profile file: %s", err)
}
return nil
}