Linux 内核错误 w/netns 和/或 Xen guest - “unregister_netdevice:等待 lo 变为空闲”

Linux 内核错误 w/netns 和/或 Xen guest - “unregister_netdevice:等待 lo 变为空闲”

我在基于 Xen 的 VM(在 Linode 上)中运行网络爬虫;它大量使用网络命名空间来控制每个爬虫进程的 VPN 使用。过去六个月它一直在持续运行。

调度程序进程会间歇性地(每周一到两次)拆除网络命名空间,然后我遇到了一个内核错误。该错误的明显症状是,在重新启动虚拟机之前无法创建新的网络命名空间,并且系统日志会再次收到大量此消息,直到重新启动虚拟机:

MMM DD hh:mm:ss XXXXX kernel: unregister_netdevice: waiting for lo to become free. Usage count = 1

我已经找到一些与此消息相关的公开错误报告……

https://bugzilla.redhat.com/show_bug.cgi?id=880394
https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1065434
https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1181315

...但它们都适用于比 Linode 库存内核更老的内核,后者已经有一段时间是 3.16.x 了。

我正在寻找具体的、循序渐进的建议,以了解如何解决错误和/或将其转化为可操作的错误报告。请注意,回归分析并不实用,因为它需要几个月才能产生结果(而且我不能承受比现在更频繁地让爬虫程序上下波动)。

答案1

这个错误告诉您,对接口的引用计数 > 0,因此某些东西仍在使用该接口。

该错误是在内核 /net/core/dev.c 中的 netdev_wait_allrefs 函数中产生的。

内核代码中可能存在错误,但正如您所说,这些参考资料都是旧版本,而且没有其他人报告任何错误 —— 对于如此核心的东西,我们预料到了这一点。它不仅为 lo 适配器提供锁定机制,还为 eth、tun 等提供锁定机制。

我会在日志中捕获错误并查看哪个进程使用了​​ lo 接口。

为此,使用 bash 脚本中的 inotify 工具来查看日志,并在发生错误时转储进程列表以及正在使用接口的内容:

#!/bin/sh

LOG="/var/log/netdev.log"

while inotifywait -e modify /var/log/kern; do
  if tail -n1 /var/log/kern | grep unregister_netdevice; then
    echo `date`: error detected... >> $LOG
    ss -nlput >> $LOG
    ps -Af >> $LOG
    # other commands, send an sms?
  fi
done

您可以修改触发时执行的命令来收集不同的信息,我假设这是在 /var/log/kern 日志中(不确定您的口味)。

我怀疑某个进程已挂起,导致界面仍在使用中。

相关内容