WinSock komisches Verhalten / delay

OP Persönliche Seite #3228374
Lesenswert?

Moin Leutz,

kennt sich jemand mit WinSock aus?

Ich habe einen µC, der per ETH Daten gestreamt bekommt. Das muss 
ziemlich knackig & in Echtzeit laufen.
Getestet ist das ganze unter Win7 bzw. Win8, mit verkabeltem ETH.

Nun ist mir aufgefallen, dass der PC scheinbar die Antworten des µC 
(wenige Byte ACK/NAK) stark delayed, und der PC somit nix neues senden 
kann.

Noch interessanter ist aber, dass die Übertragung flutscht wie Sau, wenn 
ich google Chrome öffne oder WoW Matrix (mit dem IE funzt das nicht), 
auch ohne, dass Daten übertragen werden. Diese Programme scheinen den 
ETH irgendwie umzukonfigurieren...

Weiss jemand, wie man den WinSock mit weiteren Optionen konfigurieren 
kann (habe bereits RX/TX bufsize geseztz), so dass die Übertragung in 
jedem Fall schnell läuft? Werde da nicht so richtig fündig...

Auffällig (s. pic) ist, dass das Delay zwischen den kurzen Daten-bursts 
40ms beträgt, davon bekomme ich 8ms Daten.


VG,
/th.
Angehängte Dateien:
Gast #3228397
Lesenswert?

Random ... schrieb:
> Nun ist mir aufgefallen, dass der PC scheinbar die Antworten des µC
> (wenige Byte ACK/NAK) stark delayed, und der PC somit nix neues senden
> kann.

sicher? Es ist eigentlich andersrum. Der PC sammelt erst ein paar Daten 
bis er sie sendet. Damit verhindert man das jedes Byte in ein eigenen 
Packet gepackt wird.

Um das Verhalten umzuschalten, kann man den socket auf TCP_NODELAY 
schalten.
Gast #3228419
Lesenswert?

dann finde erst mal raus ob es am Senden oder empfangen liegt.

Wird ein packet sofort gesendet wenn du es willst?
Wird es sofort empfangen? Vergleich mit Wireshark.

Welche Zeit vergeht zwischen Empfangen und Senden?
OP Persönliche Seite #3228441
Lesenswert?

Beide Seiten sind unter meiner Kontrolle. Die Firmware auf dem µC ist 
von mir, die PC Seite (dll) macht ein Kumpel von mir, den src habe ich 
auch.

Wenn man in die kurzen Peaks reinmisst, sieht man, dass das UDP Send den 
µC 3.44µs nach dem Empfang eines Datenpaketes verlässt.

Die Diagramme kommen direkt von Variablen aus der Software (Cortex-M3 
DWT, ULINK pro).
Gast #3228445
Lesenswert?

Random ... schrieb:
> Wenn man in die kurzen Peaks reinmisst, sieht man, dass das UDP Send den
> µC 3.44µs nach dem Empfang eines Datenpaketes verlässt.

dann müsstest du das Packet ja im Wireshark auch kurz danach sehen. Dort 
steht ja auch die Systemzeit mit da. Dann müsstest du jetzt nur noch mit 
dem Zeitpunkt vergleichen wann du das Packet in deiner Software erhalten 
hast.
OP Persönliche Seite #3228473
Lesenswert?

Ja.
Der µC (.43) sendet rq, der PC antwortet. Dann fragt der µC 2x nach 
knapp 10ms nach, dann kommen zwei ID requests (635, 636), dann fragt der 
µC bei 0.0184 noch mal nach, und der PC antwortet nach 0.019.

Die 40ms scheinen 4 pakete a' 1kByte alle 10ms zu sein.

Der Datenempfang selbst dauert 156µS im µC, nach 3.7µs wird bereits der 
ack gesendet, so dass der PC die nächsten Daten auf die Reise schicken 
kann.
Angehängte Dateien:
Gast #3228491
Lesenswert?

ich kann immer noch nicht so recht folgen. Ich kann nicht mal erkennen 
wo die Zeit vergeht. Ich kenne ja nicht den Inhalt und den ablauf der 
Übertragung.

Ich kenne zumindest keine Option die man in der WinSock umschalten kann 
damit etwas schneller geht.

