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?
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?
Réponses:
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).
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.
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.
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 ...