Pourquoi le téléchargement multi-thread est-il plus rapide que le thread unique?

13

Il y a un gros fichier sur mon serveur. Je trouve que le téléchargement multi-threads peut obtenir 20Mbs, mais un seul thread peut obtenir 10Mbps, quelqu'un peut-il expliquer cela?

Pourquoi
la source
Plusieurs threads desservant la même connexion TCP, ou plusieurs threads chacun avec des connexions TCP distinctes? Dites-vous également que le serveur est multithread, ou que le client est multithread, ou les deux?
Spiff

Réponses:

14

Habituellement, c'est parce que quelque part entre vous et l'autre serveur, il y a un pare-feu limitant chaque flux HTTP à 10 Mbps. Lorsque vous utilisez plusieurs threads, vous obtenez 2 x 10 Mo (un pour chaque thread).

Mark Henderson
la source
1
J'utilise FTP et il n'y a pas de limite sur mon serveur
pourquoi
@why: c'est peut-être votre FAI qui plafonne chaque connexion à 10 Mbps? Pouvez-vous obtenir plus que cela dans un testeur de vitesse?
André Paramés
4

Cela est dû à votre ping entre vous et le serveur et à la taille de paquet / taille de fenêtre tcpip utilisée par votre logiciel de téléchargement.

Fondamentalement, si vous avez 100 ms de ping vers le serveur et demandez des paquets de 100 Ko, vous ne pouvez obtenir que 10 paquets par seconde en utilisant 1 connexion, même si votre vitesse Internet est infinie.

BarsMonster
la source
Vous n'avez pas besoin d'accuser réception de chaque paquet, tant que le récepteur vide sa mémoire tampon à un débit raisonnable, l'expéditeur doit être capable de les pomper en continu.
André Paramés
C'est vrai. Mais même avec un tampon de 256 Ko, le ping provoque toujours un ralentissement massif
BarsMonster
3

TCP fonctionne mieux lorsque vous "gardez le tuyau plein" - lorsque l'application d'envoi continue d'envoyer des tampons assez rapidement pour garder la pile TCP de l'expéditeur constamment alimentée en données afin qu'elle puisse toujours avoir des données "en vol" sur le réseau, et lorsque le récepteur L'application continue de lire à partir de la pile TCP du récepteur assez rapidement pour que la fenêtre TCP du récepteur ne se remplisse jamais (encore une fois, la pile TCP d'envoi peut donc toujours garder les données «en vol» sur le réseau).

Je pourrais imaginer une application d'expéditeur à thread unique mal écrite qui transmet un tampon à la pile TCP, attend d'entendre qu'elle a été entièrement acquittée, puis passe un autre tampon. Cela signifie qu'une fois que la fin du premier tampon est "en vol" sur le réseau, la pile TCP d'envoi est affamée pour les données à envoyer, ce qui signifie que le tuyau se vide et n'est pas rempli avant le retour de l'Ack et l'application d'envoi. lui passe un nouveau tampon.

Je pourrais également imaginer une application de réception à un seul thread mal écrite qui ne lit pas assez rapidement à partir de la pile TCP de réception et laisse ainsi les tampons de la pile TCP se remplir, ce qui signifie que la fenêtre TCP se remplit, ce qui provoque la pile TCP d'envoi à arrêtez d'envoyer jusqu'à ce que la fenêtre s'ouvre. L'augmentation de la taille de la fenêtre TCP du récepteur peut aider un peu, mais la vraie solution à cette fin est de lire les données plus rapidement.

Spiff
la source
Donc, cela pourrait n'avoir rien à voir avec le fait d'être monothread?
Ape-inago
@ Ape-inago Bien sûr, une application monothread bien écrite pourrait garder le tuyau plein, oui.
Spiff
2

Eh bien, c'est probablement parce que vous ne pouvez transférer autant de données que sur une seule connexion. Cependant, dans un programme multi-thread, vous pouvez avoir deux connexions recevant des données en même temps et doublant la quantité d'informations que vous pouvez obtenir. Il y a quelques limitations à cela, par exemple la vitesse du serveur à partir duquel vous téléchargez ...

Joshkunz
la source
1
Pourquoi est-ce si difficile? Vous avez juste besoin d'allouer une section individuelle pour chaque thread et de le laisser écrire dans la section appropriée du fichier de résultat. La source d' Axel me semble assez simple.
André Paramés