Ошибка ядра 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 (не уверен в вашем вкусе).

Я подозреваю, что процесс завис, оставляя интерфейс в использовании.

Другие вопросы по тегам