Este documento aborda como identificar o uso elevado de memória nas instâncias do Cloud SQL e fornece recomendações sobre como resolver problemas relacionados à memória.
Para saber como configurar o uso de memória em uma instância do Cloud SQL, consulte Práticas recomendadas para gerenciar o uso de memória.
Identificar o uso elevado da memória
Usar o Metrics Explorer para identificar o uso da memória
Você pode analisar o uso de memória da instância com a métrica database/memory/components.usage
no Metrics Explorer.
Usar Query Insights para analisar o plano de explicação de consultas que consomem muitos recursos
O Query Insights ajuda a detectar, diagnosticar e evitar problemas de desempenho relacionados aos bancos de dados do Cloud SQL. O Query Insights oferece uma lista de consultas de longa duração com o plano de explicação (documentação do PostgreSQL). Revise o plano de explicação e identifique a parte da consulta que tem um método de verificação de alto uso da memória. Independentemente do ambiente de execução da consulta, o Query Insights apresenta o plano de explicação para todas as consultas. Identifique as consultas complexas que estão demorando mais para saber quais consultas estão bloqueando a memória por durações maiores.
Os métodos comuns de verificação do PostgreSQL que usam muita memória incluem:
- Verificação de heap de bitmap
- Classificação rápida
- Hash ou mesclagem de hash
Alto uso da memória e registros relevantes para instâncias com o Gemini ativado
Se o Gemini estiver ativado, em vez de uma falha por falta de memória (OOM, na sigla em inglês), que leva à inatividade do banco de dados, uma conexão que executa uma consulta com alto uso da memória será encerrada, evitando a inatividade do banco de dados. Para identificar a consulta padrão, verifique os registros do banco de dados quanto às seguintes entradas:
(...timestamp….) db=postgres, user=customer FATAL: terminating connection due to administrator command
O seguinte registro do banco de dados do Cloud SQL para PostgreSQL é exibido e captura a consulta de alto uso da memória que foi encerrada para evitar OOM. A consulta é uma versão normalizada da consulta original:
db=postgres,user=customer LOG: postgres process with PID 1734 for the query "SELECT COUNT(product) AS item_count FROM test_table WHERE product_type = $1 AND product LIKE $2 AND c6_2 IN ($3,$4,$5,$6,$7)" has been cancelled.
Na página Instâncias do Cloud SQL, as notificações dos eventos a seguir também são exibidas:
- Uso da memória da instância nas últimas 24 horas.
- Lista de consultas normalizadas que foram canceladas nas últimas 24 horas.
- Um link para a documentação do Google sobre como otimizar o uso da memória.
Uso de memória alto: recomendações
As recomendações a seguir abordam os problemas comuns relacionados à memória.
Se a instância continuar usando uma quantidade alta de memória, isso terá uma chance alta de acabar causando um problema out of memory
.
Se as demandas de memória do PostgreSQL ou de outro processo fizerem com que o sistema fique sem memória, você verá uma mensagem do kernel Out of Memory
nos registros do PostgreSQL e a instância do PostgreSQL será interrompida.
Exemplo:
Out of Memory: Killed process 12345 (postgres)
A instância mais comum com um problema de OOM é quando há um valor maior de work_mem
com um número alto de conexões ativas.
Portanto, se você encontrar OOMs frequentes ou quiser evitar OOMs na sua instância do Cloud SQL para PostgreSQL, siga estas recomendações:
Definir
work_mem
As consultas que usam a ordenação rápida são mais velozes do que aquelas que usam a ordenação de fusão externa. No entanto, a primeira pode levar ao esgotamento da memória. Para resolver esse problema, defina o valor
work_mem
razoável o suficiente para equilibrar as duas operações de ordenação que acontecem na memória e no disco. Considere também definir awork_mem
no nível da sessão, em vez de defini-la para uma instância inteira.Monitorar as sessões ativas
Cada conexão usa uma certa quantidade de memória. Use a consulta a seguir para verificar a contagem de conexões ativas:
SELECT state, usename, count(1) FROM pg_stat_activity WHERE pid <> pg_backend_pid() GROUP BY state, usename ORDER BY 1;
Se você tiver um número grande de sessões ativas, analise a causa raiz desse número alto, como bloqueios de transação.
Definir
shared_buffers
Se
shared_buffers
for definido com um valor maior, diminua o valor deshared_buffers
para que a memória possa ser usada para outras operações, comowork_mem
, ou para estabelecer novas conexões.Proporção de ocorrência em cache
Em geral, o PostgreSQL tenta manter no cache os dados acessados com mais frequência. Quando os dados forem solicitados por um cliente, se eles já estiverem armazenados em cache com buffers compartilhados, eles serão fornecidos diretamente ao cliente. Isso é chamado de ocorrência em cache. Se os dados não estiverem presentes em buffers compartilhados, primeiro eles serão buscados em buffers compartilhados de um disco e, em seguida, fornecidos ao cliente. Isso é chamado de ausência no cache. A proporção de ocorrência em cache mede quantas solicitações de conteúdo o cache processou em comparação com as solicitações recebidas. Execute a consulta a seguir para verificar a proporção de ocorrência em cache em relação às solicitações de tabela na instância do PostgreSQL:
SELECT sum(heap_blks_read) as heap_read, sum(heap_blks_hit) as heap_hit, sum(heap_blks_hit) / (sum(heap_blks_hit) + sum(heap_blks_read)) as ratio FROM pg_statio_user_tables;
Execute a consulta a seguir para verificar a proporção de ocorrência em cache em relação às solicitações de índice na instância do PostgreSQL:
SELECT sum(idx_blks_read) as idx_read, sum(idx_blks_hit) as idx_hit, (sum(idx_blks_hit) - sum(idx_blks_read)) / sum(idx_blks_hit) as ratio FROM pg_statio_user_indexes;
Geralmente, uma proporção de ocorrência em cache com valor de 95 a 99% é considerada boa.
Ativar páginas enormes Por padrão, o Cloud SQL para PostgreSQL tem
huge_pages
ativado para melhorar o gerenciamento de memória. Recomendamos que você o ative. Para saber mais sobre ohuge_pages
, consulte a documentação do PostreSQL.Definir
max_locks_per_transaction
O valor
max_locks_per_transaction
indica o número de objetos do banco de dados que podem ser bloqueados simultaneamente. Na maioria dos casos, o valor padrão de 64 é suficiente. No entanto, se você estiver lidando com um conjunto de dados grande, poderá ter OOMs. Considere aumentar o valor demax_locks_per_transaction
alto o suficiente para evitar OOMs.O valor de
max_locks_per_transaction
precisa sermax_locks_per_transaction
* (max_connections
+max_prepared_transactions
) objetos. Isso significa que, se você tiver 300 mil objetos e o valor demax_connections
for 200,max_locks_per_transaction
será 1.500.Definir
max_pred_locks_per_transaction
A transação pode falhar quando você tem clientes que usam várias tabelas diferentes em uma única transação serializável. Nesse cenário, considere aumentar
max_pred_locks_per_transaction
para um valor razoavelmente alto. Assim comomax_locks_per_transaction
,max_pred_locks_per_transaction
também usa a memória compartilhada. Portanto, não defina um valor excessivamente alto.Se o uso da memória ainda for alto e você achar que as consultas são tráfego legítimo, considere aumentar o número de recursos de memória na sua instância para evitar falha ou inatividade do banco de dados.