¿Qué causa el mal rendimiento de la red durante la reproducción de audio o vídeo en Windows Vista y versiones posteriores?

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

Pregunta

El software en cuestión es un nativo de C ++ aplicación / MFC que recibe una gran cantidad de datos a través de UDP y luego procesa los datos para su visualización, salida de sonido, y escribir en el disco, entre otras cosas. Mi primer encuentro con el problema cuando documento de ayuda CHM de la aplicación se puso en marcha desde su menú de ayuda y luego hice clic en todo el documento de ayuda mientras que la recolección de datos desde el hardware. Para replicar esto, un script de AutoHotkey se utilizó para hacer clic rápidamente alrededor en el documento de ayuda mientras la aplicación estaba en marcha. Tan pronto como se produjo ningún sonido en el sistema, empecé a recibir errores.

Si tengo la tarjeta de sonido completamente desactivado, todo procesa bien y sin errores, a pesar de la salida de sonido es obviamente discapacitados. Sin embargo, si tengo juego de sonido (en esta aplicación, una aplicación diferente o incluso sólo el pitido de un cuadro de mensaje) me obtener miles de paquetes perdidos (lo sabemos porque cada paquete está marcado con la fecha). Como una segunda prueba, yo no uso mi solicitud en absoluto y sólo utiliza Wireshark para vigilar los paquetes entrantes desde el hardware. Efectivamente, cada vez que un sonido que se reproduce en Windows, que había dejado caer los paquetes. De hecho, el sonido no tiene ni siquiera que ser jugar en forma activa para provocar el error. Si basta con crear una memoria intermedia (utilizando DirectSound8) y nunca empezar a jugar, sigo teniendo estos errores.

Esto ocurre en varios ordenadores con múltiples combinaciones de tarjetas de red (tanto de fibra óptica y RJ45) y tarjetas de sonido (tanto tarjetas separadas integrado y). También he probado diferentes versiones del controlador para cada tarjeta NIC y sonido. Todas las pruebas han sido en Windows 7 de 32 bits. Desde mis usos de aplicación Directsound para el audio, lo he intentado diferentes CooperativeLevels (funcionamiento normal es DSSCL_PRIORITY) sin éxito.

En este punto, estoy bastante convencido de que no tiene nada que ver con mi solicitud y se preguntaba si alguien tenía alguna idea de lo que podría ser la causa de este problema antes de empezar a tratar con los proveedores de hardware y / o Microsoft.

¿Fue útil?

Solución

Se sabe que Microsoft construyó algunos anti-rasgo raro en el núcleo de Windows Vista que se degradará el rendimiento de E / S de manera preventiva para asegurarse de que (Windows Media Player, DirectX) aplicaciones multimedia obtener el 100% de respuesta. No sé si eso también significa la pérdida de paquetes UDP. Lea este débil justificación para el método: http: // blogs .technet.com / b / markrussinovich / archivo / 2007/08/27 / 1833290.aspx

Uno de los comentarios que hay resume esto muy bien: "Me parece que Microsoft trató de algo 'arreglo' que no se ha roto"

Otros consejos

Resulta que este comportamiento es por diseño. Windows Vista y puesto en práctica más adelante algo llamado el href="http://msdn.microsoft.com/en-us/library/ms684247(v=vs.85).aspx" rel="nofollow noreferrer"> Programador de aplicaciones multimedia que está destinada a hacer que todas reproducción multimedia lo más suave posible. Dado que la reproducción multimedia se basa en las interrupciones de hardware para garantizar una reproducción suave, cualquier interrupción en competencia causarán problemas. Una de las principales fuentes de interrupción de hardware es el tráfico de red. Debido a esto, Microsoft decidió estrangular el tráfico de red cuando un programa se ejecuta en MMCSS.

Creo que esto fue un trasero grande de acuerdo en 2007 cuando Vista salió , pero no me di cuenta. Había un artículo de Mark Russinovich (gracias ypnos ) describir MMCSS . Parece que la totalidad de mi problema se reducía a esto:

Debido a que la trama Ethernet estándar tamaño es de aproximadamente 1500 bytes, un límite de 10.000 paquetes por segundo es igual a una rendimiento máximo de aproximadamente 15 MB / s. 100mb redes pueden manejar como máximo 12 Mb / s, por lo que si el sistema se encuentra en una red de 100 Mb, por lo general no verá ningún tipo de ralentización. Sin embargo, si tiene una 1gb infraestructura de red y ambos el sistema de envío y su Vista sistema receptor tiene la red de 1 Gb adaptadores, verá el rendimiento gota a aproximadamente el 15%. Además, hay una lamentable error en el estrangulamiento NDIS código que magnifica estrangulación si tener varias tarjetas de red. Si tienes un sistema con inalámbrica y por cable adaptadores, por ejemplo, la voluntad NDIS proceso en la mayoría de 8000 paquetes por segundo, y con tres adaptadores que procesará un máximo de 6000 paquetes por segundo. 6000 paquetes por segundo es igual a 9 MB / s, un límite que es visible incluso en redes de 100 Mb.

Aún no ha comprobado que el error adaptador múltiple todavía existe en Windows 7 o Vista SP1, pero es algo que buscar si está ejecutando en problemas.

A partir de los comentarios en el post de Russinovich, encontré que Vista SP1 introdujo algunos ajustes del registro que permitieron una para ajustar la forma MMCSS afecta a Windows. Específicamente la NetworkThrottlingIndex clave .

La solución a mi problema era que deshabilitar completamente limitación de red estableciendo la clave HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Multimedia\SystemProfile\NetworkThrottlingIndex a 0xFFFFFFFF y luego reiniciar. Esto desactiva completamente la red porción de MMCSS estrangulamiento. Había intentado simplemente cambiando el valor a 70, pero no dejar de causar errores hasta que se desactiva por completo.

Hasta ahora no he visto ningún efecto adverso en otras aplicaciones multimedia (ni la captura de vídeo y porciones salida de audio de mi propia aplicación) de este cambio. Voy a informar de nuevo aquí si eso cambia.

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