Gostaria de saber como otimizar o uso de RAM do meu banco de dados PostgreSQL implantado no Kubernetes.
Particularmente estou interessado em configurar os valores shared_buffers
e effective_cache_size
.
Normalmente, a recomendação declarada por várias fontes é usar:
Se você tiver um sistema com 1 GB ou mais de RAM, um valor inicial razoável para shared_buffers é 1/4 da memória em seu sistema. Se você tiver menos RAM, terá que considerar com mais cuidado a quantidade de RAM que o sistema operacional está ocupando; perto de 15% é mais típico lá. Existem algumas cargas de trabalho em que configurações ainda maiores para shared_buffers são eficazes, mas, como o PostgreSQL também depende do cache do sistema operacional, é improvável que você ache que usar mais de 40% de RAM funcione melhor do que uma quantidade menor. ( site PostgreSQL )
O valor deve ser definido de 15% a 25% da RAM total da máquina ( site EDB )
Não mais que 50% da RAM disponível ( ajuste EDB PostgreSQL )
Como os contêineres usam muito menos RAM em segundo plano, qual seria uma boa recomendação para definir o valor shared_buffers?
No momento, o valor está definido para 25% (1 GB do limite total de contêiner de 4 GB) e noto que ele é preenchido rapidamente.
shared_buffers vs. tamanho de cache efetivo
Dentro do ajuste do postgresql, esses dois números representam:
Portanto, consultas repetidas que são armazenadas em cache funcionarão "melhor" se houver muitos shared_buffers. Mas a leitura de tabelas do disco subjacente ao banco de dados funcionará "melhor" se houver mais Effective_cache_size
Se a carga de trabalho for tão variada e não repetitiva que leituras de disco repetidas são necessárias, então um tamanho_de_cache_de_cache mais alto é melhor. Se houver muitas consultas iguais em um pequeno conjunto, mais shared_buffers é melhor
Vale a pena lembrar que em um sistema Linux funcionando normalmente, o sistema pegará qualquer memória "ociosa" para cache de disco, com base em que leituras inesperadas podem acontecer e, se fizerem isso, a memória não utilizada pode acelerá-las
Como descobrir quais configurações são melhores
Vale a pena mencionar que o "método" mais usado é simplesmente não se importar e provisionar em excesso a memória usada. O hardware é barato e o tempo para resolvê-lo corretamente é caro. Dito isto..
Existem duas abordagens
Para monitorar a memória no prod, geralmente isso é feito com um pacote de terceiros, como cAdvisor ou Prometheus
Observe os gráficos e compare-os com as solicitações recebidas. Se houver claramente muito espaço para a cabeça, aumente os parâmetros e veja se isso ajuda na eficiência do sistema.
Para testes, essencialmente você faz a mesma coisa, mas usando uma carga de trabalho de teste artificial
Para descobrir quais são os melhores tamanhos de memória, existem ferramentas automatizadas como o senpai . Basicamente, eles executarão uma carga de trabalho de teste repetidamente em várias configurações de memória até que ela pare