Warum ist das Herunterladen mehrerer Threads schneller als das Herunterladen einzelner Threads?


13

Auf meinem Server befindet sich eine große Datei. Ich finde, dass Multi-Thread-Download 20 MBit / s erreichen kann, Single-Thread jedoch 10 MBit / s. Kann das jemand erklären?


Mehrere Threads, die dieselbe TCP-Verbindung bedienen, oder mehrere Threads mit jeweils separaten TCP-Verbindungen? Wollen Sie damit auch sagen, dass der Server Multithreading oder der Client Multithreading ist oder beides?
Spiff

Antworten:


14

Normalerweise liegt dies daran, dass sich irgendwo zwischen Ihnen und dem anderen Server eine Firewall befindet, die jeden HTTP-Stream auf 10 Mbit / s beschränkt. Wenn Sie Multi-Thread verwenden, erhalten Sie 2x 10 MB (eine für jeden Thread).


1
Ich benutze FTP und es gibt keine Einschränkung auf meinem Server
warum

@why: Vielleicht ist es Ihr ISP, der jede Verbindung auf 10 MBit / s begrenzt? Können Sie mehr als das in einem Geschwindigkeitstester bekommen?
André Paramés

4

Dies liegt an Ihrem Ping zwischen Ihnen und dem Server sowie an der Paketgröße / TCPIP-Fenstergröße, die von Ihrer Download-Software verwendet wird.

Grundsätzlich können Sie, wenn Sie 100 ms Ping an den Server haben und Pakete mit 100 KB anfordern, nur 10 Pakete pro Sekunde über 1 Verbindung erhalten, selbst wenn Ihre Internetgeschwindigkeit unendlich ist.


Sie müssen nicht jedes Paket bestätigen, solange der Empfänger seinen Puffer mit einer angemessenen Rate leert, sollte der Absender in der Lage sein, sie kontinuierlich zu pumpen.
André Paramés

Das stimmt. Aber selbst mit 256 KB Puffer verursacht Ping immer noch eine massive Verlangsamung
BarsMonster

3

TCP funktioniert am besten, wenn Sie "die Pipe voll halten" - wenn die sendende App weiterhin schnell genug Puffer sendet, um den TCP-Stapel des Absenders ständig mit Daten zu versorgen, damit er immer Daten "im Flug" im Netzwerk haben kann, und wenn der Empfänger Die App liest so schnell vom TCP-Stapel des Empfängers, dass das TCP-Fenster des Empfängers nie voll wird (auch hier kann der sendende TCP-Stapel die Daten im Netzwerk immer "im Flug" halten).

Ich könnte mir eine schlecht geschriebene Single-Threaded-Absender-App vorstellen, die einen Puffer an den TCP-Stack übergibt, darauf wartet, dass er vollständig bestätigt wurde, und dann einen weiteren Puffer übergibt. Das heißt, sobald das Ende des ersten Puffers im Netzwerk "im Flug" ist, wird der sendende TCP-Stapel für das Senden von Daten ausgehungert, was bedeutet, dass die Pipe entleert und erst nach dem Zurückkommen der Bestätigung und der sendenden App wieder aufgefüllt wird Übergibt ihm einen neuen Puffer.

Ich könnte mir auch eine schlecht geschriebene Single-Threaded-Empfänger-App vorstellen, die nicht schnell genug vom empfangenden TCP-Stack liest und somit die Puffer des TCP-Stacks füllen lässt, was bedeutet, dass das TCP-Fenster voll ist, wodurch der sendende TCP-Stack aufgeladen wird Hör auf zu senden, bis das Fenster etwas öffnet. Das Erhöhen der TCP-Fenstergröße des Empfängers kann ein wenig helfen, aber die eigentliche Lösung besteht darin, die Daten schneller zu lesen.


Es könnte also nichts damit zu tun haben, Single-Threaded zu sein?
Ape-inago

@ Ape-inago Sicher, eine gut geschriebene Single-Threaded-App könnte die Pipe voll halten, ja.
Spiff

2

Das liegt wahrscheinlich daran, dass Sie nur so viele Daten über eine Verbindung übertragen können. In einem Multithread-Programm können jedoch zwei Verbindungen gleichzeitig Daten empfangen und die Menge an Informationen verdoppeln, die Sie erhalten können. Dies hat einige Einschränkungen, zum Beispiel die Geschwindigkeit des Servers, von dem Sie herunterladen ... Hut ab vor zwei, die den Multithread-Downloader geschrieben haben, diese sind nicht einfach zu schreiben.


1
Warum ist es so schwierig? Sie müssen lediglich jedem Thread einen eigenen Abschnitt zuweisen und ihn in den entsprechenden Abschnitt der Ergebnisdatei schreiben lassen. Die Quelle von Axel scheint mir ziemlich einfach zu sein.
André Paramés
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.