Búsqueda de rutas en Linux: cómo ha cambiado su rendimiento de 4.14 a 7.3

Representación de la búsqueda de rutas IPv4 e IPv6 en el kernel Linux

Vincent Bernat, ingeniero de redes y autor de varios análisis de referencia sobre el subsistema de enrutamiento de Linux, ha publicado el 09/11/2026 una nueva medición de cómo ha evolucionado el rendimiento de la búsqueda de rutas IPv4 e IPv6 en el kernel, desde la versión 4.14 hasta la 7.3. Su conclusión: IPv6 mejoró y ahora está estable, IPv4 se ha ido degradando poco a poco, y lo que más ha costado no es el código de enrutamiento sino las mitigaciones de vulnerabilidades de CPU.

Las claves de la búsqueda de rutas en Linux en 20 segundos

  • IPv6 ganó rendimiento entre 4.15 y 5.9 y ahora se mantiene estable.
  • La mitigación SRSO, desde 6.5, borró esas ganancias en CPU AMD.
  • IPv4 perdió unos 5 ciclos por búsqueda en 5.11.
  • Un parche del propio Bernat lo corrige y llegará con Linux 7.5.

La serie viene de lejos. En 2017 Bernat explicó cómo implementa Linux sus tablas de rutas (un LC-trie para IPv4 y un árbol radix para IPv6) y en 2018 midió su evolución hasta los kernels 4.16 y 4.18, incluidas las mitigaciones de Meltdown y Spectre. La nueva entrega retoma el ejercicio ocho años después e identifica los commits responsables de las regresiones.

Cómo se ha medido

Las pruebas se hicieron en un AMD EPYC 8024P (Zen 4c) alquilado a Scaleway, fijado a 2,4 GHz con el turbo desactivado para obtener resultados estables. Todos los kernels se compilaron con GCC 10.2, que es capaz de construir tanto los antiguos como los actuales. En las versiones que recibieron la mitigación SRSO por retroportación (5.10, 5.15, 6.1 y 6.4) se desactivó con spec_rstack_overflow=off para poder compararlas. Los resultados se expresan en ciclos de CPU, a unos 0,42 ns por ciclo.

Para IPv6 usó cuatro escenarios: una tabla completa actual de unos 260.000 prefijos, la de 2017 con unos 40.000, 40.000 prefijos /48 y 40.000 /128 aleatorios. Para IPv4, una tabla completa actual de más de un millón de prefijos, un subconjunto de 2017 de 500.000 y 500.000 rutas /32 contiguas.

IPv6 mejoró; IPv4, un poco peor

En IPv6 hubo tres saltos de mejora: en 4.15, Wei Wang sustituyó un cerrojo de lectura y escritura por RCU y un spinlock; en 4.18, David Ahern separó las estructuras de la FIB que usa la ruta de búsqueda de las de gestión; y en 5.9, Brian Vazquez eliminó llamadas indirectas costosas de fib6_rule_lookup.

IPv4, en cambio, ha empeorado ligeramente con los años. Bernat identificó una regresión propia: el commit c0c5a60f0f13, de la versión 5.11, arregló el comportamiento de ignore_routes_with_linkdown pero añadió unos 5 ciclos por búsqueda, porque ip_ignore_linkdown() sigue tres punteros y se llamaba antes de comprobar el indicador de enlace caído, que es más barato. Su parche 5fe3653f13b9, ya en net-next, reordena las condiciones: la mediana baja de 132 a 126 ciclos y el percentil 95, de 134 a 128. Según el autor, Linux 7.5 será la primera versión estable que lo incluya.

El coste real: las mitigaciones de CPU

La mayor caída llega con Linux 6.5 y la mitigación SRSO (Speculative Return Stack Overflow) para procesadores AMD, que añade unos 20 ciclos a cada retorno de función. Como una búsqueda IPv6 recorre unas 25 llamadas, el impacto es de unos 200 ns y anula las mejoras acumuladas. IPv4, con unas 4 llamadas, pierde unos 30 ns.

Para quien necesite rendimiento de enrutamiento, Bernat propone varias vías: usar CPU más recientes, como AMD Zen 5, Xeon de cuarta generación o ARM Neoverse V2; desactivar todas las mitigaciones (mitigations=off), solo SRSO (spec_rstack_overflow=off) o proteger solo algunos vectores con mitigations=auto,no_user_kernel, disponible desde 6.17; saltarse la ruta del kernel con XDP/eBPF, con la advertencia de que bpf_fib_lookup() usa la misma búsqueda del kernel y no evita el coste; o descargar el enrutamiento en la tarjeta de red. En un Xeon W-2295 de 2020, las mitigaciones apenas cuestan unos ciclos en IPv4 y menos de un 3 % en IPv6.

Desactivar mitigaciones es una decisión de seguridad, no solo de rendimiento: en un router dedicado sin cargas de terceros puede tener sentido, pero en un servidor compartido o un hipervisor reabre los riesgos que esas mitigaciones cierran.

Preguntas frecuentes

¿Qué estructura usa Linux para buscar rutas?

Un LC-trie para IPv4 y un árbol radix para IPv6.

¿Por qué empeoró el rendimiento en Linux 6.5?

Por la mitigación SRSO para CPU AMD, que añade unos 20 ciclos a cada retorno de función. Afecta más a IPv6 porque su búsqueda encadena unas 25 llamadas.

¿Sirve XDP para evitar ese coste?

Solo si no se usa bpf_fib_lookup(), que llama a la misma búsqueda del kernel y por tanto paga el mismo coste.

Fuentes:

Suscríbete al boletín SysAdmin

Este es tu recurso para las últimas noticias y consejos sobre administración de sistemas, Linux, Windows, cloud computing, seguridad de la nube, etc. Lo enviamos 2 días a la semana. Recuerda revisar tu email para confirmar la suscripción.

Scroll al inicio
×