Frage

HILFE BITTE! Ich habe eine Anwendung, die so nahe an Echtzeit-Verarbeitung wie möglich benötigt, und ich halte mit TCP und UDP in dieses ungewöhnliche Verzögerung Problem ausgeführt wird. Die Verzögerung tritt auf wie ein Uhrwerk, und es ist immer die gleiche Zeitdauer (meist 15 bis 16 ms). Es tritt auf, wenn zu jeder Maschine (eve lokal) und in jedem Netzwerk zu übertragen (wir haben zwei).

Ein schnelle heruntergekommen des Problems:

Ich verwende immer winsock in C ++, in VS 2008 Pro zusammengestellt, aber ich habe mehrere Programme geschrieben senden und auf verschiedene Weise erhalten TCP und UDP verwenden. Ich benutze immer ein Zwischenprogramm geschrieben in verschiedenen Sprachen (MATLAB, C #, C ++) (lokal oder remote ausgeführt wird), um die Informationen von einem Programm zum anderen zu übermitteln. Beide Winsock-Programme laufen auf der gleichen Maschine, so dass sie die Zeitstempel für Tx und Rx aus dem gleichen Takt anzuzeigen. Ich halte ein Muster zu sehen, entstehen, wo ein Bündel von Paketen wird übertragen und dann gibt es eine Verzögerung von etwa 15 bis 16 Millisekunden vor der nächsten Burst trotz keine Verzögerung bei programmiert wird. Manchmal kann es zwischen jedem Paket 15 bis 16 ms statt ein Bündel von Paketen. Andere Zeiten (selten) Ich werde eine unterschiedliche Länge Verzögerung, wie ~ 47 ms. Ich scheine immer die Pakete innerhalb einer Millisekunde von ihnen zurückerhalten, obwohl mit dem gleichen Muster der Verzögerung übertragen wird zwischen den übertragenen Bursts ausgestellt.

Ich habe den Verdacht, dass Winsock oder die NIC ist Puffern von Paketen vor jedem übertragen, aber ich habe keine Beweise gefunden. Ich habe eine Gigabit-Verbindung zu einem Netzwerk, das verschiedene Ebene des Verkehrs wird, aber ich erlebe auch die gleiche Sache, wenn das Zwischenprogramm auf einem Cluster ausgeführt werden, die ein privates Netzwerk ohne Verkehr hat (von den Benutzern mindestens) und eine 2-Gigabit-Verbindung. Ich werde auch diese Verzögerung auftreten, wenn das Zwischenprogramm lokal mit dem Senden und Empfangen von Programmen ausgeführt werden.

War es hilfreich?

Lösung

dachte ich, das Problem heute Morgen, während der Server in Java neu zu schreiben. Die Auflösung von meinem Windows-Systemtakt zwischen 15 und 16 Millisekunden. Das bedeutet, dass jedes Paket, das die gleiche Millisekunde als seine Sendezeit zeigt tatsächlich an verschiedenen Millisekunden in einem 16-Millisekunden-Intervall gesendet wird, aber meine Zeitstempel nur alle 15 bis 16 Millisekunden inkrementieren, so dass sie das gleiche erscheinen.

Ich bin hergekommen, um meine Frage zu beantworten, und ich sah die Reaktion über die Priorität meines Programms zu erhöhen. Also begann ich alle drei Programme, ging in den Task-Manager, hob alle drei „Echtzeit“ Priorität (die kein anderer Prozess war) und lief ihnen. Ich habe die gleichen 15 bis 16 Millisekunden-Intervallen.

Danke für die Antworten aber.

Andere Tipps

Es ist immer Pufferung beteiligt und variiert zwischen Hardware / Treiber / os etc. Der Paket-Scheduler auch eine große Rolle spielen.

Wenn Sie „harte Echtzeit“ garantiert wollen, dann sollten Sie bleiben weg von Windows-weg ...

Was Sie wahrscheinlich zu sehen, ist eine Scheduler Verzögerung - Ihre Anwendung für anderen Prozess wartet (e) ihre Zeitscheibe zu beenden und die CPU aufgeben. Standard Zeitscheiben auf Multi-Prozessor-Fenster sind von 15ms auf 180ms.

Sie könnten versuchen, die Priorität Ihrer Anwendung / Thread zu erhöhen.

Oh ja, ich weiß, was Sie meinen. Windows und seine Puffer ... versuchen, die Werte von SO_SNDBUF auf Sender eingestellt und SO_RCVBUF auf reciever Seite. Überprüfen Sie auch, beteiligten Netzwerk-Hardware (Router, Switches, Media-Gateways.) - so viele wie möglich eliminieren zwischen den Maschinen Latenz zu vermeiden

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