Estou executando o pgBouncer na frente de um banco de dados ocupado do postgres 9. Na maioria das vezes, funciona bem. Mas a cada poucas horas recebo um email de erro do meu aplicativo, com uma exceção do psycopg2:
OperationalError ('não foi possível conectar ao servidor: não é possível atribuir o endereço solicitado. O servidor está executando no host "neo-hulk" e aceitando conexões TCP / IP na porta 6432?')
Este é um aplicativo python com um monte de trabalhadores de aipo executando tarefas. Quando esses erros chegam, eu verifico o pgbouncer db e o tamanho da piscina está dentro dos limites. Após algumas experiências, defina o tamanho máximo do pool para 400 e o tamanho do pool para 200. o modo pool é "session" (as solicitações são na maioria confirmadas automaticamente, quase nenhuma transação).
O que faz o pgBouncer 'desaparecer' assim? é apenas por curtos períodos de tempo (e no total estamos falando de uma pequena quantidade de solicitações em comparação com o grande volume de solicitações que está sendo entregue), mas as solicitações que falham são importantes.
Obrigado!
fonte
-vvv
e ver se é possível combinar a saída anômala do log com os erros no tempo.Respostas:
A parte " Não é possível atribuir o endereço solicitado " na mensagem de erro vem da pilha TCP do kernel. Quando encontrado de forma intermitente, isso normalmente significa que o espaço dos soquetes disponíveis está esgotado devido a muitos soquetes no estado de espera (
TIME_WAIT
ou menos provavelmenteFIN_WAIT_1
ouFIN_WAIT_2
)O intervalo de portas de soquete pode ser gerado por
cat /proc/sys/net/ipv4/ip_local_port_range
. O valor padrão em um kernel Linux padrão é geralmente32768 61000
.Você pode verificar o resultado
netstat -ton|grep WAIT
no (s) cliente (s) e no host do pgBouncer quando o sistema estiver ocupado. O-o
sinalizador mostrará os contadores de tempo limite relacionados aos estados de espera.Se o número total de soquetes TCP estiver próximo
61000-32768=28232
, é provável que a exaustão desse intervalo seja seu problema. Como um soquete fechado gasta 60 segundos noTIME_WAIT
estado em condições normais, se um host do cliente se conectar mais de 28232 vezes em um minuto, novas conexões falharão com o erro mencionado até que as portas sejam liberadas.Como primeira solução alternativa, o intervalo de portas TCP pode ser estendido:
Se não for satisfatório, verifique as sinalizações
tcp_tw_recycle
etcp_tw_reuse
, também ajustáveis através de/proc/sys/net/ipv4
esysctl
.Eles são definidos como (de
man tcp
):Pessoalmente, tive sucesso
tcp_tw_recycle
ao enfrentar esse problema com um aplicativo cliente MySQL, mas não tome isso como uma recomendação, pois minha compreensão do TCP é superficial, na melhor das hipóteses.fonte
/etc/sysctl.conf
comonet.ipv4.ip_local_port_range = 1025 65535
ter que persistem entre as reinicializações.