Чому завантаження з декількох потоків відбувається швидше, ніж одна нитка?


13

На моєму сервері є один великий файл. Я вважаю, що завантаження з декількох ниток може отримати 20 Мбіт, але одна нитка може отримати 10 Мбіт / с, хтось може це пояснити?


Кілька потоків, що обслуговують одне і те ж TCP-з'єднання, або кілька потоків, кожен з яких має окремі TCP-з'єднання? Ви також говорите, що сервер багатопотоковий, або клієнт багатопотоковий, або обидва?
Spiff

Відповіді:


14

Зазвичай це відбувається тому, що десь між вами та іншим сервером є брандмауер, що обмежує кожен потік HTTP до 10 Мбіт / с. Коли ви використовуєте багатопотокові, ви отримуєте 2x 10Mb (по одному для кожної нитки).


1
Я використовую FTP, і на моєму сервері немає обмежень
чому

@why: можливо, ваш провайдер обмежує кожне з'єднання до 10 Мбіт / с? Чи можете ви отримати більше, ніж тестер швидкості?
Андре Парамеш

4

Це пов’язано з вашим ping між вами та сервером та розміром вікна / розміром вікна tcpip, який використовується вашим завантажувальним програмним забезпеченням.

В основному, якщо у вас 100мс пінг-сервер і запитують пакети 100кб, ви можете отримати лише 10 пакетів в секунду, використовуючи 1 з'єднання, навіть якщо швидкість вашого інтернету нескінченна.


Вам не потрібно обробляти кожен пакет, доки приймач спорожняє свій буфер з розумною швидкістю, відправник повинен мати можливість постійно їх перекачувати.
Андре Парамеш

Це вірно. Але навіть із
256-фунтовим

3

TCP найкраще працює, коли ви "тримаєте трубку повною" - коли програма, що надсилає, постійно надсилає буфери досить швидко, щоб постійно відсилати стек TCP відправника з даними, щоб він міг завжди мати дані "в польоті" в мережі та коли приймач додаток постійно читає з приймача TCP стек досить швидко, щоб вікно TCP приймача ніколи не заповнювалося (знову-таки, тому відправляючий стек TCP завжди може зберігати дані "в польоті" в мережі).

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

Я також міг уявити погано написаний однопотоковий приймач, який не читає з приймаючого стека TCP досить швидко, і таким чином дозволяє буферам стека TCP заповнюватися, що означає, що вікно TCP заповнюється, що призводить до надсилання стека TCP на припинити надсилання, поки вікно не відкриється. Збільшення розміру вікна TCP приймача може трохи допомогти, але справжнім рішенням для цього є швидше зчитувати дані.


Отже, це може не мати нічого спільного з тим, щоб бути однопоточним?
Ape-inago

@ Ape-inago Звичайно, добре написана однопоточна програма може зберегти трубу повною, так.
Spiff

2

Ну, це, мабуть, тому, що ви можете передати стільки даних лише за одне з'єднання. Однак у багатопотоковій програмі ви можете мати два з'єднання, що приймають дані одночасно, і подвоювати кількість інформації, яку ви можете отримати. Для цього є деякі обмеження, наприклад, швидкість роботи сервера, з якого ви завантажуєте ... Шапки з двох, хто написав багатопотоковий завантажувач, записати їх непросто.


1
Чому так складно? Вам просто потрібно виділити окремий розділ для кожного потоку і дати йому записати у відповідному розділі файлу результатів. Джерело axel мені здається досить простим.
Андре Парамеш
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.