diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 000000000..0cc8d7796 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,3 @@ +# git config merge.theirs.name "Always accept theirs" +# git config merge.theirs.driver "cp %B %A" +default.pgo binary merge=theirs diff --git a/default.pgo b/default.pgo new file mode 100644 index 000000000..c6a64540f Binary files /dev/null and b/default.pgo differ diff --git a/main.go b/main.go index 1f3a7d530..9583b2334 100644 --- a/main.go +++ b/main.go @@ -14,6 +14,23 @@ import ( ) func main() { + // this runs profiling server. To enable it, build with prof tag + // $ go build -tags prof + // + // Then you can pass a port using MTG_PROF_PORT environment variable. + // Default is 6000 + // $ MTG_PROF_PORT=6000 mtg run config.toml + // + // It will run a webserver with profiling data on + // localhost:${MTG_PROF_PORT:-6000}. + // + // To collect PGO do following: + // $ curl -o default.pgo 'http://localhost:6000/debug/pprof/profile?seconds=300' + // + // See also https://pkg.go.dev/net/http/pprof + // https://go.dev/blog/pprof + runProfile() + cli := &cli.CLI{} ctx := kong.Parse(cli, kong.Vars{ "version": getVersion(), diff --git a/run_profile.go b/run_profile.go new file mode 100644 index 000000000..06b7ab81a --- /dev/null +++ b/run_profile.go @@ -0,0 +1,7 @@ +//go:build !prof + +package main + +func runProfile() { + +} diff --git a/run_profile_tag_prof.go b/run_profile_tag_prof.go new file mode 100644 index 000000000..63ca2d8c5 --- /dev/null +++ b/run_profile_tag_prof.go @@ -0,0 +1,27 @@ +//go:build prof + +package main + +import ( + "fmt" + "net" + "net/http" + _ "net/http/pprof" //nolint: gosec + "os" +) + +const DefaultProfPort = "6000" + +func runProfile() { + port := os.Getenv("MTG_PROF_PORT") + if port == "" { + port = DefaultProfPort + } + + listener, err := net.Listen("tcp", net.JoinHostPort("127.0.0.1", port)) + if err != nil { + panic(err) + } + + go http.Serve(listener, nil) +}