diff --git a/cmd/syncthing/blockprof.go b/cmd/syncthing/blockprof.go new file mode 100644 index 000000000..86af6ae48 --- /dev/null +++ b/cmd/syncthing/blockprof.go @@ -0,0 +1,59 @@ +// Copyright (C) 2014 The Syncthing Authors. +// +// This program is free software: you can redistribute it and/or modify it +// under the terms of the GNU General Public License as published by the Free +// Software Foundation, either version 3 of the License, or (at your option) +// any later version. +// +// This program is distributed in the hope that it will be useful, but WITHOUT +// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +// more details. +// +// You should have received a copy of the GNU General Public License along +// with this program. If not, see . + +package main + +import ( + "fmt" + "os" + "runtime" + "runtime/pprof" + "syscall" + "time" +) + +func init() { + if innerProcess && os.Getenv("STBLOCKPROFILE") != "" { + profiler := pprof.Lookup("block") + if profiler == nil { + panic("Couldn't find block profiler") + } + l.Debugln("Starting block profiling") + go saveBlockingProfiles(profiler) + } +} + +func saveBlockingProfiles(profiler *pprof.Profile) { + runtime.SetBlockProfileRate(1) + + t0 := time.Now() + for t := range time.NewTicker(20 * time.Second).C { + startms := int(t.Sub(t0).Seconds() * 1000) + + fd, err := os.Create(fmt.Sprintf("block-%05d-%07d.pprof", syscall.Getpid(), startms)) + if err != nil { + panic(err) + } + err = profiler.WriteTo(fd, 0) + if err != nil { + panic(err) + } + err = fd.Close() + if err != nil { + panic(err) + } + + } +} diff --git a/cmd/syncthing/main.go b/cmd/syncthing/main.go index 2c6fa6ef5..d2e8de382 100644 --- a/cmd/syncthing/main.go +++ b/cmd/syncthing/main.go @@ -142,38 +142,41 @@ Development Settings The following environment variables modify syncthing's behavior in ways that are mostly useful for developers. Use with care. - STGUIASSETS Directory to load GUI assets from. Overrides compiled in assets. + STGUIASSETS Directory to load GUI assets from. Overrides compiled in assets. - STTRACE A comma separated string of facilities to trace. The valid - facility strings are: + STTRACE A comma separated string of facilities to trace. The valid + facility strings are: - - "beacon" (the beacon package) - - "discover" (the discover package) - - "events" (the events package) - - "files" (the files package) - - "net" (the main package; connections & network messages) - - "model" (the model package) - - "scanner" (the scanner package) - - "stats" (the stats package) - - "upnp" (the upnp package) - - "xdr" (the xdr package) - - "all" (all of the above) + - "beacon" (the beacon package) + - "discover" (the discover package) + - "events" (the events package) + - "files" (the files package) + - "net" (the main package; connections & network messages) + - "model" (the model package) + - "scanner" (the scanner package) + - "stats" (the stats package) + - "upnp" (the upnp package) + - "xdr" (the xdr package) + - "all" (all of the above) - STPROFILER Set to a listen address such as "127.0.0.1:9090" to start the - profiler with HTTP access. + STPROFILER Set to a listen address such as "127.0.0.1:9090" to start the + profiler with HTTP access. - STCPUPROFILE Write a CPU profile to cpu-$pid.pprof on exit. + STCPUPROFILE Write a CPU profile to cpu-$pid.pprof on exit. - STHEAPPROFILE Write heap profiles to heap-$pid-$timestamp.pprof each time - heap usage increases. + STHEAPPROFILE Write heap profiles to heap-$pid-$timestamp.pprof each time + heap usage increases. - STPERFSTATS Write running performance statistics to perf-$pid.csv. Not - supported on Windows. + STBLOCKPROFILE Write block profiles to block-$pid-$timestamp.pprof every 20 + seconds. - STNOUPGRADE Disable automatic upgrades. + STPERFSTATS Write running performance statistics to perf-$pid.csv. Not + supported on Windows. - GOMAXPROCS Set the maximum number of CPU cores to use. Defaults to all - available CPU cores.` + STNOUPGRADE Disable automatic upgrades. + + GOMAXPROCS Set the maximum number of CPU cores to use. Defaults to all + available CPU cores.` ) // Command line and environment options