muitos pacotes apagados e pacotes recolhidos devido a buffer / overrun do soquete

5

Eu configurei uma máquina de teste (debian squeeze 2.6.32 em uma máquina linode 2048) que interage com uma API que retorna grandes partes do json. Ele chama a API 3000 / minutos de forma assíncrona, a API está retornando cargas de ~ 450kb. Há também um servidor http na caixa para exibir os resultados das chamadas.

Ao fazer netstat -s (o tempo de atividade é de 20 dias):

 254329 packets pruned from receive queue because of socket buffer overrun
 50678438 packets collapsed in receive queue due to low socket buffer

Isso não parece bom para mim, então segui esses tutoriais para ajustar os parâmetros do TCP:

link

e

link

mas isso não parece ajudar.

Algum conselho / tutorial / explicação sobre buffers de soquete que possam ajudar a entender e corrigir o problema?

obrigado

    
por hellvinz 05.07.2011 / 17:22

2 respostas

8

Parece que você está atingindo o tráfego de rede máximo que seu VPS pode manipular. Ajustar parâmetros TCP não é mágica - pode ajudar um pouco, mas provavelmente não é suficiente. Alguns ajustes podem até ser negados pela execução em uma máquina virtual - o tráfego ainda é passado pela placa de rede real do hipervisor e é afetado por suas configurações.

Você diz que a carga útil recebida é 450kb por solicitação. Isso é em quilo bits ou quilo bytes ? A maioria das ferramentas mede o tamanho em bytes, mas farei ambos os cálculos.

Assumindo kilobits:

  • 3000 solicitações / minuto = 50 solicitações / segundo
  • 50 * 450kbit = 22,500kbit / s = aproximadamente 22Mbit / s

Supondo kilobytes, são aproximadamente 176Mbit / s.

Se forem kilobytes, você não conseguirá fazer isso consistentemente na maioria dos servidores VPS. Cada servidor terá pelo menos 10-20 VPSs nele. O Linode usa duas conexões ligadas em gigabits para cada servidor. Isso significa que o seu "quinhão" em servidores completos seria em torno de 100Mbit / s na melhor das hipóteses.

Mesmo se for kilobits, 22Mbit é um bom bocado para a maioria dos VPSs.

Ao fazer tantos pedidos tão rapidamente, provavelmente você está fazendo o equivalente a DOS em seu próprio servidor. Verificar o tráfego real da sua rede de entrada deve dar uma ideia de quanto você está realmente usando. Se você precisa de velocidades reais de 100mbit ou mesmo gigabit, talvez seja necessário consultar um servidor dedicado. Caso contrário, você precisará desacelerar as solicitações até que elas diminuam o suficiente para que o servidor possa lidar com isso.

Você também precisa verificar a memória e o uso da CPU. Se qualquer um deles estiver no máximo, o servidor começará a descartar pacotes porque simplesmente não possui recursos para manipulá-los. Comece olhando para top e ntop para ver seu uso de CPU, memória e rede por algum tempo.

    
por 03.08.2013 / 04:16
2

Saturação do buffer de soquete significa que os dados não se encaixam no buffer de memória especial, atribuído a cada conexão. Todos os dados provenientes da interface de rede são colocados em tal buffer, e seu aplicativo está lendo a partir dele. Depois que o aplicativo ler os dados, ele será liberado desse buffer. Basicamente, você deve esperar que o aplicativo leia dados assim que estiver disponível e o aplicativo esteja livre para processar os dados. Mas se você não tem desempenho suficiente - é saturado da CPU ou bloqueado pelo aplicativo (o que é bastante comum com o nodejs) - os dados continuam aparecendo, mas o tamanho do buffer não é suficiente para lidar com tudo isso.

Mesmo se você tiver buffers enormes, ainda será removido e os dados serão descartados se o aplicativo não puder processar tudo a tempo. Então sugiro que você ajuste o desempenho do aplicativo primeiro.

    
por 09.08.2013 / 14:13

Tags