Por que o download de vários threads é mais rápido que o único?


13

Há um arquivo grande no meu servidor. Acho que o download multi-thread pode ter 20Mbs, mas um único thread pode ter 10Mbps, alguém pode explicar isso?


Vários threads atendendo à mesma conexão TCP ou vários threads, cada um com conexões TCP separadas? Você também está dizendo que o servidor é multithread, ou o cliente é multithread, ou ambos?
Spiff

Respostas:


14

Geralmente, isso ocorre porque em algum lugar entre você e o outro servidor há um firewall que limita cada fluxo HTTP a 10 Mbps. Ao usar o multithread, você obtém 2x 10Mb (um para cada thread).


1
Eu uso o FTP e não há limites no meu servidor
por que

@ por que: talvez seja o seu ISP que está limitando cada conexão a 10mbps? Você pode obter mais do que isso em um testador de velocidade?
André Paramés

4

Isso ocorre devido ao seu ping entre você e o servidor e o tamanho do pacote / tamanho da janela tcpip usado pelo seu software de download.

Basicamente, se você tiver 100ms de ping no servidor e solicitar pacotes de 100kb, poderá obter apenas 10 pacotes por segundo usando 1 conexão, mesmo que a velocidade da sua Internet seja infinita.


Você não precisa aceitar cada pacote, desde que o destinatário esvazie seu buffer a uma taxa razoável, o remetente poderá bombeá-lo continuamente.
André Paramés

Está certo. Mas mesmo com tampão de 256kb, o ping ainda provoca desaceleração maciça
BarsMonster

3

O TCP funciona melhor quando você "mantém o canal cheio" - quando o aplicativo de envio continua enviando buffers com rapidez suficiente para manter a pilha TCP do remetente constantemente fornecida com os dados, para que ele possa sempre ter dados "em andamento" na rede e quando o receptor O aplicativo continua lendo a pilha TCP do receptor com rapidez suficiente para que a janela TCP do receptor nunca seja preenchida (novamente, para que a pilha TCP de envio sempre possa manter os dados "em andamento" na rede).

Eu poderia imaginar um aplicativo remetente de thread único mal escrito que passa um buffer para a pilha TCP, espera ouvir que ele foi totalmente Acked e, em seguida, passa outro buffer. Isso significa que, assim que o final do primeiro buffer estiver "em vôo" na rede, a pilha TCP de envio ficará sem dados para enviar, o que significa que o tubo é drenado e não é reabastecido até que o Ack volte e o aplicativo de envio passa um novo buffer.

Também pude imaginar um aplicativo receptor de thread único mal escrito que não lê da pilha TCP receptora com rapidez suficiente e, assim, permite que os buffers da pilha TCP sejam preenchidos, o que significa que a janela TCP é preenchida, o que faz com que a pilha TCP de envio seja pare de enviar até a janela abrir um pouco. Aumentar o tamanho da janela TCP do receptor pode ajudar um pouco, mas a solução real nesse sentido é ler os dados mais rapidamente.


Então, pode não ter nada a ver com ser único thread?
Ape-Inago

@ Ape-inago Claro, um aplicativo single-threaded bem escrito pode manter o cano cheio, sim.
Spiff

2

Bem, isso é provavelmente porque você só pode transferir tantos dados em uma conexão. No entanto, em um programa multithread, você pode ter duas conexões recebendo dados ao mesmo tempo e dobrando a quantidade de informações que você pode obter. Existem algumas limitações para isso, por exemplo, a velocidade do servidor do qual você está baixando ... Tirando o chapéu de quem escreveu o downloader multiencadeado, não é fácil escrever.


1
Por que é tão difícil? Você só precisa alocar uma seção individual para cada segmento e deixá-lo escrever na seção apropriada do arquivo de resultados. A fonte do axel parece bem direta para mim.
André Paramés
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.