Kannst du denn in deiner Software sicherstellen das die Antwort sofort 
versendet wird? Im besten wirklich mal die Zeitpunkte vom Empfangen und 
Senden mit locken. Dann könnte man es mit dein Zeiten im Wireshark 
vergleichen um festzustellen ob das Packet zu lange im "socket" 
festhängt.

bin erstmal weg für heute...
Gast #3228716
Lesenswert?

Bernd H. schrieb:
> ermutlich ruft Chrome timeBeginPeriod() auf und der Thread kommt
> dadurch  einfach schneller wieder zum Zuge.

kann ich mir zwar nicht vorstellen, das das solche extremen auswirkungen 
hat. Aber das sollte beim mitloggen der Sende und Empfangszeiten 
festellen können.
Gast #3229447
Lesenswert?

Random ... schrieb:
> Sollte man selbst auch sowas machen oder besser lassen?

ich würde lieber nach der ursache in deinem quellcode suchen. Das 
verhalten kann durch aus ein zusammenspiel von ungünstigen 
Threadverhalten sein.

MS schreibt dazu:

Windows uses the lowest value (that is, highest resolution) requested by 
any process. Setting a higher resolution can improve the accuracy of 
time-out intervals in wait functions.

hast du denn wartezeiten in deinen Code? Oder kommt es dann überhaupt zu 
einem timeout?
#3229470
Lesenswert?

timeBeginPeriod() wird z.B. hier drin erwähnt:
http://msdn.microsoft.com/en-us/windows/hardware/gg463266.aspx
"Modern processors and chipsets, particularly in portable platforms, use 
the idle time between system timer intervals to reduce system power 
consumption. Various processor and chipset components are placed into 
low-power idle states between timer intervals. However, these low-power 
idle states are often ineffective at lowering system power consumption 
when the system timer interval is less than the default.
If the system timer interval is decreased to less than the default, 
including when an application calls timeBeginPeriod with a resolution of 
1 ms, the low-power idle states are ineffective at reducing system power 
consumption and system battery life suffers."
[..]
"System battery life can be reduced as much as 25 percent, depending on 
the hardware platform."
...mit anderen Worten: Man verschwendet Energie.
Gast #3229474
Lesenswert?

Bernd H. schrieb:
> ...mit anderen Worten: Man verschwendet Energie.

damit halte ich das verhalten von Chrome schon als sehr bedenklich. Sie 
nehmen recht wenig rücksicht auf andere dinge, hautsache man bekommt 
seine Daten 10ms schneller. Wieder ein Grund Chrom nicht zu verwenden.
OP Persönliche Seite #3229514
Lesenswert?

Ho,

Sleep() verwenden wir mWn nicht, aber es sind waits drin, die auf Eth 
Daten warten (also die ACKs/NAKs vom µC).

Die Daten werden von einer höheren Schicht entgegengenommen und für den 
Versand fertiggemacht. Dann werden als erstes 4 Pakete auf einmal, 
danach bis zum Datenende 1-4 Pakete "gleichzeitig" übertragen, abhängig 
von den ACKs/NAKs (es könnte ein Paket verloren gegangen sein...)

Sollte das ETH wait for packet von diesem Timer abhängig sein, hätten 
wir da den Salat :-)
Gast #3229587
Lesenswert?

Bernd H. schrieb:
> Warten auf E/A dürfte vermutlich einen ähnlichen Effekt wie Sleep()
> haben und könnte tatsächlich die Ursache sein.

nein, weil das ja ein warten auf ein Event ist und nicht auf einen 
Timeout. Events werden ja wohl nicht in den gleichen Zeitschleifen wie 
Timeout behandelt.

So etwas währe mir schon aufgefallen, dann dürften ja Server-Sockets 
keine Antwortzeiten unter 10ms liefern und das ist nicht der fall.


Ist der Code wirklich so geheim das wir ihn nicht sehen dürfen?
OP Persönliche Seite #3230465
Lesenswert?

Hi,

danke für die ganzen Antworten, die Sache mit dem Timer auf 1ms (scheint 
der default bei den meissten Windosen zu sein, vgl. Clockres) hats dann 
erstmal gebracht.

Da es sich bei einem Wait for Event ja nicht um eine Timeslice im 
eigentlichen Sinne handelt, werden wir das Threading nochmal überprüfen, 
ob sich da nciht der Fehlerteufel eingeschlichen hat :-)

VG,
/th.
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren