Ich schreibe zwei Anwendungen (in C), die mehrere Anrufe zum Senden und Empfangen (z. B. ich bin eine Remote-Datei kopieren).Gründe für einen langsamen recv Anruf
Ich sende immer einen 64 Byte Header, der die Länge des folgenden Nachrichtentexts und einige andere Informationen enthält.
Beim Testen meiner Anwendung auf einige Dateien erkannte ich, dass einige Recv-Aufrufe ziemlich lange dauern (ca. 40 ms). Mit strace habe ich herausgefunden, dass es zuerst beim Senden eines Nachrichtentextes von 377 Bytes passiert (was in diesem Fall den gesamten Inhalt meiner zu kopierenden Datei betrifft).
Die Serveranwendung beginnt mit dem Senden des Nachrichtentexts, der ungefähr 48 us dauert. Jetzt verbraucht die Clientanwendung etwa 38 ms, um diese Bytes zu empfangen.
Von diesem Zeitpunkt an verbrauchen alle empfangenen Anrufe so viel Zeit, da sie jeweils in einem Empfang blockieren und auf die Antwort warten.
Server Strace
[pid 27158] 1292236124,465827 send (6, „\ 0 \ 0 \ 1 \ 271 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0core.fwrite \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 "..., 64, 0) = 64 < 0.000031>
[pid 27158] 1292236124.466074 senden (6," \ 0 \ 0 \ 0 \ 1 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 10 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 1 \ 0 \ 0 \ 0 \ 0" ..., 377, 0) = 377 < 0,000048>
Kunden strace
[pid 27159] 1292236124.466364 recv (4, "\ 0 \ 0 \ 1 \ 271 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0core.fwrite \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 "0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 3, 4, 0, 0, 0, 0, 0, 0, 0, 0,,, 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 10 \ 0 \ 0 \ 0 \ 1 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 1 \ 0 \ 0 \ 0 \ 0 " ..., 377, 0) = 377 < 0.037456>
Dieses Problem gibt mir wirklich eine harte Zeit, da ich nicht verstehe, warum der Empfangsanruf auf dem Client so viel Zeit braucht.
Alle Hinweise würden sehr geschätzt werden.
wie abwickeln sagt, es kann Nagle bei der Arbeit sein. Wenn Sie jedoch Dateien kopieren, wird der Name des Spiels nicht durchgerechnet? Ich verstehe es nicht wirklich "Von diesem Zeitpunkt an verbrauchen alle eingehenden Anrufe so viel Zeit, da sie jeweils einen Empfang blockieren und auf die Antwort warten." wartet der Server auf den Client? – lijie