From 2aa4340551c4ce95ce0c9f8ef2d752ba58bb8ba6 Mon Sep 17 00:00:00 2001 From: Jakob Borg Date: Wed, 23 Jul 2014 13:17:34 +0200 Subject: [PATCH] Add performance stats collection --- .gitignore | 3 +++ cmd/syncthing/perfstats.go | 45 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 cmd/syncthing/perfstats.go diff --git a/.gitignore b/.gitignore index 87d89c549..0fe8557aa 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,6 @@ discosrv .jshintrc coverage.out files/pidx +discosrv.exe +bin +perfstats*.csv diff --git a/cmd/syncthing/perfstats.go b/cmd/syncthing/perfstats.go new file mode 100644 index 000000000..8711a64af --- /dev/null +++ b/cmd/syncthing/perfstats.go @@ -0,0 +1,45 @@ +// +build perfstats + +package main + +import ( + "fmt" + "os" + "runtime" + "syscall" + "time" +) + +func init() { + go savePerfStats(fmt.Sprintf("perfstats-%d.csv", syscall.Getpid())) +} + +func savePerfStats(file string) { + fd, err := os.Create(file) + if err != nil { + panic(err) + } + + var prevUsage int64 + var prevTime int64 + var rusage syscall.Rusage + var memstats runtime.MemStats + + t0 := time.Now() + for t := range time.NewTicker(250 * time.Millisecond).C { + syscall.Getrusage(syscall.RUSAGE_SELF, &rusage) + curTime := time.Now().UnixNano() + timeDiff := curTime - prevTime + curUsage := rusage.Utime.Nano() + rusage.Stime.Nano() + usageDiff := curUsage - prevUsage + cpuUsagePercent := 100 * float64(usageDiff) / float64(timeDiff) + prevTime = curTime + prevUsage = curUsage + + runtime.ReadMemStats(&memstats) + + startms := int(t.Sub(t0).Seconds() * 1000) + + fmt.Fprintf(fd, "%d\t%f\t%d\t%d\n", startms, cpuUsagePercent, memstats.Alloc, memstats.Sys) + } +}