Tenho o PostgreSQL 15 em execução em um pod do Kubernetes usando a imagem Zalando Spilo, gerenciada pelo Patroni. O contêiner tem um limite de memória de 16 GB e o tamanho do banco de dados é de 40 GB (diretório de dados no disco). Quando reinicializo uma réplica com o Patroni, ele executa "basebackup.sh", que por sua vez executa o comando "pg_basebackup":
/usr/lib/postgresql/15/bin/pg_basebackup --pgdata=/home/postgres/pgdata/pgroot/data -X none --dbname='dbname=postgres user=standby host=<Leader IP> port=5432'
Percebi que os primeiros 16 GB são copiados rapidamente, mas o processo fica significativamente mais lento depois (observei que, após a cópia, o tamanho é aproximadamente igual aos limites de memória do contêiner). Aumentar o limite de memória do contêiner para 32 GB mostrou um padrão semelhante: os primeiros 32 GB foram copiados rapidamente e, em seguida, o processo ficou mais lento.
Executando o comando manualmente:
/usr/lib/postgresql/15/bin/pg_basebackup --pgdata=/home/postgres/pgdata/pgroot/dummy_dir -X none --dbname='dbname=postgres user=standby host=<Leader IP> port=5432'
o problema foi reproduzido. Quando a memória total do contêiner (incluindo cache de páginas e arquivos inativos, que representam uma grande parte da memória RAM do contêiner) atinge o limite, o 'pg_basebackup' fica lento. Outras operações de gravação em disco (por exemplo, gerar e copiar arquivos grandes com 'dd') não são afetadas pelo limite de memória e permanecem rápidas.
Quando 'pg_basebackup' está lento e o limite de memória do contêiner é atingido, tentei descartar o cache de página com: " sync && echo 3 > /proc/sys/vm/drop_caches
" e isso tornou 'pg_basebackup' rápido novamente.
O desempenho do 'pg_basebackup' é limitado pelo cache da página de arquivos? Você precisa de alguma informação adicional? Alguma sugestão? Obrigado pela ajuda!