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

所以基本上我们可以判断一个方向:问题可能跟 systemd 有关系 。

Systemd 是硬骨头

Systemd 是相当复杂的一个组件 , 尤其对没有做过相关开发工作的同学来说 , 比如我自己 。 基本上 , 排查 systemd 的问题 , 我用到了四个方法:

  • (调试级别)日志

  • core dump

  • 代码分析

  • 以及 live debugging

其中第一个、第三个和第四个结合起来使用 , 让我在经过几天的鏖战之后 , 找到了问题的原因 。 但是这里我们先从“没用”的 core dump 说起 。

1. 没用的 Core Dump

因为重启 systemd 解决了问题 , 而这个问题本身 , 是 runC 在使用 dbus 和 systemd 通信的时候没有了响应 , 所以我们需要验证的第一件事情 , 就是 systemd 不是有关键线程被锁住了 。

查看 core dump 里所有线程 , 只有以下一个线程并没有被锁住 , 它在等待 dbus 事件 , 以便做出响应 。

推荐阅读