Почему многопоточная загрузка быстрее, чем однопоточная?

на моем сервере есть один большой файл. Я считаю, что многопоточная загрузка может получить 20 Мбит / с, но один поток может получить 10 Мбит / с, Может ли кто-нибудь объяснить это?

5
задан boot13
05.02.2023 2:59 Количество просмотров материала 2719
Распечатать страницу

4 ответа

обычно это происходит потому, что где-то между вами и другим сервером есть брандмауэр, ограничивающий каждый поток HTTP до 10 Мбит / с. Когда вы используете многопоточность, вы получаете 2x 10Mb (по одному для каждого потока).

14
отвечен Mark Henderson 2023-02-06 10:47

Это связано с вашим пингом между вами и сервером и размером окна packet size/tcpip, используемым вашим загружающим программным обеспечением.

в принципе, если у вас есть 100мс пинг на сервер, и запросить пакеты 100kb, вы можете получить только 10 пакетов в секунду с помощью 1 соединения, даже если ваша скорость интернета бесконечна.

4
отвечен BarsMonster 2023-02-06 13:04

протокол TCP работает лучше всего, когда вы "держите труба полная" - при отправки приложения продолжает отправлять буферов достаточно быстро, чтобы держать отправитель TCP-стека постоянно снабжались данными, так что он может всегда иметь данные "на лету" по сети, и когда приемник приложение поддерживает чтение из приемника TCP стек достаточно быстро, что приемник по протоколу TCP окно не заполняется (опять же, чтобы отправить TCP стек всегда можете сохранить данные "на лету" по сети).

Я могу себе представить плохо написанное однопоточное приложение-отправитель, которое передает один буфер в стек TCP, ожидает сообщения о том, что он был полностью обработан, а затем передает другой буфер. Это означает, что, как только конец первого буфера находится "в полете" в сети, отправляющий стек TCP голодает для данных для отправки, что означает, что канал стекает и не пополняется до тех пор, пока Ack не возвращается, и отправляющее приложение передает ему новый буфер.

Я мог бы также представить себе плохо написанное однопоточное приложение-приемник, который не читает от стека TCP получения достаточно быстро и таким образом позволяет буферам стека TCP заполняться, что означает, что окно TCP заполняется, который заставляет стек TCP отправки прекратить отправку, пока окно не открывает некоторые. Увеличение размера окна TCP приемника может помочь немного, но реальное решение на этом конце, чтобы читать данные быстрее.

3
отвечен Spiff 2023-02-06 15:21

Ну, это, вероятно, потому, что вы можете передавать так много данных только через одно соединение. Однако в многопоточной программе у вас может быть два соединения, получающие данные одновременно и удваивающие количество информации, которую вы можете получить. Есть некоторые ограничения на это, например, скорость сервера, с которого вы загружаете... Шляпы от двух, кто написал многопоточный загрузчик, это нелегко написать.

2
отвечен Joshkunz 2023-02-06 17:38

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх