Linux内核bug / netns和/或Xen guest – “unregister_netdevice:等待lo成为免费”

我在基于Xen的虚拟机(在Linode上)中运行一个Web爬虫; 它大量使用networking名称空间来控制每个爬网过程中VPN的使用。 在过去的六个月中,它一直在持续运行。

间歇地 – 以每周一到两次的速度 – 调度程序将拆除一个networking名称空间,并且我遇到了一个内核错误。 该错误的可见症状是,直到虚拟机重新启动后才能创build新的networking名称空间,并且系统日志再次收到此消息的泛滥,直到虚拟机重新启动:

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

我已经能够find一些有关这个消息的公共bug报告…

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的版本了。

我正在寻找具体的一步一步的build议,如何解决错误和/或把它变成一个可操作的错误报告。 请注意,回归分析是不切实际的,因为需要几个月的时间才能得出结果(而且我已经无法承受爬行器的上升和下降,甚至超过了我自己)。

错误是告诉你,接口的引用计数是> 0,所以仍然使用接口。

内核中的/net/core/dev.c中的netdev_wait_allrefs函数中会生成此错误。

内核的代码中可能存在一个错误,但正如你所说,这些引用都是旧版本,没有其他人报告过任何东西 – 我们期望这样做的核心。 它提供了locking机制,不仅适用于lo适配器,而且还提供eth,tun等。

我会将错误logging在日志中,看看哪个进程使用了​​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日志(不知道你的味道)。

我会怀疑一个进程已经挂起使用接口。