读懂这一篇,集群节点不下线( 七 )

拆分之后 , 其包括 docker daemon , containerd , containerd-shim 以及 runC 。 组件 containerd 负责集群节点上容器的生命周期管理 , 并向上为 docker daemon 提供 gRPC 接口 。

在这个问题中 , 既然 PLEG 认为容器运行是出了问题 , 我们需要先从 docker daemon 进程看起 。 我们可以使用 kill -USR1  命令发送 USR1 信号给 docker daemon , 而 docker daemon 收到信号之后 , 会把其所有线程调用栈输出到文件 /var/run/docker 文件夹里 。

Docker daemon 进程的调用栈相对是比较容易分析的 。 稍微留意 , 我们会发现大多数的调用栈都类似下图中的样子 。
通过观察栈上每个函数的名字 , 以及函数所在的文件(模块)名称 , 我们可以看到 , 这个调用栈下半部分 , 是进程接到 http 请求 , 做请求路由的过程;而上半部分则进入实际的处理函数 。 最终处理函数进入等待状态 , 等待的是一个 mutex 实例 。

到这里 , 我们需要稍微看一下 ContainerInspectCurrent 这个函数的实现 , 而最重要的是 , 我们能搞明白这个函数的第一个参数 , 就是 mutex 的指针 。 使用这个指针搜索整个调用栈文件 , 我们会找出 , 所有等在这个 mutex 上边的线程 。

推荐阅读