2009-11-04 18 views
10

Al probar un servidor de multidifusión UDP que escribí en Windows 7 Ultimate x64, me encontré con una cosa muy curiosa. Reproducción de música con foobar2000 en el fondo significativamente mejorado tasa de transmisión del servidor aún también incurrió en la pérdida de paquetes menores. Al apagar la música, inmediatamente disminuyó la velocidad de transmisión a niveles inferiores a los aceptables, pero también produjo 0 pérdida de paquetes. (Tengo una aplicación cliente que habla con el servidor e informa sobre paquetes no reconocidos)Mejores prácticas de aplicaciones de red de alto rendimiento

Conozco el comportamiento de aceleración de Vista (y superior) para hacer que los medios y las aplicaciones de red jueguen bien, pero ciertamente no esperaba que la música mejoraría el rendimiento de la red, ni que apagarla degradara el rendimiento de la red de manera significativa.

¿Qué puedo hacer al respecto desde el punto de vista de código en mi aplicación de servidor para que funcione consistentemente tanto si reproduce música o no en Vista y más? Ciertamente me gustaría evitar tener que informar a todos mis clientes sobre cómo modificar su registro para obtener velocidades de transmisión aceptables, y también me gustaría evitar que simplemente "toquen música" para obtener velocidades de transmisión aceptables. La aplicación debería "funcionar" en mi opinión.

Estoy pensando que la solución implica algo similar a las prioridades del proceso, MMCSS, o posiblemente alguna otra llamada oscura de Windows API para que haga The Right Thing (TM) aquí.

Además, lo siento, pero la creación de un caso de prueba reproducible es una cantidad de trabajo no trivial. El comportamiento de aceleración se produce solo cuando el controlador de la NIC física está trabajando activamente y no se puede reproducir utilizando la interfaz de bucle invertido. Uno necesitaría una implementación de cliente, una implementación de servidor y hardware físico de red para probar.

+0

cuando dice 'está reproduciendo música', ¿quiere decir que está reproduciendo música de su HD y usando la tarjeta de sonido? ¿O se está transmitiendo a través de la misma tarjeta de red? – Toad

+0

@reinier: Sí, foobar2000 está cargando lentamente datos de HD y transmitiendo audio a la interfaz de audio externa a través de USB 2.0. –

Respuesta

3

Lo que observa es el efecto secundario de su reproductor de medios que configura la resolución del reloj de su máquina en 1 ms.

Esto ocurre sólo durante el juego

El efecto secundario es - su aplicación tiene timeslices más pequeños y esto imporves su aplicación, ya que probablemente tenía gran cantidad de CPU robado de su aplicación y con fracciones de tiempo más largos - por más tiempo hora.

Para probarlo, simplemente puede establecer la resolución del temporizador dentro de su aplicación a 1ms y comparar el rendimiento sin reproducir los medios.

Debería ser igual que si no hubiera configuración de clocres, pero con la reproducción de medios.

0

Foobar tiene muchos complementos escritos por diferentes personas. Estas pueden ser la causa de su problema. Te propongo que te acerques a la verdadera razón. Intente desactivar los complementos uno por uno realizando su prueba cada vez que se desactive un complemento.

Espero que la idea te ayude.

+0

Dudo mucho que el problema sea específico de foobar2000. Probaré con otros reproductores multimedia para diagnosticar el problema más a fondo. Puede * tener algo que ver con la interfaz de audio USB 2.0 que uso. Voy a ejecutar algunas pruebas con la tarjeta de sonido integrada también. –

0

Esto suena como un rendimiento de gestión de TSP/IP basado en su algoritmo primitivo. El libro blanco aquí debería dar más antecedentes. http://www.asperasoft.com/?gclid=CICSzMqD8Z0CFShGagod_ltSMQ Su producto es un protocolo UDP que funciona muy bien.

+0

Debo mencionar que uso protocolos TCP y UDP dentro de la misma aplicación. TCP es solo para información de control y coordinación de todos los clientes; no debería ser el cuello de botella aquí. Utilizo UDP puramente para transferencia de datos y mantengo los paquetes por debajo de 1500 bytes. Estaba usando todo el UDP, pero me encontré con serios problemas de sincronización y estaba a punto de reinventar la rueda TCP, así que le dije por qué no solo usaba TCP. –

+0

TCP/IP es el primer lugar en el que buscaría su problema. –

+0

@Mike: ¿Cree que la pérdida de paquetes UDP en el lado del servidor está relacionada de alguna manera con la comunicación TCP en curso? TCP solo se utiliza para notificar a todos los clientes que el próximo lote de datos está a punto de ser enviado a través de UDP. También hay un mensaje de 'sector completo' que se envía después de un breve retraso desde el servidor. Mientras se realiza una transferencia por lotes UDP, la aplicación no envía mensajes TCP, excepto el flujo de tráfico TCP normal que hace el sistema operativo para mantener establecida la conexión. –

2

Han pasado muchos años desde que escribí el código relacionado con el protocolo de red, pero ofreceré una suposición.

Sospecho que esto es un problema de throughput and latency. Reproducir música es introducir la contención de E/S y agregar latencia al transmitir los paquetes. Sin embargo, es probable que la latencia agregada haga que los paquetes hagan cola y, por lo tanto, se multipliquen aumentando throughput.

Para solucionar esto en su código, puede intentar enviar los paquetes en lotes usted mismo. Estoy asumiendo que está enviando cada paquete al sistema para su transmisión a medida que los datos estén listos. Agrupe varios paquetes y envíelos al sistema al mismo tiempo. Incluso un solo grupo de dos o tres paquetes podría marcar una gran diferencia, especialmente si usted es introducing your own small delay entre cada llamada al sistema.

No pude encontrar ningún enlace directamente relevante de una búsqueda rápida en Google. Sin embargo, puede ver el concepto en this discussion of network tuning for Linux o en this FAQ que describe técnicas como el procesamiento por lotes para mejorar el rendimiento.

+0

Ya estoy agrupando paquetes en grupos de 1.024. Los paquetes tienen aproximadamente 1400 bytes cada uno. Recibo alrededor de 50-60 paquetes con reconocimiento negativo por parte del cliente de los 1.024. Cuando apago el reproductor multimedia en la máquina del servidor, el conteo NAK cae inmediatamente a 0 y se logra un mejor rendimiento. Esto parece indicar que el servidor es responsable de la pérdida de paquetes. Me pregunto qué puedo hacer desde el lado del servidor, en todo caso, para acomodarme automáticamente a esta contención de E/S. –

+0

Su comentario parece indicar lo contrario de su pregunta. ¿Estás realmente tratando de enviar 1024 paquetes cada 50-100 μs? Eso es un rendimiento loco. ¿Y el problema es realmente el rendimiento o la pérdida de datos? –

+0

Oh no no. El retraso de 50-100 microsegundos es el retraso entre el envío de paquetes individuales dentro del sector de paquetes 1024. Además, no creo haber mencionado mi retraso de 50-100 microsegundos en esta pregunta. ¿Estás haciendo referencias cruzadas a mis preguntas sobre SO? :) –

Cuestiones relacionadas