Error 'transmit timed out' en VM Linux en Hyper-V

En una migración de una VM CentOS a una granja Hyper-V, la interfaz de red dejó de funcionar. De acuerdo al System Center Virtual Machine Manager (SCVMM), la VM tenía atachada un tarjeta de red legacy. A continuación la información del sistema de la tarjeta de red:

1
2
3
4
5
6
7
8
9
10
[root@svn-qa]# ethtool -i eth0
driver: tulip
version: 1.1.15
firmware-version:
bus-info: 0000:00:0a.0
supports-statistics: no
supports-test: no
supports-eeprom-access: no
supports-register-dump: no
supports-priv-flags: no

Además en los logs, se registrarón multiples errores del tipo transmit timed out, status fc678147, a continuación se puede ver un ejemplo de lo que registró el log:

1
2
3
4
5
6
7
Feb 28 09:23:58 svn-qa kernel: eth0: 21140 transmit timed out, status fc678147, SIA fffffe00 00000068 00000070 fffffec8, resetting...
Feb 28 09:24:06 svn-qa kernel: eth0: 21140 transmit timed out, status fc678147, SIA fffffe00 00000068 00000070 fffffec8, resetting...
Feb 28 09:25:42 svn-qa kernel: eth0: 21140 transmit timed out, status fc670045, SIA fffffe00 00000068 00000070 fffffec8, resetting...
Feb 28 09:25:50 svn-qa kernel: eth0: 21140 transmit timed out, status fc678147, SIA fffffe00 00000068 00000070 fffffec8, resetting...
Feb 28 09:27:32 svn-qa kernel: eth0: 21140 transmit timed out, status fc670045, SIA fffffe00 00000068 00000070 fffffec8, resetting...
Feb 28 09:27:40 svn-qa kernel: eth0: 21140 transmit timed out, status fc678147, SIA fffffe00 00000068 00000070 fffffec8, resetting...
Feb 28 09:27:48 svn-qa kernel: eth0: 21140 transmit timed out, status fc678147, SIA fffffe00 00000068 00000070 fffffec8, resetting...

Solución

La solución fue desactivar el servicio irqbalance el cual se encarga de distribuir las interrupciones de hardware (IRQ) entre todos los procesadores con el objetivo de mejorar el rendimiento.

1
2
chkconfig irqbalance off
reboot

Nota: Es importante que el sistema inicie sin iniciar el demonio irqbalance, es decir, no sirve con solo detener el servicio.

¿Qué es IRQbalance?

irqbalance es un servicio que intenta balancear las peticiones IRQ, de forma inteligente, entre todas las CPUs disponibles al mismo tiempo que intenta asignar el procesamiento de la IRQ al núcleo más cercano donde esta corriendo el proceso que ha solicitado la petición IRQ, pudiendo ser el mismo núcleo, un núcleo en el mismo circuito integrado compartiendo la misma caché, o un núcleo en la misma zona NUMA.

La tecnología NUMA es similar a IRQbalance, tratando de asegurar que procesos corran en la misma zona NUMA, lo cual en sistemas con muchos núcleos puede significar grandes reducciones de latencias lo que supone un aumenta del rendimiento, especialmente bajo grandes cargas de trabajo.

En máquinas virtuales las ventajas que pueden aportar NUMA o IRQbalance no son equivalentes a las que se pueden obtener en un servidor físico, por ello a veces es mejor desactivar los servicios irqbalance o numad de las VM y dejar que sea el hipervisor quien gestione las asignaciones.

Más información:

Contenidos
  1. 1. Solución
    1. 1.1. ¿Qué es IRQbalance?