Quelles sont les causes de mauvaises performances du réseau lors de la lecture audio ou vidéo dans Windows Vista et plus récent?
-
10-10-2019 - |
Question
Le logiciel en question est une application C ++ / MFC natif qui reçoit une grande quantité de données sur UDP et traite ensuite les données pour l'affichage, la sortie sonore et écriture sur le disque entre autres. J'ai d'abord rencontré le problème lors du lancement CHM document d'aide de l'application de son menu d'aide, puis je clique dans le document d'aide lors de la collecte des données du matériel. Pour reproduire ce, un script AutoHotkey a été utilisé pour cliquer rapidement autour dans le document d'aide pendant que l'application était en marche. Dès qu'un son est produite sur le système, j'ai commencé à obtenir des erreurs.
Si j'ai la carte son complètement désactivé, tout processus bien sans erreur, bien que la sortie sonore est évidemment désactivé. Cependant, si j'ai son jeu (dans cette application, une autre application ou même le bip d'une boîte de message) Je milliers de paquets perdus (nous le savons parce que chaque paquet est horodaté). En tant que second test, je n'ai pas utilisé ma demande du tout et juste utilisé Wireshark pour surveiller les paquets entrants à partir du matériel. Effectivement, chaque fois qu'un son joué dans Windows, nous avions laissé tomber des paquets. En fait, son n'a même pas jouer activement à provoquer l'erreur. Si je crée simplement un tampon (en utilisant DirectSound8) et ne jamais commencer à jouer, je reçois toujours ces erreurs.
Cela se produit sur plusieurs ordinateurs avec de multiples combinaisons de cartes réseau (à la fois à fibre optique et RJ45) et les cartes son (à la fois intégrés et des cartes séparées). J'ai aussi essayé différentes versions de pilotes pour chaque carte réseau et son. Tous les tests ont été sur Windows 7 32bit. Depuis mon application utilise DirectSound pour l'audio, j'ai essayé différentes CooperativeLevels (fonctionnement normal est DSSCL_PRIORITY) sans succès.
A ce moment, je suis assez convaincu qu'il n'a rien à voir avec ma demande et je me demandais si quelqu'un avait une idée de ce que pourrait être la cause de ce problème avant de commencer à traiter avec les fournisseurs de matériel et / ou Microsoft.
La solution
Il est connu que Microsoft a construit une fonctionnalité anti-bizarre dans le noyau de Windows Vista qui dégradent les performances d'E / S pour vous assurer préventivement que les applications multimédia (Windows Media Player, directX) obtenir la réponse 100%. Je ne sais pas si cela signifie aussi la perte de paquets UDP. Lisez cette justification boiteux pour la méthode: http: // blogs .technet.com / b / Mark Russinovich / archive / 2007/08/27 / 1833290.aspx
L'un des commentaires, il résume assez bien ce «Il me semble que Microsoft a essayé quelque chose de « réparer » qui n'a pas été brisé »
Autres conseils
Il se trouve que ce comportement est par la conception. Windows Vista et quelque chose plus tard mis en œuvre appelé Multimedia Class Scheduler Service (MMCSS) qui est destiné à faire tous la lecture multimédia aussi lisse que possible. Depuis la lecture multimédia repose sur des interruptions matérielles pour assurer une lecture fluide, les interruptions concurrentes causera des problèmes. L'une des principales sources d'interruption matérielle est le trafic réseau. À cause de cela, Microsoft a décidé d'accélérer le trafic réseau lorsqu'un programme est en cours d'exécution sous MMCSS.
Je suppose que cela a été grand retour face en 2007 lorsque Vista est sorti , mais je manqué. Il y avait un article de Mark Russinovich (merci ypnos ) décrivant MMCSS. Il semble que la bouillie tout mon problème à ceci:
Parce que la trame Ethernet standard la taille est d'environ 1500 octets, une limite de 10.000 paquets par seconde équivaut à une un débit maximal d'environ 15 Mo / s. 100mb réseaux peuvent gérer au plus 12MB / s, donc si votre système est sur un réseau 100Mb, vous ne verrez pas en général tout ralentissement. Toutefois, si vous avez un 1gb infrastructure réseau et à la fois le système d'envoi et votre Vista système de réception possède réseau 1Gb adaptateurs, vous verrez le débit baisse à environ 15%. De plus, il y a une bug malheureux dans l'étranglement NDIS code qui magnifie étranglant si vous ont plusieurs cartes réseau. Si tu as un système à la fois sans fil et filaire adaptateurs, par exemple, la volonté NDIS processus au plus 8000 paquets par d'autre part, et avec trois adaptateurs il traitera un maximum de 6000 paquets par seconde. 6000 paquets par seconde est égal à 9 Mo / s, une limite qui est visible même sur les réseaux 100Mb.
Je n'ai pas vérifié que le multiple bug de l'adaptateur existe encore dans Windows 7 ou Vista SP1, mais il est quelque chose à chercher si vous rencontriez des problèmes.
D'après les commentaires sur le poste de Russinovich, je trouve que Vista SP1 introduit certains paramètres de Registre qui permettait de régler la MMCSS affecte Windows. Plus précisément, le NetworkThrottlingIndex touche.
La solution à mon problème était de régulation du réseau désactiver complètement en définissant la clé de HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Multimedia\SystemProfile\NetworkThrottlingIndex
à 0xFFFFFFFF
puis redémarrant. Cela désactive complètement la partie d'étranglement réseau de MMCSS. J'avais essayé simplement faire monter la valeur à 70
, mais il n'a pas arrêté jusqu'à ce que je provoque des erreurs complètement désactivé.
Jusqu'à présent je n'ai pas vu des effets négatifs sur d'autres applications multimédias (ni la capture vidéo et des portions de sortie audio de ma propre application) de ce changement. Je rendrai compte ici si ces modifications.