14.6 原因

深入分析前一个线程的调用栈,我们可以确定三件事情。第一,Terwayd使用了netlink这个库来管理节点上的虚拟网卡、IP地址及路由等资源,且netlink实现了类似于iproute2的功能;第二,netlink使用socket直接和内核通信;第三,以上线程在recvfrom系统调用上等待。

在这样的情况下,我们需要去查看这个线程的内核调用栈,才能进一步确认这个线程等待的原因。因为从goroutie线程编号不太容易找到线程所对应的系统线程ID,这里我们通过抓取系统的core dump来找出上面线程的内核调用栈。

在内核调用栈中搜索recvfrom,定位到下面这个线程。从下面的调用栈上,我们只能确定此线程在recvfrom函数上等待。

对于这个问题,进一步深入排查是比较困难的,这显然是一个内核问题,或者与内核相关的问题。我们找遍了整个内核core,检查了所有的线程调用栈,看不到其他可能与这个问题相关联的线程。