Commit 74b38cb6 authored by Brian Tiger Chow's avatar Brian Tiger Chow Committed by Juan Batiz-Benet

refactor(ipfs2/main) change the way we handle profiling

parent d72af9c9
...@@ -26,12 +26,11 @@ import ( ...@@ -26,12 +26,11 @@ import (
var log = u.Logger("cmd/ipfs") var log = u.Logger("cmd/ipfs")
const ( const (
heapProfile = "ipfs.mprof" cpuProfile = "ipfs.cpuprof"
heapProfile = "ipfs.memprof"
errorFormat = "ERROR: %v\n\n" errorFormat = "ERROR: %v\n\n"
) )
var ofi io.WriteCloser
func main() { func main() {
err := run() err := run()
if err != nil { if err != nil {
...@@ -58,15 +57,12 @@ func run() error { ...@@ -58,15 +57,12 @@ func run() error {
u.SetAllLoggers(logging.DEBUG) u.SetAllLoggers(logging.DEBUG)
} }
// if debugging, setup profiling.
if u.Debug { if u.Debug {
var err error stopProfilingFunc, err := startProfiling()
ofi, err = os.Create("cpu.prof")
if err != nil { if err != nil {
return err return err
} }
defer stopProfilingFunc() // to be executed as late as possible
pprof.StartCPUProfile(ofi)
} }
helpTextDisplayed, err := handleHelpOption(req, root) helpTextDisplayed, err := handleHelpOption(req, root)
...@@ -228,7 +224,7 @@ func outputResponse(res cmds.Response, root *cmds.Command) error { ...@@ -228,7 +224,7 @@ func outputResponse(res cmds.Response, root *cmds.Command) error {
} }
} }
emptyErr := errors.New("") // already displayed error text, but want to exit(1) emptyErr := errors.New("") // already displayed error text
return emptyErr return emptyErr
} }
...@@ -266,12 +262,34 @@ func getConfig(path string) (*config.Config, error) { ...@@ -266,12 +262,34 @@ func getConfig(path string) (*config.Config, error) {
return config.Load(configFile) return config.Load(configFile)
} }
// startProfiling begins CPU profiling and returns a `stop` function to be
// executed as late as possible. The stop function captures the memprofile.
func startProfiling() (func(), error) {
// start CPU profiling as early as possible
ofi, err := os.Create(cpuProfile)
if err != nil {
return nil, err
}
pprof.StartCPUProfile(ofi)
stopProfiling := func() {
pprof.StopCPUProfile()
defer ofi.Close() // captured by the closure
err := writeHeapProfileToFile()
if err != nil {
log.Critical(err)
}
}
return stopProfiling, nil
}
func writeHeapProfileToFile() error { func writeHeapProfileToFile() error {
mprof, err := os.Create(heapProfile) mprof, err := os.Create(heapProfile)
if err != nil { if err != nil {
return err return err
} }
defer mprof.Close() defer mprof.Close() // _after_ writing the heap profile
return pprof.WriteHeapProfile(mprof) return pprof.WriteHeapProfile(mprof)
} }
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment