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

我们使用 gdb 打印出 dbus->cookie 这个值 , 可以很清楚看到 , 这个值超过了 0xffffffff 。 所以看起来 , 这个问题是 systemd 在加封过大量 message 之后 , cookie 这个值 32 位溢出 , 新的消息不能被加封导致的 。

另外 , 在一个正常的系统上 , 使用 gdb 把 bus->cookie 这个值改到接近 0xffffffff , 然后观察到 , 问题在 cookie 溢出的时候立刻出现 , 则证明了我们的结论 。

5. 怎么判断集群节点 NotReady 是这个问题导致的

首先我们需要在有问题的节点上安装 gdb 和 systemd debuginfo , 然后用命令 gdb / usr/lib / systemd / systemd 1 把 gdb attach 到 systemd , 在函数 sd_bus_send 设置断点 , 之后继续执行 。
等 systemd 踩到断点之后 , 用 p /x bus->cookie 查看对应的 cookie 值 , 如果此值超过了 0xffffffff , 那么 cookie 就溢出了 , 则必然导致节点 NotReady 的问题 。 确认完之后 , 可以使用 quit 来 detach 调试器 。

问题修复

这个问题的修复 , 并没有那么直截了当 。 原因之一是 systemd 使用了同一个 cookie 变量来兼容 dbus1 和 dbus2 。

推荐阅读