Via pg_proctab()
, posso ver que as conexões da nossa aplicação podem usar até 800 MB de RAM por conexão no postgres. Geralmente até 400 MB. (Atualização para esclarecer após um comentário: essas conexões são de pools de conexões, na maioria das vezes ficam inativas, com consultas entre elas. Os 400 MB são medidos quando a conexão está inativa.)
Gostaria de investigar em que consistem esses 400 MB. Por que 400 MB e não apenas 40 MB, por exemplo? Já olhei os objetos de conexão jdbc no lado da aplicação e não encontrei nada fora do comum.
Meu palpite (maluco) seria que o alto uso de RAM vem do fato de termos muitas partições em nossas tabelas.
O postgres fornece uma maneira de examinar a RAM dos processos de conexões? Estamos no AWS RDS, então o melhor caso seria uma forma em que eu não precisasse de acesso ao servidor.
Primeiro, você deve ter em mente que parte da memória relatada como usada pode ser memória compartilhada de buffers compartilhados, que é compartilhada por todos os processos do banco de dados.
Fora isso, uma
idle
conexão utilizará pouca memória, com as possíveis exceções dememória usada pelo plano de execução em cache de instruções preparadas e instruções em funções PL/pgSQL
memória usada para tabelas temporárias (
temp_buffers
)memória usada pelos
WITH HOLD
cursoresmemória usada pelo cache de metadados (interessante se você tiver muitas tabelas)