Hoje tivemos um pequeno problema de failover com uma de nossas VMs HAProxy. Quando nos aprofundamos, descobrimos o seguinte:
26 de janeiro 07:41:45 Kernel haproxy2: [226818.070059] __ratelimit: 10 retornos de chamada suprimidos 26 de janeiro 07:41:45 kernel haproxy2: [226818.070064] Memória insuficiente de soquete 26 de janeiro 07:41:47 kernel do haproxy2: [226819.560048] Memória insuficiente 26 de janeiro 07:41:49 kernel haproxy2: [226822.030044] Memória insuficiente
O que, por esse link , aparentemente tem a ver com as configurações padrão baixas para net.ipv4.tcp_mem
. Portanto, aumentamos em 4x os padrões (esse é o Ubuntu Server, não tenho certeza se o sabor do Linux é importante):
os valores atuais são: 45984 61312 91968 novos valores são: 183936 245248 367872
Depois disso, começamos a ver uma mensagem de erro bizarra:
26 de janeiro 08:18:49 haproxy1 kernel: [2291.579726] Rota da cadeia de hash por muito tempo! 26 de janeiro 08:18:49 kernel haproxy1: [2291.579732] Ajuste seu secret_interval!
Shh .. é um segredo !!
Aparentemente, isso tem a ver com o /proc/sys/net/ipv4/route/secret_interval
padrão de 600 e controla a liberação periódica do cache de rota
Ele
secret_interval
instrui o kernel com que freqüência remover TODAS as entradas de hash da rota, independentemente de quão novas / antigas elas sejam. Em nosso ambiente, isso geralmente é ruim. A CPU estará ocupada reconstruindo milhares de entradas por segundo sempre que o cache for limpo. No entanto, configuramos isso para funcionar uma vez por dia para manter vazamentos de memória (embora nunca tivéssemos um).
Embora tenhamos prazer em reduzir isso, parece estranho recomendar a remoção de todo o cache da rota em intervalos regulares , em vez de simplesmente empurrar valores antigos para fora do cache da rota mais rapidamente.
Após algumas investigações, descobrimos /proc/sys/net/ipv4/route/gc_elasticity
qual parece ser uma opção melhor para manter o tamanho da tabela de rotas sob controle:
gc_elasticity
pode ser melhor descrito como a profundidade média do bucket que o kernel aceitará antes de começar a expirar as entradas de hash da rota. Isso ajudará a manter o limite superior das rotas ativas.
Ajustamos a elasticidade de 8 para 4, na esperança de que o cache da rota se recuperasse de forma mais agressiva. O secret_interval
não parece correto para nós. Mas há várias configurações e não está claro qual é o caminho certo a seguir.
- / proc / sys / net / ipv4 / route / gc_elasticity (8)
- / proc / sys / net / ipv4 / route / gc_interval (60)
- / proc / sys / net / ipv4 / route / gc_min_interval (0)
- / proc / sys / net / ipv4 / route / gc_timeout (300)
- / proc / sys / net / ipv4 / route / secret_interval (600)
- / proc / sys / net / ipv4 / route / gc_thresh (?)
- rhash_entries (parâmetro do kernel, padrão desconhecido?)
Nós não queremos fazer o Linux roteamento pior , por isso estamos espécie de medo de mexer com algumas dessas configurações.
Alguém pode aconselhar quais parâmetros de roteamento são melhores para ajustar, para uma instância HAProxy de alto tráfego?
/proc/sys/net/ipv4/tcp_max_orphans
você experimentará um erro diferente. A pilha inteira do Stack Exchange, por exemplo, possui/proc/sys/net/ipv4/tcp_max_orphans
65536 e/proc/net/sockstat
resulta em TCP: inuse 2996 órfão 171 tw 15972 aloca 2998 mem 1621 - uma diferença que não pode ser ignorada.Ajustamos alguns desses parâmetros regularmente. Nosso padrão para plataformas de negociação de alta produtividade e baixa latência é:
fonte