diff --git a/prog/app.go b/prog/app.go index 0642676e8..b63ace7a3 100644 --- a/prog/app.go +++ b/prog/app.go @@ -7,6 +7,7 @@ import ( _ "net/http/pprof" "net/url" "os" + "runtime" "strconv" "strings" "time" @@ -199,6 +200,7 @@ func pipeRouterFactory(userIDer multitenant.UserIDer, pipeRouterURL, consulInf s func appMain(flags appFlags) { setLogLevel(flags.logLevel) setLogFormatter(flags.logPrefix) + runtime.SetBlockProfileRate(flags.blockProfileRate) defer log.Info("app exiting") rand.Seed(time.Now().UnixNano()) diff --git a/prog/main.go b/prog/main.go index 7e9aed1f6..44b99e060 100644 --- a/prog/main.go +++ b/prog/main.go @@ -111,6 +111,8 @@ type appFlags struct { memcachedExpiration time.Duration userIDHeader string + blockProfileRate int + awsCreateTables bool consulInf string } @@ -197,6 +199,8 @@ func main() { flag.StringVar(&flags.app.memcachedService, "app.memcached.service", "memcached", "SRV service used to discover memcache servers.") flag.StringVar(&flags.app.userIDHeader, "app.userid.header", "", "HTTP header to use as userid") + flag.IntVar(&flags.app.blockProfileRate, "app.block.profile.rate", 0, "If more than 0, enable block profiling. The profiler aims to sample an average of one blocking event per rate nanoseconds spent blocked.") + flag.BoolVar(&flags.app.awsCreateTables, "app.aws.create.tables", false, "Create the tables in DynamoDB") flag.StringVar(&flags.app.consulInf, "app.consul.inf", "", "The interface who's address I should advertise myself under in consul") diff --git a/site/building.md b/site/building.md index 5f24fdf0d..70ce93bcc 100644 --- a/site/building.md +++ b/site/building.md @@ -72,6 +72,12 @@ To collect the CPU profile of the Scope Probe: go tool pprof http://localhost:4041/debug/pprof/profile +To collect a blocking profile of the Scope App, make sure you have launched +Scope with `--app.block.profile.rate=N` (where `N` is the number of +nanoseconds between samples) and then: + + go tool pprof http://localhost:4040/debug/pprof/block + If you don't have `go` installed, you can use a Docker container instead: To collect the memory profile of the Scope App: