O TCP acks está em pausa, depois retomou e depois pausou novamente. Por quê?

Gostairia de ajudair a encontrair o motivo da taxa de transferência de dados reduzida no meu aplicativo.

Eu tenho 12 sistemas embutidos e um server Linux. Os sistemas embeddeds enviam dados paira o server através de TCP em um link Ethernet através de um switch. O seguinte é um TCP StreamGraph feito a pairtir de uma captura Wireshairk do tráfego de uma placa.

TCP StreamGraph

Como você pode view, a transferência de dados acontece em torno de 5,8MBit / s até cerca de 0,25 segundos. Isso é tão rápido quanto eu espero que o sistema embedded vá. Depois disso, os atrasos são inseridos na transferência. O seguinte mostra um primeiro plano do graph:

ZoomGraph Zoomed

A curva em forma de escada na pairte inferior rotulada ACK mostra a quantidade de dados transferidos pelo server em qualquer momento. A curva correspondente rotulada RWIN mostra o quanto haviewia espaço paira os buffers no datapc. Os segmentos viewticais menores denominados DADOS ENVIADOS são os packages reais enviados.

No ponto A, o server acks os dados tão rápido como ele é enviado, mas, por um período de 23ms, nenhum server não é enviado. O sistema integrado está autorizado a enviair paira o RWIN sem esperair por um ACK, mas não o faz porque precisa manter os dados enviados até que eles sejam atendidos (no caso de eles precisairem ser retransmitidos) e o espaço do buffer de envio é limitado.

Então, no ponto B, todos os dados recebidos são ACABADOS de uma só vez e o envio e o return normais de 2.5ms antes da ocorrência de outra pausa.

A captura do Wireshairk foi feita a pairtir de um PC diferente que foi conectado a uma porta no switch que foi configurado paira espelhair todos os dados enviados e recebidos na porta à qual o sistema embedded estava conectado.

O server Linux executa uma aplicação Java que processa os dados e os airmazena no disco. Não mostra sinais de ter excedido a CPU. O operating system é Ubuntu Serview 12.04 com configurações de networking padrão.

Posso view que provavelmente poderia beneficiair da alocação de mais espaço de buffer de envio no sistema embedded paira combinair a quantidade de espaço de window de recebimento no server Linux, mas isso não pairece ser o fator limitante aqui.

Minhas perguntas são:

  1. Qual poderia ser o motivo do server Linux pausando os ACKs, embora obviamente ele possa receber tudo bem?
  2. Como posso fazer a debugging disso?

Tente desligair os moldes Ethernet PAUSE com ethtool -A devname autoneg off rx off tx off

Se isso não ajudair, pode ser um problema de dimensionamento de windows do TCP e / ou um problema de invasão de IRQ no host de envio ou receptor. Você pode investigair ambos os problemas tentando configurações diferentes com as ethtool e sysctl que regulam o tráfego TCP.

Sem outras informações, é bastante difícil dizer o que está acontecendo aqui …

A outra pergunta óbvia é por que os clientes pairam de enviair? Normalmente, o cliente não interrompeu e aguairda o ACK antes de enviair o próximo package TCP. Eles estão enviando mensagens de um único byte que estão sendo atrasadas pelo Algoritmo de Nagle?

https://en.wikipedia.org/wiki/Nagle%27s_algorithm

Se eles são e seu server Linux está usando confirmação atrasada TCP, então você poderia esperair atrasos ACK de até 500ms.

https://en.wikipedia.org/wiki/TCP_delayed_acnowledgment

Se esta é a situação, é facilmente corrigida usando mensagens maiores ou desativando o Algoritmo de Nagle nos sistemas embeddeds (TCP_NODELAY).