Hace poco mi servidor doméstico y host de máquinas virtuales empezó a perder la conectividad de red de forma aleatoria. Desde fuera parecía que seguía funcionando, pero no podía acceder a él de ninguna forma remota. Según el switch, el adaptador ethernet parecía estar encendido, así que el problema debía estar en algún lugar del software.

No sería la primera vez que un driver es el culpable de que se cuelgue una conexión de red. En el pasado me han fastidiado unos drivers de WiFi con errores, tanto en equipos con Linux como con Windows.

Después de escarbar un poco en los registros del sistema, me topé con lo siguiente:

vmhost kernel: e1000e 0000:00:1f.6 eth0: Detected Hardware Unit Hang:
vmhost kernel: TDH <0>
vmhost kernel: TDT <1>
vmhost kernel: next_to_use <1>
vmhost kernel: next_to_clean <0>
vmhost kernel: buffer_info[next_to_clean]:
vmhost kernel: time_stamp <10fbc2f81>
vmhost kernel: next_to_watch <0>
vmhost kernel: jiffies <10fbc3871>
vmhost kernel: next_to_watch.status <0>
vmhost kernel: MAC Status <40080083>
vmhost kernel: PHY Status <796d>
vmhost kernel: PHY 1000BASE-T Status <7800>
vmhost kernel: PHY Extended Status <3000>
vmhost kernel: PCI Status <10>
vmhost kernel: e1000e 0000:00:1f.6 eth0: Reset adapter unexpectedly
vmhost kernel: vmbr0: port 1(eth0) entered disabled state

Luego reiniciaba el adaptador de red y, al rato, volvía a hacerlo, hasta que la máquina se quedaba completamente sin conexión.

Buscando respuestas en línea, encontré este hilo de ServerFault.

Causa

Leyendo distintas fuentes y listas de reportes de errores, parece que la mejor manera de reproducir el problema es someter al dispositivo a un alto consumo de ancho de banda, por ejemplo transmitiendo grandes cantidades de datos que saturen la interfaz.

En mi caso solía ocurrir cuando transmito contenido multimedia desde el servidor Plex local a algún dispositivo. Por la forma en que está configurada la red, la máquina virtual con Windows que ejecuta Plex tiene que obtener el archivo multimedia de un recurso compartido NFS en otro dispositivo, transcodificarlo en la VM y luego enviarlo al dispositivo de reproducción.

Todo esto suma mucho tráfico de red, normalmente entre 40 y 100 Mbit/s, dependiendo del dispositivo que reproduce el archivo y de la calidad del archivo original.

El mismo problema se manifestó al transmitir juegos con Steam Link a nuestro Apple TV. La conexión es por cable, pero no es raro que la red se caiga. Creo que está relacionado con el mismo problema, pero estaré pendiente para ver si vuelve a ocurrir después de la solución.

Posible solución

Parece que una posible solución es desactivar GSO (Generic Segmentation Offload), TSO (TCP Segmentation Offload) y GRO (Generic Receive Offload) en la interfaz de red*:

ethtool -K eth0 gso off gro off tso off

Ya lo apliqué en mi configuración y estoy esperando para ver si de verdad resuelve el problema a largo plazo.

Notas al pie

* Estas opciones sirven para delegar la segmentación de paquetes al controlador de la interfaz de red y así reducir el uso de CPU de la máquina. Pueden encontrar más detalles en este artículo de Wikipedia.