Con la arquitectura clásica de drivers se tienen dos problemas cuando se captura tráfico a alta velocidad:
- Gran cantidad de interrupciones producidas por la cantidad de paquetes que está recibiendo en la tarjeta de red.
- Copia de paquetes dentro de las colas del núcleo, y entre el núcleo y los programas de usuario.
Buscando información en Internet, lo primero que llama la atención es la existencia de NAPI. Este API lo que busca es mitigar las tormentas de interrupciones de recepción que se producen cuando se está capturando tráfico a gran velocidad. Hay drivers en el kernel de Linux que en vez de levantar una interrupción por cada paquete recibido, lo hace cuando se han recibido N paquetes.
Por otra parte, la copia de paquetes entre modo usuario y modo núcleo es otro de los problemas que nos encontramos. La mayoría de las aplicaciones de captura de paquetes usa la librería libpcap para capturar las tramas. La versión modificada por Phil Wood del NOC de Los Alamos National Laboratory, intenta implementar este concepto: Se exportan los buffets a través de mmap, evitando la copia entre el núcleo y el usuario. Para ello aprovecha la posibilidad que tiene Linux para utilizar (CONFIG_PACKET_MMAP).
Buscando más información sonbre este tipo de captura, merece la pena leer Improved passive packet capture: Beyond device polling de Luca Deri. El artículo compara de serie Linux y FreeBSD. Linux, de serie, sale bastante mal parado frente a FreeBSD - que implementa la mitigación de interrupciones -.
Luca Deri lo que propone es, no usar ni siquiera la posibilidad de PACKET_MMAP del kernel, sino directamente, usar los propios buffet del kernel que utiliza el dispositivo de red para almacenar los paquetes que recibe a través de DMA la tarjeta. Dichos buffet se implementan en un buffet circular, sobreescribiéndolo conforme se van capturando los paquetes.
No hay comentarios:
Publicar un comentario