Merge pull request #2936 from influxdb/fix-2935
fix #2935: hook CPU and memory profiling back uppull/2964/head
commit
0318b4562e
|
@ -7,6 +7,7 @@
|
||||||
- [#2943](https://github.com/influxdb/influxdb/issues/2943): Ensure default retention policies are fully replicated
|
- [#2943](https://github.com/influxdb/influxdb/issues/2943): Ensure default retention policies are fully replicated
|
||||||
- [#2948](https://github.com/influxdb/influxdb/issues/2948): Field mismatch error message to include measurement name
|
- [#2948](https://github.com/influxdb/influxdb/issues/2948): Field mismatch error message to include measurement name
|
||||||
- [#2919](https://github.com/influxdb/influxdb/issues/2919): Unable to insert negative floats
|
- [#2919](https://github.com/influxdb/influxdb/issues/2919): Unable to insert negative floats
|
||||||
|
- [#2935](https://github.com/influxdb/influxdb/issues/2935): Hook CPU and memory profiling back up.
|
||||||
|
|
||||||
## v0.9.0 [2015-06-11]
|
## v0.9.0 [2015-06-11]
|
||||||
|
|
||||||
|
|
|
@ -4,12 +4,8 @@ import (
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"log"
|
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"os"
|
"os"
|
||||||
"os/signal"
|
|
||||||
"runtime"
|
|
||||||
"runtime/pprof"
|
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
@ -135,53 +131,6 @@ func ParseCommandName(args []string) (string, []string) {
|
||||||
return "", args
|
return "", args
|
||||||
}
|
}
|
||||||
|
|
||||||
// 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("cpuprofile: %v", err)
|
|
||||||
}
|
|
||||||
prof.cpu = f
|
|
||||||
pprof.StartCPUProfile(prof.cpu)
|
|
||||||
}
|
|
||||||
|
|
||||||
if memprofile != "" {
|
|
||||||
f, err := os.Create(memprofile)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalf("memprofile: %v", err)
|
|
||||||
}
|
|
||||||
prof.mem = f
|
|
||||||
runtime.MemProfileRate = 4096
|
|
||||||
}
|
|
||||||
|
|
||||||
go func() {
|
|
||||||
c := make(chan os.Signal, 1)
|
|
||||||
signal.Notify(c, os.Interrupt)
|
|
||||||
<-c
|
|
||||||
StopProfile()
|
|
||||||
os.Exit(0)
|
|
||||||
}()
|
|
||||||
}
|
|
||||||
|
|
||||||
// StopProfile closes the cpu and memory profiles if they are running.
|
|
||||||
func StopProfile() {
|
|
||||||
if prof.cpu != nil {
|
|
||||||
pprof.StopCPUProfile()
|
|
||||||
prof.cpu.Close()
|
|
||||||
}
|
|
||||||
if prof.mem != nil {
|
|
||||||
pprof.Lookup("heap").WriteTo(prof.mem, 0)
|
|
||||||
prof.mem.Close()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Command represents the command executed by "influxd version".
|
// Command represents the command executed by "influxd version".
|
||||||
type VersionCommand struct {
|
type VersionCommand struct {
|
||||||
Stdout io.Writer
|
Stdout io.Writer
|
||||||
|
|
|
@ -93,6 +93,8 @@ func (cmd *Command) Run(args ...string) error {
|
||||||
}
|
}
|
||||||
s.Commit = cmd.Commit
|
s.Commit = cmd.Commit
|
||||||
s.Version = cmd.Version
|
s.Version = cmd.Version
|
||||||
|
s.CPUProfile = options.CPUProfile
|
||||||
|
s.MemProfile = options.MemProfile
|
||||||
if err := s.Open(); err != nil {
|
if err := s.Open(); err != nil {
|
||||||
return fmt.Errorf("open server: %s", err)
|
return fmt.Errorf("open server: %s", err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,10 @@ import (
|
||||||
"log"
|
"log"
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"os"
|
||||||
|
"os/signal"
|
||||||
"runtime"
|
"runtime"
|
||||||
|
"runtime/pprof"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/influxdb/influxdb/cluster"
|
"github.com/influxdb/influxdb/cluster"
|
||||||
|
@ -55,6 +58,10 @@ type Server struct {
|
||||||
|
|
||||||
// Server reporting
|
// Server reporting
|
||||||
reportingDisabled bool
|
reportingDisabled bool
|
||||||
|
|
||||||
|
// Profiling
|
||||||
|
CPUProfile string
|
||||||
|
MemProfile string
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewServer returns a new instance of Server built from a config.
|
// NewServer returns a new instance of Server built from a config.
|
||||||
|
@ -247,6 +254,9 @@ func (s *Server) Err() <-chan error { return s.err }
|
||||||
// Open opens the meta and data store and all services.
|
// Open opens the meta and data store and all services.
|
||||||
func (s *Server) Open() error {
|
func (s *Server) Open() error {
|
||||||
if err := func() error {
|
if err := func() error {
|
||||||
|
// Start profiling, if set.
|
||||||
|
startProfile(s.CPUProfile, s.MemProfile)
|
||||||
|
|
||||||
// Resolve host to address.
|
// Resolve host to address.
|
||||||
_, port, err := net.SplitHostPort(s.BindAddress)
|
_, port, err := net.SplitHostPort(s.BindAddress)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -316,6 +326,8 @@ func (s *Server) Open() error {
|
||||||
|
|
||||||
// Close shuts down the meta and data stores and all services.
|
// Close shuts down the meta and data stores and all services.
|
||||||
func (s *Server) Close() error {
|
func (s *Server) Close() error {
|
||||||
|
stopProfile()
|
||||||
|
|
||||||
if s.Listener != nil {
|
if s.Listener != nil {
|
||||||
s.Listener.Close()
|
s.Listener.Close()
|
||||||
}
|
}
|
||||||
|
@ -409,3 +421,54 @@ type Service interface {
|
||||||
Open() error
|
Open() error
|
||||||
Close() error
|
Close() error
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 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("cpuprofile: %v", err)
|
||||||
|
}
|
||||||
|
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("memprofile: %v", err)
|
||||||
|
}
|
||||||
|
log.Printf("writing mem profile to: %s\n", memprofile)
|
||||||
|
prof.mem = f
|
||||||
|
runtime.MemProfileRate = 4096
|
||||||
|
}
|
||||||
|
|
||||||
|
go func() {
|
||||||
|
c := make(chan os.Signal, 1)
|
||||||
|
signal.Notify(c, os.Interrupt)
|
||||||
|
<-c
|
||||||
|
stopProfile()
|
||||||
|
os.Exit(0)
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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 profile stopped")
|
||||||
|
}
|
||||||
|
if prof.mem != nil {
|
||||||
|
pprof.Lookup("heap").WriteTo(prof.mem, 0)
|
||||||
|
prof.mem.Close()
|
||||||
|
log.Println("mem profile stopped")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue