HAproxy uso de memória dupla após recarregar

1

Devido ao alto tráfego e à natureza de nosso aplicativo para manter as conexões ativas, nosso processo haproxy consome boa quantidade de RAM (normalmente 30-40% da RAM disponível). Agora, quando queremos adicionar / remover qualquer backend, temos que recarregar o haproxy. Durante o recarregamento gracioso (pelo recarregamento init padrão do ubuntu), um novo processo haproxy é criado, servindo novas conexões e o processo existente permanece até que conexões antigas sejam fechadas pelo aplicativo ou limpas devido ao tempo limite etc. Esse comportamento é bom.

Mas ambos os processos quase pegam toda a RAM disponível e, de fato, as coisas serão assustadoras se o primeiro processo já consumir mais de 50% de RAM e qualquer recarga puder causar a interrupção (ainda não experimentou, mas aumentar o tráfego fará com que acontecer em breve). Isso nos obriga a matar o processo antigo pela força (perdendo conexões antigas) ou ter que manter suficiente RAM (> 50%) disponível o tempo todo (desperdício de recursos).

Eu apreciarei qualquer ajuda / ponteiro neste contexto. Estamos no Ubuntu 12.04 com o haproxy 1.4.18.

    
por Jagbir 19.11.2013 / 18:13

1 resposta

2

Este é um problema bem conhecido. É a razão pela qual nós apoiamos o DLMALLOC. Basta baixá-lo, reconstruir o haproxy e o problema desaparecerá. É isso que estamos usando em nosso appliance (ALOHA) por esse motivo exato . O dlmalloc faz uso de mmap () para alocar memória e suporta furos em seu espaço de endereçamento, então cada chamada para free () fazendo com que pelo menos uma página seja liberada resultará efetivamente em que a página seja liberada. O malloc padrão quase não suporta isto (ele tende a suportá-lo somente quando liberando grandes áreas contíguas), então ele apenas libera memória assim que todas as páginas após esse ponto forem liberadas também. Essa é uma grande diferença.

    
por 19.11.2013 / 19:47