Was bewirkt eine schlechte Netzwerkleistung, wenn Audio- oder Video in Windows Vista spielen und neueren?

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

Frage

Die fragliche Software ist eine native C ++ / MFC-Anwendung, die eine große Menge an Daten über UDP empfängt und verarbeitet dann die Daten für die Anzeige, Tonausgabe und unter anderem auf der Festplatte zu schreiben. Ich traf zuerst das Problem, wenn die CHM-Hilfedokument der Anwendung von seinem Hilfe-Menü gestartet wurde und dann klickte ich das Hilfe-Dokument um, während der Daten von der Hardware zu sammeln. Um dies zu replizieren, wurde ein AutoHotkey Skript verwendet, um schnell in dem Hilfe-Dokument klicken um, während die Anwendung ausgeführt wurde. Sobald ein Ton auf dem System aufgetreten ist, begann ich Fehler zu bekommen.

Wenn ich die Soundkarte vollständig deaktiviert haben, verarbeitet alles in Ordnung ohne Fehler, wenn die Tonausgabe offensichtlich deaktiviert ist. wenn ich Soundwiedergabe jedoch haben (in dieser Anwendung eine andere Anwendung oder auch nur den Ton von einem Meldungsfeld) Ich Tausende von verworfenen Pakete bekommen (wir wissen das, weil jedes Paket timestamped). Als ein zweiter Test, ich habe meine Bewerbung nicht benutzen und nur Wireshark eingehende Pakete von der Hardware zu überwachen. Sicher genug, wann immer ein Ton in Windows gespielt, hatten wir Pakete verworfen. In der Tat, Ton muss aktiv nicht einmal sein zu spielen, den Fehler zu verursachen. Wenn ich einfach einen Puffer (mit DirectSound8) erstellen und nie anfangen zu spielen, habe ich noch diese Fehler erhalten.

Dies geschieht auf mehrere PCs mit mehreren Kombinationen von Netzwerkkarten (sowohl Glasfaser- und RJ45) und Soundkarten (beide integrierten und getrennte Karten). Ich habe auch verschiedene Treiberversionen für jeden NIC und Soundkarte versucht. Alle Tests wurden unter Windows 7 32bit gewesen. Da meine Anwendung verwendet für Audio-Directsound, habe ich verschiedene CooperativeLevels versucht (Normalbetrieb ist DSSCL_PRIORITY) ohne Erfolg.

An diesem Punkt bin ich davon überzeugt, ziemlich es nichts mit meiner Anwendung zu tun hat, und frag mich, ob jemand eine Ahnung hatte, was dieses Problem verursacht werden könnte, bevor ich mit den Hardware-Anbietern gestartet Umgang und / oder Microsoft.

War es hilfreich?

Lösung

Es ist bekannt, dass Microsoft einige seltsame anti-Feature in den Windows Vista-Kernel integriert, die I / O-Leistung verschlechtern wird präventiv dafür zu sorgen, dass Multimedia-Anwendungen (Windows Media Player, directX) 100% Ansprechempfindlichkeit erhalten. Ich weiß nicht, ob das auch Paketverlust mit UDP bedeutet. Lesen Sie diese lahme Rechtfertigung für die Methode: http: // blogs .technet.com / b / Mark Russinovich / Archiv / 2007/08/27 / 1833290.aspx

Einer der Kommentare gibt einen Überblick über diese recht gut: „Scheint mir Microsoft versucht,‚fix‘etwas, das nicht gebrochen wurde“

Andere Tipps

Es stellt sich heraus, dass dieses Verhalten von Entwurf ist. Windows Vista und später implementiert etwas namens Multimedia Class Scheduler Service (MMCSS) , die dazu bestimmt ist, alle Multimedia zu machen Wiedergabe zurück so weit wie möglich glätten. Da Multimedia-Wiedergabe auf Hardware-Interrupts setzt eine reibungslose Wiedergabe zu gewährleisten, werden alle konkurrierenden Unterbrechungen zu Problemen führen. Einer der wichtigsten Hardware-Interrupt-Quellen ist Netzwerkverkehr. Aus diesem Grund entschied sich Microsoft den Netzwerkverkehr zu drosseln, wenn ein Programm unter MMCSS läuft.

Ich denke, das war ein große Sache zurück 2007 wenn kam Vista , aber ich es verpasst. Es gab einen Artikel von Mark Russinovich (Danke ypnos ) beschreibt MMCSS . Es scheint, dass das mein ganzes Problem zu dieser kochte:

Da der Standard-Ethernet-Frame Größe etwa 1500 Bytes, eine Grenze von 10.000 Pakete pro Sekunde entspricht einer maximaler Durchsatz von etwa 15 MB / s. 100Mb-Netzwerke können höchstens Griff 12MB / s, also, wenn Ihr System auf einem 100Mb Netzwerk, Sie werden in der Regel nicht sehen jede Verlangsamung. Allerdings, wenn Sie haben eine 1Gb Netzwerk-Infrastruktur und beide das Sendesystem und Ihre Vista Empfangssystem 1 Gb Netzwerk Adapter, werden Sie Durchsatz Drop sehen auf rund 15%. Des Weiteren gibt es eine unglückliche Fehler in der NDIS Drosselung Code, vergrößert, wenn Sie Drosselung haben mehrere NICs. Wenn Sie eine System mit sowohl drahtlose als auch drahtgebundene Adapter zum Beispiel NDIS Wille Prozess höchstens 8000 Pakete pro Sekunde und mit drei Adaptern ein Maximum von 6000 Paketen verarbeiten pro Sekunde. 6000 Pakete pro Sekunde gleich 9 MB / s, eine Grenze, die sichtbar ist sogar auf 100Mb-Netzwerken.

Ich habe nicht nachgewiesen, dass die Mehrzahl von Adapter Fehler vorhanden ist immer noch in Windows 7 oder Vista SP1, aber es ist etwas zu suchen, wenn Sie Probleme ausgeführt werden.

Aus den Kommentaren auf Russinovich Post, fand ich, dass Vista SP1 einige Registrierungseinstellungen eingeführt, die man erlaubt verschiedene Einstellungen, wie MMCSS Windows-auswirkt. Insbesondere die NetworkThrottlingIndex Schlüssel .

Die Lösung für mein Problem war, vollständig zu deaktivieren Netzwerk Drosselung durch den HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Multimedia\SystemProfile\NetworkThrottlingIndex Schlüssel zum 0xFFFFFFFF Einstellung und dann neu zu starten. Dies deaktiviert vollständig den Netzabschnitt MMCSS Drosselung. Ich hatte einfach versucht, den Wert zu 70 Upping, aber es hörte nicht auf Fehler verursacht, bis ich es vollständig deaktiviert.

Bisher habe ich keine negativen Auswirkungen auf andere Multimedia-Anwendungen (noch die Video-Capture-und Audio-Ausgang Teile meiner eigenen Anwendung) gesehen von dieser Änderung. Ich werde hier berichten, wenn die neuen Einstellungen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top