на моем сервере есть один большой файл. Я считаю, что многопоточная загрузка может получить 20 Мбит / с, но один поток может получить 10 Мбит / с, Может ли кто-нибудь объяснить это?
Почему многопоточная загрузка быстрее, чем однопоточная?
4 ответа
обычно это происходит потому, что где-то между вами и другим сервером есть брандмауэр, ограничивающий каждый поток HTTP до 10 Мбит / с. Когда вы используете многопоточность, вы получаете 2x 10Mb (по одному для каждого потока).
Это связано с вашим пингом между вами и сервером и размером окна packet size/tcpip, используемым вашим загружающим программным обеспечением.
в принципе, если у вас есть 100мс пинг на сервер, и запросить пакеты 100kb, вы можете получить только 10 пакетов в секунду с помощью 1 соединения, даже если ваша скорость интернета бесконечна.
протокол TCP работает лучше всего, когда вы "держите труба полная" - при отправки приложения продолжает отправлять буферов достаточно быстро, чтобы держать отправитель TCP-стека постоянно снабжались данными, так что он может всегда иметь данные "на лету" по сети, и когда приемник приложение поддерживает чтение из приемника TCP стек достаточно быстро, что приемник по протоколу TCP окно не заполняется (опять же, чтобы отправить TCP стек всегда можете сохранить данные "на лету" по сети).
Я могу себе представить плохо написанное однопоточное приложение-отправитель, которое передает один буфер в стек TCP, ожидает сообщения о том, что он был полностью обработан, а затем передает другой буфер. Это означает, что, как только конец первого буфера находится "в полете" в сети, отправляющий стек TCP голодает для данных для отправки, что означает, что канал стекает и не пополняется до тех пор, пока Ack не возвращается, и отправляющее приложение передает ему новый буфер.
Я мог бы также представить себе плохо написанное однопоточное приложение-приемник, который не читает от стека TCP получения достаточно быстро и таким образом позволяет буферам стека TCP заполняться, что означает, что окно TCP заполняется, который заставляет стек TCP отправки прекратить отправку, пока окно не открывает некоторые. Увеличение размера окна TCP приемника может помочь немного, но реальное решение на этом конце, чтобы читать данные быстрее.
Ну, это, вероятно, потому, что вы можете передавать так много данных только через одно соединение. Однако в многопоточной программе у вас может быть два соединения, получающие данные одновременно и удваивающие количество информации, которую вы можете получить. Есть некоторые ограничения на это, например, скорость сервера, с которого вы загружаете... Шляпы от двух, кто написал многопоточный загрузчик, это нелегко написать.
Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]