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?
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?
Respostas:
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).
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.
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.
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.