Wie kann ich die hohe CPU-Auslastung von DPCs mit seriellen USB-Ports reduzieren?

1841
rossmcm

Ich habe eine App, die mit bis zu 50 Geräten über serielle Anschlüsse kommuniziert. Die Kommunikation findet in Threads statt und die Threads werden gedrosselt, so dass nur eine bestimmte Anzahl gleichzeitig aktiv ist. Die Threads werden nach Bedarf erstellt, erledigen ihre Arbeit und beenden und geben ihre verwendeten Ressourcen frei.

In einigen Fällen sind die seriellen Anschlüsse mit Moxa TCP / IP-Ethernet-Anschlüssen implementiert. Auf dem PC läuft ein Moxa-Treiber, der die Moxa-Geräte im Netzwerk als COM-Port verfügbar macht.

In anderen Fällen werden die seriellen Anschlüsse über USB-Hubs mit jeweils 10 seriellen Anschlüssen implementiert.

Hier ist das Problem. Wenn nur die seriellen Moxa-Ports verwendet werden und (etwa) 8 aktiviert sind, schwankt die CPU-Auslastung der App zwischen 1% und 30%, je nachdem, wie viele Threads aktiv sind. Die App verhält sich sinnvoll und der PC reagiert.

Wenn dann 8 USB-Anschlüsse aktiviert sind, erreicht die CPU-Auslastung der App erwartungsgemäß 50-60%. Die Gesamtauslastung der PC-CPU steigt jedoch auf nahezu 100% und bleibt dort erhalten. Es überrascht nicht, dass alles zum Stillstand kommt.

Ich habe den Prozess-Explorer verwendet und festgestellt, dass der Großteil der CPU-Auslastung außerhalb meiner App zwei Aufgaben umfasste: System Idle Process / DPCs (verzögerte Prozeduraufrufe) und System Idle Process / System. Die Verwendung dieser Aufgaben liegt bei jeweils rund 40%. Wenn nur Moxa-Ports verwendet werden, zeigen diese Aufgaben keine signifikante CPU-Auslastung.

Ich habe versucht, mit der Thread-Priorität zu spielen, und es macht keinen Unterschied. Die Ports arbeiten mit einer relativ niedrigen Baudrate (2400).

Die Ausführung eines DPC-Latenzprüfprogramms führt zu einer Latenzzeit von bis zu 6 ms, wenn die seriellen USB-Anschlüsse verwendet werden.

1
Leider müssen Sie die Treiber für die betreffenden Port-Schnittstellen nicht umschreiben oder lediglich die Last reduzieren. Ich glaube nicht, dass Sie viel tun können. Vielleicht hat jemand mit etwas mehr Wissen etwas schwarze Magie. Shinrai vor 12 Jahren 4
Sehen Sie dies ... http: //www.msfn.org/board/topic/140263-wie-zu-ziel-die-ursache-von-hoch-cpu-usage-by-dpc-interrupt/ Moab vor 12 Jahren 0
Vielen Dank. Ein sehr gründliches Posting. LatencyMon benötigt Win7. Ich kann XPERF.exe anscheinend nicht auf einem Win 7-System installieren (anscheinend kann ich dann die EXE-Datei auf das XP-System kopieren und verwenden). Ich habe das Windows Performance Kit auf meinem Win7-System installiert, XPerf ist jedoch nirgends zu sehen. rossmcm vor 12 Jahren 0

1 Antwort auf die Frage

1
rossmcm

Die hohe CPU-Auslastung rührte von der Tatsache her, dass in der Anwendung jeder Kanal zu Beginn der Sitzung seinen seriellen Port öffnete und für die Dauer der Anwendungssitzung geöffnet hielt. Dies war bei Ports, die auf den Ethernet-zu-COM-Port-Adaptern von Moxa basierten, oder bei "lokalen" Ports in Ordnung, aber bei USB-Ports ist die CPU-Auslastung des DPC-Prozessors bereits ein Problem, wenn der Port offen ist. 16 offene USB-Anschlüsse machen den PC unbrauchbar, obwohl an keinem Anschluss Verkehr herrscht.

Ich habe die App so geändert, dass die Ports geöffnet werden, wann immer sie benötigt werden (dies dauert nur einige Sekunden pro Minute) und sofort geschlossen werden.

Nun, dies fällt unter mein Szenario "Last reduzieren". Schön gemacht. Shinrai vor 12 Jahren 0