Trenização do soquete porque o cliente não está lendo dados com rapidez suficiente?
-
21-09-2019 - |
Pergunta
Eu tenho uma conexão de cliente/servidor em um soquete TCP, com o servidor escrevendo para o cliente o mais rápido possível.
Observando minha atividade de rede, o cliente de produção recebe dados em cerca de 2,5 MB/s.
Um novo cliente leve que escrevi para apenas ler e comparar a taxa tem uma taxa de cerca de 5,0 MB/s (que provavelmente está em torno da velocidade máxima que o servidor pode transmitir).
Eu queria saber o que governa as taxas aqui, já que o cliente não envia dados para o servidor para contar sobre qualquer limite de taxa.
Solução
No TCP, é o cliente. Se a janela TCP do servidor estiver cheia - ela precisará esperar até que mais ACKs do cliente chegassem. Ele está oculto de você dentro da pilha TCP, mas o TCP introduz a entrega garantida, o que também significa que o servidor não pode enviar dados mais rapidamente do que a taxa em que o cliente os está processando.
Outras dicas
O TCP possui controle de fluxo e acontece automaticamente. Leia sobre isso em http://en.wikipedia.org/wiki/transmission_control_protocol#flow_control
Quando o tubo preenche devido ao controle de fluxo, as operações de gravação de soquete de E/S do servidor não serão concluídas até que o controle de fluxo seja relevado.
O servidor está escrevendo dados em 5,0 MB/s, mas se o seu cliente for o gargalo aqui, o servidor terá que esperar antes que os dados no "Buffer enviado" sejam completamente enviados ao cliente ou o espaço suficiente seja liberado para colocar mais dados.
Como você disse que o cliente leve foi capaz de receber a 5,0 MB/s, serão as operações pós-recebimento do seu cliente que você deve verificar. Se você estiver recebendo dados e processando -os antes de ler mais dados, esse pode ser o gargalo.
É melhor receber dados de forma assíncrona e, assim que o receber forem concluídos, peça aos soquetes do cliente que comecem a receber dados novamente, enquanto você processa os dados recebidos em um encadeamento de threads do thread separado. Dessa forma, seu cliente está sempre disponível para receber dados incríveis, e o servidor pode enviá -los a toda velocidade.