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?
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?
Antworten:
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).
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.
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.
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.