Ошибка ядра Linux с netns и / или гостем Xen - "unregister_netdevice: ожидание освобождения lo"
Я запускаю веб-сканер в виртуальной машине на базе Xen (на 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, поэтому что-то все еще использует интерфейс.
Ошибка генерируется в функции netdev_wait_allrefs в /net/core/dev.c в ядре.
В коде ядра может быть ошибка, но, как вы сказали, все эти ссылки были гораздо более старых версий, и никто больше ничего не сообщал - что мы ожидаем от чего-то такого центрального. Он обеспечивает механизм блокировки не только адаптера lo, но и eth, tun и т. Д.
Я бы поймал ошибку в журналах и посмотрел, какой процесс использует интерфейс lo.
Для этого используйте инструменты inotify в bash-скрипте для просмотра журнала, а при возникновении ошибки выведите список процессов и того, что использует интерфейсы:
#!/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 log (не уверен в вашем вкусе).
Я подозреваю, что процесс завис, оставляя интерфейс в использовании.