Entenda como queries maliciosas podem consumir memória inesperadamente no Postgres
Aprofundamento CEVIU
Aprofundamento
A gestão de memória no PostgreSQL é um desafio complexo para equipes de plataforma e DevOps. O parâmetro work_mem, que muitos veem como um limite global para o consumo de memória de uma query, na verdade se aplica por nó de execução e por worker. Isso significa que uma única query pode consumir muito mais memória do que o valor de work_mem multiplicado pelo hash_mem_multiplier, especialmente com paralelismo habilitado, onde cada worker recebe seu próprio orçamento.
Mais crítico ainda são os cenários com queries recursivas que usam UNION. Nesses casos, o PostgreSQL cria tabelas hash para deduplicação de linhas, que não são passíveis de descarregar dados para o disco. Essas estruturas permanecem inteiramente na memória durante toda a execução da query, podendo crescer descontroladamente e levar o banco de dados a esgotar seus recursos, causando falhas graves. Entender o plano de execução com EXPLAIN torna-se fundamental para identificar e otimizar esses gargalos.
O que mudou
A cobertura anterior do CEVIU, em 11 de julho de 2026, com a matéria “PostgreSQL e OOM Killer: A Imperativa Gestão de Memória com Strict Overcommit”, destacou a importância de configurar o controle de memória rigoroso para evitar falhas por falta de memória (OOM). Agora, vemos na prática como diferentes provedores de PostgreSQL gerenciado implementam (ou não) essa prática.
O que era uma recomendação técnica sobre a prevenção de OOMs, agora é uma demonstração de como essa abordagem se traduz em estabilidade de serviço. Provedores como o ClickHouse Managed Postgres desabilitam o “memory overcommit” no kernel e impõem limites rígidos. Isso garante que, mesmo sob queries maliciosas ou ineficientes, o cluster permaneça online, falhando apenas queries individuais com um erro controlado, em vez de derrubar todo o serviço via OOM killer do Linux.
Por que isso importa
A confiabilidade de um banco de dados é crucial para qualquer sistema em produção. Compreender as nuances do gerenciamento de memória do PostgreSQL protege contra panes inesperadas e ajuda a manter a disponibilidade do serviço. Para engenheiros de plataforma, essa análise detalhada oferece ferramentas para diagnosticar problemas de desempenho e evitar que queries mal otimizadas causem degradação ou interrupção do serviço. Isso é vital para a operação contínua e a experiência do usuário.
Linha do tempo
CEVIU News publica 'PostgreSQL e OOM Killer: A Imperativa Gestão de Memória com Strict Overcommit'.
CEVIU News cobre como queries maliciosas podem consumir memória inesperadamente no Postgres.
Perguntas frequentes
Como o parâmetro work_mem funciona no PostgreSQL?
O work_mem define o limite de memória que uma operação interna da query pode usar antes de começar a descarregar dados para o disco. Contudo, esse limite é aplicado por nó de execução e por worker paralelo, não para a query inteira. Uma query complexa com múltiplos nós e workers pode consumir memória muitas vezes maior que o valor configurado.
Por que queries recursivas com UNION são um problema de memória?
Queries recursivas que utilizam UNION (para deduplicação) criam uma tabela hash em memória para rastrear elementos já visitados. Diferente de outros casos de tabelas hash que podem descarregar para disco, esta estrutura precisa estar totalmente em memória durante toda a execução da query, pois a checagem de cada novo elemento depende do conjunto completo. Se o número de elementos for grande, ela pode crescer descontroladamente e levar a falhas de memória.
Como posso mitigar problemas de memória causados por queries no PostgreSQL?
Para mitigar, otimize suas queries com EXPLAIN ANALYZE para entender o plano de execução e identificar operações custosas. Ajuste o work_mem para os valores necessários, mas com cautela, lembrando que ele se aplica por nó/worker. Priorize a reescrita de queries recursivas complexas para evitar o uso excessivo de UNION onde tabelas hash não descarregam para disco. Monitore o consumo de memória do seu servidor e considere a configuração de strict memory overcommit.
O que acontece quando o PostgreSQL esgota a memória disponível?
Quando o PostgreSQL esgota a memória, pode ocorrer um erro out_of_memory (SQLSTATE 53200), que geralmente aborta a transação atual, mas mantém a conexão e o cluster funcionando. Em cenários mais graves, especialmente sem configurações de controle de memória, o OOM killer do sistema operacional pode ser acionado. Ele finaliza processos aleatoriamente para liberar memória, muitas vezes matando um processo PostgreSQL vital e forçando o reinício de todo o cluster, causando minutos de inatividade.
Fontes
- clickhouse.comfonte original
- Categoria
- CEVIU DevOps
- Publicado
- 30 de setembro de 2026
- Editoria
- CEVIU DevOps

