github.com/kayoticsully/syncthing@v0.8.9-0.20140724133906-c45a2fdc03f8/cmd/syncthing/perfstats.go (about)

     1  // +build perfstats
     2  
     3  package main
     4  
     5  import (
     6  	"fmt"
     7  	"os"
     8  	"runtime"
     9  	"syscall"
    10  	"time"
    11  )
    12  
    13  func init() {
    14  	go savePerfStats(fmt.Sprintf("perfstats-%d.csv", syscall.Getpid()))
    15  }
    16  
    17  func savePerfStats(file string) {
    18  	fd, err := os.Create(file)
    19  	if err != nil {
    20  		panic(err)
    21  	}
    22  
    23  	var prevUsage int64
    24  	var prevTime int64
    25  	var rusage syscall.Rusage
    26  	var memstats runtime.MemStats
    27  
    28  	t0 := time.Now()
    29  	for t := range time.NewTicker(250 * time.Millisecond).C {
    30  		syscall.Getrusage(syscall.RUSAGE_SELF, &rusage)
    31  		curTime := time.Now().UnixNano()
    32  		timeDiff := curTime - prevTime
    33  		curUsage := rusage.Utime.Nano() + rusage.Stime.Nano()
    34  		usageDiff := curUsage - prevUsage
    35  		cpuUsagePercent := 100 * float64(usageDiff) / float64(timeDiff)
    36  		prevTime = curTime
    37  		prevUsage = curUsage
    38  
    39  		runtime.ReadMemStats(&memstats)
    40  
    41  		startms := int(t.Sub(t0).Seconds() * 1000)
    42  
    43  		fmt.Fprintf(fd, "%d\t%f\t%d\t%d\n", startms, cpuUsagePercent, memstats.Alloc, memstats.Sys)
    44  	}
    45  }