¿Dónde están las posibles ubicaciones de los retrasos de puesta en cola / tampón de multidifusión Linux?

StackOverflow https://stackoverflow.com/questions/2285152

Pregunta

Hacemos un uso intensivo de la mensajería de multidifusión a través de muchos servidores Linux en una red LAN. Estamos viendo un montón de retrasos. Básicamente, enviamos un gran número de pequeños paquetes. Estamos más preocupados con la latencia de rendimiento. Las máquinas son modernas, de núcleos múltiples (al menos cuatro, generalmente ocho, 16 si se cuenta con hyperthreading) máquinas, siempre con una carga de 2,0 o menos, por lo general con una carga inferior a 1,0. El hardware de red también está en capacidad del 50%.

Los retrasos que vemos se parece a la cola retrasos: los paquetes. Empezarán rápidamente creciente en la latencia, hasta que quede como se atascan, luego de vuelta de nuevo a la normalidad

La estructura de mensajería es básicamente el siguiente: en el "hilo de enviar", extraer mensajes de una cola, añadir una marca de tiempo (usando gettimeofday()), a continuación, llamar send(). El programa receptor recibe el mensaje, marcas de tiempo el momento de recibir, y lo empuja en una cola. En un hilo separado, la cola se procesa, el análisis de la diferencia entre el envío y la recepción de las marcas de tiempo. (Tenga en cuenta que nuestras colas internas no son parte del problema, ya que se agregan las marcas de tiempo fuera de nuestra puesta en cola interna.)

No se sabe muy bien por dónde empezar a buscar una respuesta a este problema. No estamos familiarizados con las partes internas de Linux. Nuestra sospecha es que el núcleo está en la cola o amortiguar los paquetes, ya sea en el lado de envío o el lado de recepción (o ambos). Pero no sabemos cómo seguir esto y rastrearlo.

Por lo que vale, estamos utilizando CentOS 4.x (RHEL kernel 2.6.9).

¿Fue útil?

Solución

Los paquetes pueden poner en cola en el envío y recepción de núcleo lado, la tarjeta de red y la infraestructura de red. Usted encontrará una gran cantidad de elementos que se pueden probar y ajustar.

En el NIC generalmente se puede encontrar agrupamiento de interrupciones parámetros -. El tiempo que el NIC esperará antes de notificar el núcleo o el envío al cable mientras se espera para paquetes lotes

Para Linux usted tiene el enviar y recibir "buffers", cuanto más grandes son los más probable es que experimente una mayor latencia como paquetes consiguen manejan en operaciones por lotes.

Para la arquitectura y la versión de Linux que tiene que ser consciente de cómo los cambios de contexto son caros y si hay bloqueos o programación preventiva habilitados. Considere minimizando el número de aplicaciones en ejecución, mediante afinidad proceso para bloquear procesos a núcleos particulares.

No se olvide de tiempo, la versión del núcleo de Linux que está usando tiene bastante terrible exactitud en el reloj gettimeofday() (2-4ms) y es una llamada bastante caro. Considere el uso de alternativas tales como la lectura desde el núcleo TSC o un dispositivo HPET externo.

Diagrama de Intel: alt text http://www.theinquirer.net/IMG/ 142/96142 / latencia-580x358.png? 1272514422

Otros consejos

Esta es una gran pregunta. En CentOS como la mayoría de los sabores de * nix hay una UDP recibir / enviar búfer para cada socket de multidifusión. El tamaño de este buffer es controlado por sysctl.conf puede ver el tamaño de las memorias intermedias llamando / sbin / sysctl -a

Los artículos siguientes muestran mi defecto y UDP máximo reciben el tamaño en bytes. Cuanto mayor sea el número de estos más de tamponamiento y por lo tanto la latencia de la red / kernel puede introducir si su aplicación es demasiado lento en el consumo de los datos. Si usted ha construido de buena tolerancia para la pérdida de datos puede hacer que estos tampones muy pequeño y que no verá la latencia se acumulan y recuperación que se ha descrito anteriormente. La compensación es la pérdida de datos como los desbordamientos de búfer -. Algo que puede ya estar viendo

[~] $ / sbin / sysctl -a | mem net.core.rmem_default = 16777216 net.core.wmem_default = 16777216 net.core.rmem_max = 16777216 net.core.wmem_max = 16777216

En la mayoría de los casos es necesario establecer por defecto = a su máximo a menos que se está controlando esto al crear su zócalo.

la última cosa que puede hacer (dependiendo de la versión del kernel) es ver las estadísticas de UDP del PID para el proceso o por lo menos la caja general.

cat / proc / net / SNMP | grep -i Udp UDP: InDatagrams NoPorts InErrors OutDatagrams UDP: 81658157063 145 616548928 3896986

cat / proc / PID / net / SNMP | grep -i Udp UDP: InDatagrams NoPorts InErrors OutDatagrams UDP: 81658157063 145 616548928 3896986

Si no estaba claro de mi puesto, la latencia se debe a que su aplicación no consume los datos lo suficientemente rápido y forzando el kernel para amortiguar el tráfico en la estructura anterior. La red, kernel, e incluso su tarjeta de red memorias cíclicas puede jugar un papel en la latencia pero todos esos elementos típicamente sólo añadir unas pocas milésimas de segundo.

Déjame saber sus pensamientos y les puedo dar más información sobre dónde buscar en su aplicación para exprimir un poco más de rendimiento.

Si usted decide que necesita para capturar paquetes en el entorno de producción, puede ser digno de mirar en el uso de puertos de monitoreo en sus interruptores y capturar los paquetes que utilizan máquinas no son de producción. Eso también lo permiten capturar los paquetes en múltiples puntos a través de la vía de transmisión y comparar lo que se está viendo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top