diff --git a/cmd/cri-containerd/cri_containerd.go b/cmd/cri-containerd/cri_containerd.go index 1793cc0bd..30191f7b7 100644 --- a/cmd/cri-containerd/cri_containerd.go +++ b/cmd/cri-containerd/cri_containerd.go @@ -19,6 +19,9 @@ package main import ( "flag" "os" + "os/signal" + "runtime" + "syscall" "github.com/docker/docker/pkg/reexec" "github.com/golang/glog" @@ -83,6 +86,7 @@ func main() { cmd.AddCommand(versionCommand()) cmd.Run = func(cmd *cobra.Command, args []string) { + setupDumpStacksTrap() if err := o.InitFlags(cmd.Flags()); err != nil { glog.Exitf("Failed to init CRI containerd flags: %v", err) } @@ -118,3 +122,28 @@ func validateConfig(o *options.CRIContainerdOptions) { selinux.SetDisabled() } } + +func setupDumpStacksTrap() { + c := make(chan os.Signal, 1) + signal.Notify(c, syscall.SIGUSR1) + go func() { + for range c { + dumpStacks() + } + }() +} + +func dumpStacks() { + var ( + buf []byte + stackSize int + ) + bufferLen := 16384 + for stackSize == len(buf) { + buf = make([]byte, bufferLen) + stackSize = runtime.Stack(buf, true) + bufferLen *= 2 + } + buf = buf[:stackSize] + glog.V(0).Infof("=== BEGIN goroutine stack dump ===\n%s\n=== END goroutine stack dump ===", buf) +}