01
A conexão do banco é um recurso caro, não um objeto barato
A camada de acesso a dados da maior parte das aplicações apresenta a conexão como se ela fosse um detalhe de implementação, e o resultado é que quase ninguém sabe quanto ela custa. Numa base relacional que usa processo por conexão, como o PostgreSQL, cada conexão aberta corresponde a um processo do sistema operacional com sua própria área de memória de trabalho, seu próprio cache de catálogo e sua própria participação nas estruturas compartilhadas que o banco precisa varrer a cada snapshot de transação. O número que aparece no arquivo de configuração como limite máximo não é uma trava arbitrária que alguém colocou por precaução: ele é a capacidade que o banco consegue sustentar antes que o custo de coordenar processos passe a consumir mais do que o trabalho útil.
Isso explica o comportamento que confunde quem investiga o incidente pela primeira vez. Enquanto o número de conexões ativas está abaixo do ponto de saturação, adicionar concorrência aumenta a vazão de forma quase linear, e a intuição de que mais conexões significa mais capacidade se confirma. Depois desse ponto, a vazão para de crescer e a latência começa a subir, porque as consultas passam a competir por CPU, por páginas do cache compartilhado e por trilhas de disco. Continuando a adicionar, a vazão cai de verdade, e o sistema entra na região em que mais concorrência produz menos trabalho concluído por segundo. O erro de conexão recusada aparece perto dessa região e é interpretado como falta de conexões, quando na prática ele é o banco recusando entrar num regime onde ninguém sairia ganhando.
VAZAO x CONEXOES ATIVAS (forma tipica)
vazao
^
| .--------.
| .' '-.
| .' '--.
| .' '---.
| .' '----.
| .' '-----
+--+-----------+------------+----------------------> conexoes ativas
A B C
A = subutilizado: adicionar conexao aumenta vazao
B = ponto de saturacao: perto de (nucleos x 2) + discos efetivos
C = colapso: mais conexao, menos trabalho concluido por segundo
O erro "too many clients" aparece em C.
Aumentar o limite move o sistema para a DIREITA de C.Daí vem a conclusão que orienta todo o resto: o limite de conexões não é um teto de segurança que atrapalha, é o mecanismo que impede o banco de entrar em colapso por excesso de concorrência. Aumentar o limite remove a proteção sem adicionar capacidade nenhuma, e transforma um erro rápido e visível, que a aplicação pode tratar, num degrau de latência distribuído por todas as requisições, que ninguém consegue atribuir a nada. O erro de conexão recusada é um sintoma incômodo mas honesto. A alternativa produzida por aumentar o limite é um sistema lento sem culpado aparente.