You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
52 lines
1.2 KiB
Go
52 lines
1.2 KiB
Go
3 years ago
|
package main
|
||
|
|
||
|
import (
|
||
|
"log"
|
||
|
"os"
|
||
|
"runtime"
|
||
|
"runtime/pprof"
|
||
|
)
|
||
|
|
||
|
// prof stores the file locations of active profiles.
|
||
|
var prof struct {
|
||
|
cpu *os.File
|
||
|
mem *os.File
|
||
|
}
|
||
|
|
||
|
// startProfile initializes the CPU and memory profile, if specified.
|
||
|
func startProfile(cpuprofile, memprofile string) {
|
||
|
if cpuprofile != "" {
|
||
|
f, err := os.Create(cpuprofile)
|
||
|
if err != nil {
|
||
|
log.Fatalf("failed to create CPU profile file at %s: %s", cpuprofile, err.Error())
|
||
|
}
|
||
|
log.Printf("writing CPU profile to: %s\n", cpuprofile)
|
||
|
prof.cpu = f
|
||
|
pprof.StartCPUProfile(prof.cpu)
|
||
|
}
|
||
|
|
||
|
if memprofile != "" {
|
||
|
f, err := os.Create(memprofile)
|
||
|
if err != nil {
|
||
|
log.Fatalf("failed to create memory profile file at %s: %s", cpuprofile, err.Error())
|
||
|
}
|
||
|
log.Printf("writing memory profile to: %s\n", memprofile)
|
||
|
prof.mem = f
|
||
|
runtime.MemProfileRate = 4096
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// stopProfile closes the CPU and memory profiles if they are running.
|
||
|
func stopProfile() {
|
||
|
if prof.cpu != nil {
|
||
|
pprof.StopCPUProfile()
|
||
|
prof.cpu.Close()
|
||
|
log.Println("CPU profiling stopped")
|
||
|
}
|
||
|
if prof.mem != nil {
|
||
|
pprof.Lookup("heap").WriteTo(prof.mem, 0)
|
||
|
prof.mem.Close()
|
||
|
log.Println("memory profiling stopped")
|
||
|
}
|
||
|
}
|