From 939dd5cb318f458175bb0b14ddcb82f6e244b52a Mon Sep 17 00:00:00 2001 From: Jakob Borg Date: Tue, 12 Aug 2014 13:53:24 +0200 Subject: [PATCH] Add heap profiling support --- cmd/syncthing/heapprof.go | 46 ++++++++++++++++++++++++++++++++++++++ cmd/syncthing/perfstats.go | 4 ++++ 2 files changed, 50 insertions(+) create mode 100644 cmd/syncthing/heapprof.go diff --git a/cmd/syncthing/heapprof.go b/cmd/syncthing/heapprof.go new file mode 100644 index 000000000..6e6b17f13 --- /dev/null +++ b/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 + } + } +} diff --git a/cmd/syncthing/perfstats.go b/cmd/syncthing/perfstats.go index ffc78fa62..cb701a350 100644 --- a/cmd/syncthing/perfstats.go +++ b/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