mirror of
https://github.com/rclone/rclone.git
synced 2024-11-25 17:57:44 +08:00
fs: add --dump goroutines and --dump openfiles
These are developer flags useful for tracking down resource leaks.
This commit is contained in:
parent
37be78705d
commit
dcf8334673
22
cmd/cmd.go
22
cmd/cmd.go
|
@ -10,10 +10,12 @@ import (
|
|||
"fmt"
|
||||
"log"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path"
|
||||
"regexp"
|
||||
"runtime"
|
||||
"runtime/pprof"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"github.com/pkg/errors"
|
||||
|
@ -322,6 +324,26 @@ func Run(Retry bool, showStats bool, cmd *cobra.Command, f func() error) {
|
|||
accounting.Stats.Log()
|
||||
}
|
||||
fs.Debugf(nil, "%d go routines active\n", runtime.NumGoroutine())
|
||||
|
||||
// dump all running go-routines
|
||||
if fs.Config.Dump&fs.DumpGoRoutines != 0 {
|
||||
err = pprof.Lookup("goroutine").WriteTo(os.Stdout, 1)
|
||||
if err != nil {
|
||||
fs.Errorf(nil, "Failed to dump goroutines: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
// dump open files
|
||||
if fs.Config.Dump&fs.DumpOpenFiles != 0 {
|
||||
c := exec.Command("lsof", "-p", strconv.Itoa(os.Getpid()))
|
||||
c.Stdout = os.Stdout
|
||||
c.Stderr = os.Stderr
|
||||
err = c.Run()
|
||||
if err != nil {
|
||||
fs.Errorf(nil, "Failed to list open files: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
if accounting.Stats.Errored() {
|
||||
resolveExitCode(accounting.Stats.GetLastError())
|
||||
}
|
||||
|
|
|
@ -953,6 +953,17 @@ only.
|
|||
Dump the filters to the output. Useful to see exactly what include
|
||||
and exclude options are filtering on.
|
||||
|
||||
#### --dump goroutines ####
|
||||
|
||||
This dumps a list of the running go-routines at the end of the command
|
||||
to standard output.
|
||||
|
||||
#### --dump openfiles ####
|
||||
|
||||
This dumps a list of the open files at the end of the command. It
|
||||
uses the `lsof` command to do that so you'll need that installed to
|
||||
use it.
|
||||
|
||||
### --memprofile=FILE ###
|
||||
|
||||
Write memory profile to file. This can be analysed with `go tool pprof`.
|
||||
|
|
|
@ -18,6 +18,8 @@ const (
|
|||
DumpResponses
|
||||
DumpAuth
|
||||
DumpFilters
|
||||
DumpGoRoutines
|
||||
DumpOpenFiles
|
||||
)
|
||||
|
||||
var dumpFlags = []struct {
|
||||
|
@ -30,6 +32,8 @@ var dumpFlags = []struct {
|
|||
{DumpResponses, "responses"},
|
||||
{DumpAuth, "auth"},
|
||||
{DumpFilters, "filters"},
|
||||
{DumpGoRoutines, "goroutines"},
|
||||
{DumpOpenFiles, "openfiles"},
|
||||
}
|
||||
|
||||
// DumpFlagsList is a list of dump flags used in the help
|
||||
|
|
Loading…
Reference in New Issue
Block a user