Browse Source

Add heap profiling support

Jakob Borg 11 years ago
parent
commit
939dd5cb31
2 changed files with 50 additions and 0 deletions
  1. 46 0
      cmd/syncthing/heapprof.go
  2. 4 0
      cmd/syncthing/perfstats.go

+ 46 - 0
cmd/syncthing/heapprof.go

@@ -0,0 +1,46 @@
+// Copyright (C) 2014 Jakob Borg and Contributors (see the CONTRIBUTORS file).
+// All rights reserved. Use of this source code is governed by an MIT-style
+// license that can be found in the LICENSE file.
+
+// +build heapprof
+
+package main
+
+import (
+	"fmt"
+	"os"
+	"runtime"
+	"runtime/pprof"
+	"syscall"
+	"time"
+)
+
+func init() {
+	go saveHeapProfiles()
+}
+
+func saveHeapProfiles() {
+	runtime.MemProfileRate = 1
+	var memstats, prevMemstats runtime.MemStats
+
+	t0 := time.Now()
+	for t := range time.NewTicker(250 * time.Millisecond).C {
+		startms := int(t.Sub(t0).Seconds() * 1000)
+		runtime.ReadMemStats(&memstats)
+		if memstats.HeapInuse > prevMemstats.HeapInuse {
+			fd, err := os.Create(fmt.Sprintf("heap-%05d-%07d.pprof", syscall.Getpid(), startms))
+			if err != nil {
+				panic(err)
+			}
+			err = pprof.WriteHeapProfile(fd)
+			if err != nil {
+				panic(err)
+			}
+			err = fd.Close()
+			if err != nil {
+				panic(err)
+			}
+			prevMemstats = memstats
+		}
+	}
+}

+ 4 - 0
cmd/syncthing/perfstats.go

@@ -1,3 +1,7 @@
+// Copyright (C) 2014 Jakob Borg and Contributors (see the CONTRIBUTORS file).
+// All rights reserved. Use of this source code is governed by an MIT-style
+// license that can be found in the LICENSE file.
+
 // +build perfstats
 
 package main