From 37aa66484c106adbc966a33865ca637ecf8af9a3 Mon Sep 17 00:00:00 2001 From: Lei Jitang Date: Wed, 24 May 2017 13:02:09 -0400 Subject: [PATCH] Add SIGUSR1 to print the stack of containerd Signed-off-by: Lei Jitang --- cmd/containerd/main.go | 16 ++++++++++++++++ cmd/containerd/main_linux.go | 2 ++ cmd/containerd/main_unix.go | 2 ++ 3 files changed, 20 insertions(+) diff --git a/cmd/containerd/main.go b/cmd/containerd/main.go index 0c3907763..3a6e8a14b 100644 --- a/cmd/containerd/main.go +++ b/cmd/containerd/main.go @@ -8,6 +8,7 @@ import ( "os" "os/signal" "path/filepath" + "runtime" "time" "github.com/boltdb/bolt" @@ -436,3 +437,18 @@ func interceptor(ctx gocontext.Context, } return grpc_prometheus.UnaryServerInterceptor(ctx, req, info, handler) } + +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] + logrus.Infof("=== BEGIN goroutine stack dump ===\n%s\n=== END goroutine stack dump ===", buf) +} diff --git a/cmd/containerd/main_linux.go b/cmd/containerd/main_linux.go index 0717e785b..91558dbe8 100644 --- a/cmd/containerd/main_linux.go +++ b/cmd/containerd/main_linux.go @@ -50,6 +50,8 @@ func handleSignals(signals chan os.Signal, server *grpc.Server) error { if err := reaper.Reap(); err != nil { log.G(global).WithError(err).Error("reap containerd processes") } + case unix.SIGUSR1: + dumpStacks() default: server.Stop() return nil diff --git a/cmd/containerd/main_unix.go b/cmd/containerd/main_unix.go index 24ccab7e2..3059244e9 100644 --- a/cmd/containerd/main_unix.go +++ b/cmd/containerd/main_unix.go @@ -39,6 +39,8 @@ func handleSignals(signals chan os.Signal, server *grpc.Server) error { if err := reaper.Reap(); err != nil { log.G(global).WithError(err).Error("reap containerd processes") } + case unix.SIGUSR1: + dumpStacks() default: server.Stop() return nil