Uso da memória para TCP ou buffers de mensagens de pipe nomeados?

2

Eu tenho um grupo de programas que testei hoje. Eu drasticamente disparou a carga de entrada para o programa e funcionou no começo, mas eu tinha um vazamento de memória aparente sugando memória. O único problema é que 1) Valgrind está insistindo que eu não tenho vazamentos e 2) só acontece uma alta taxa de consumo de pacotes.

Uma ideia louca é que a memória extra pode estar indo para uma fila de mensagens devido a falta de largura de banda nos pacotes de saída tão rápido quanto eles estão entrando, forçando cada vez mais grandes buffers de dados a serem transmitidos. O programa que está mostrando como monopolizando a memória está lendo do soquete TCP e escrevendo para um pipe nomeado. então eu tenho três perguntas.

  1. A fila na memória para armazenamento de dados despachados pode aumentar indefinidamente para TCP / IP ou pipes nomeados?

  2. se a fila puder e realmente crescer, ela ainda mostrará que Meu programa (aquele que lê do TCP e está saindo para o pipe nomeado) foi o "memory hog", ou a memória seria apenas mostrada como memória do sistema?

  3. existe um comando que eu possa usar para verificar a memória alocada para essas filas? Estou correndo Centos

Admito que eu realmente não acho que essa é a causa do meu vazamento, mas, novamente, eu realmente não consigo adivinhar o que mais é, então eu tenho que perguntar!

    
por dsollen 29.08.2012 / 02:20

1 resposta

4
  1. Geralmente é bastante delimitado. Embora haja dois lugares (pelo menos), esses buffers podem existir:
    1. No kernel. Definitivamente limitado. FIFO é codificado Acredito que o TCP pode ser configurado em /proc/sys/kernel/tcp_wmem (e rmem) e (dentro dos limites de proc) com setsockopt SO_SNDBUF / SO_RCVBUF . Veja o tcp (7) manpage para detalhes.
    2. no seu aplicativo. Se você não está chamando write, etc. diretamente, a biblioteca que você está usando pode ter seus próprios buffers. Estes podem ser infinitos.
    3. Ok. Na verdade, existe um terceiro lugar, na RAM do seu NIC. Não pode ser aumentado além de um certo limite (bastante pequeno) sem soldar, então eu estou ignorando isso. Ah, e há um buffer de anel de transmissão, para o seu NIC para DMA de. Mais uma vez, tamanho fixo (ethtool para sintonizar, se possível).
  2. Os do kernel são exibidos como memória do sistema. Os que estão no seu aplicativo serão exibidos como parte do tamanho virtual do seu aplicativo (e tamanho de residência, etc.)
  3. netstat -t mostrará o tamanho atual da fila de envio e recebimento para cada conexão TCP. Para os que estão em sua biblioteca, verifique sua documentação.

Lembre-se, a memória não é vazada se você eventualmente a liberar. Se você está sofrendo apenas com filas cada vez maiores no seu aplicativo, isso não é vazado. Mesmo se você estiver sofrendo de fragmentação de memória crescente.

    
por 29.08.2012 / 04:14