Erro no kernel do Linux com netns e / ou convidado do Xen - “unregister_netdevice: esperando que ele se torne livre”

2

Estou executando um rastreador da Web em uma VM baseada em Xen (no Linode); ele faz uso intenso de namespaces de rede para controlar o uso de VPNs por processo por rastreamento. Ele tem funcionado quase continuamente nos últimos seis meses.

Intermitentemente - a uma taxa de uma ou duas vezes por semana - o processo do despachante vai destruir um namespace da rede, e eu acerto um bug do kernel. Os sintomas visíveis do erro são que se torna impossível criar novos namespaces de rede até que a VM seja reinicializada, e o syslog receba inundações dessa mensagem, até que a VM seja reinicializada:

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

Consegui encontrar alguns relatórios de bugs públicos relacionados a esta mensagem ...

link
link
link

... mas todos eles se aplicam a kernels muito mais antigos que o Linode, que é o 3.16.x já há algum tempo.

Estou à procura de conselhos concretos e passo-a-passo sobre como resolver o problema e / ou Transforme isso em um relatório de bug acionável. Observe que uma análise de regressão não é prática, já que levaria meses para produzir um resultado (e eu não posso me dar ao luxo de levar o rastreador para cima e para baixo ainda mais do que já sou).

    
por zwol 09.12.2014 / 21:50

1 resposta

1

O erro indica que a contagem de referência para a interface é > 0, então algo ainda está usando a interface.

O erro é gerado na função netdev_wait_allrefs em /net/core/dev.c no kernel.

Poderia haver um bug no código do kernel, mas como você disse, essas referências eram todas versões muito mais antigas e ninguém mais relatou nada - o que poderíamos esperar de algo tão central. Ele fornece o mecanismo de bloqueio para não apenas o adaptador lo, mas eth, tun, etc.

Eu interceptaria o erro nos logs e veria qual processo tem uso da interface do lo.

Para fazer isso, use as ferramentas inotify em um script bash para observar o log e, quando o erro ocorrer, despejar uma lista de processos e o que está usando as interfaces:

#!/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

Você pode modificar os comandos executados quando isso é acionado para coletar informações diferentes, e eu suponho que isso esteja no / var / log / kern log (não tenho certeza do seu sabor).

Suspeito que um processo tenha permanecido deixando a interface em uso.

    
por 29.04.2015 / 01:03