Às vezes, executo uma consulta do Postgres que leva 30 segundos. Então, eu executo imediatamente a mesma consulta e leva 2 segundos. Parece que o Postgres tem algum tipo de cache. Posso ver de alguma forma o que esse cache está segurando? Posso forçar a limpeza de todos os caches para fins de ajuste?
Nota: Basicamente, estou procurando uma versão postgres do seguinte comando do SQL Server:
DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS
Mas também gostaria de saber o que realmente está contido nesse buffer.
Obrigado por qualquer ajuda.
fonte
Não vi nenhum comando para liberar os caches no PostgreSQL. O que você vê provavelmente é apenas um índice normal e caches de dados sendo lidos do disco e mantidos na memória. pelo postgresql e pelos caches no sistema operacional. Para me livrar de tudo isso, da única maneira que conheço:
O que você deve fazer é:
sudo service postgresql stop
,sudo systemctl stop postgresql
, etc.)echo 3 > /proc/sys/vm/drop_caches
Isso limpará os caches de arquivo / bloqueio do SO - muito importante, embora eu não saiba como fazer isso em outros SOs. (Em caso de permissão negada, tentesudo sh -c "echo 3 > /proc/sys/vm/drop_caches"
como na pergunta )sudo service postgresql start
,sudo systemctl start postgresql
)fonte
A resposta de Greg Smith sobre drop_caches foi muito útil. Achei necessário parar e iniciar o serviço postgresql, além de descartar os caches. Aqui está um script de shell que faz o truque. (Meu ambiente é Ubuntu 14.04 e PostgreSQL 9.3.)
#!/usr/bin/sudo bash service postgresql stop sync echo 3 > /proc/sys/vm/drop_caches service postgresql start
Testei com uma consulta que levou 19 segundos na primeira vez e menos de 2 segundos nas tentativas subsequentes. Depois de executar esse script, a consulta mais uma vez levou 19 segundos.
fonte
Eu uso este comando na minha máquina Linux:
sync; /etc/init.d/postgresql-9.0 stop; echo 1 > /proc/sys/vm/drop_caches; /etc/init.d/postgresql-9.0 start
Ele elimina completamente o cache.
fonte
postgresql
, o que pode não ser o caso.sync
deve ser feito depois de parar o servidor, imediatamente antesdrop_caches
, pois o Postgres pode escrever algo durante o processo de parada novamente.Sim, o postgresql certamente tem cache. O tamanho é controlado pela configuração shared_buffers . Fora isso, existe como a resposta anterior menciona, o cache de arquivos do sistema operacional que também é usado.
Se você quiser ver o que está no cache, existe um módulo contrib chamado pg_buffercache disponível (em contrib / na árvore de código-fonte, no RPM contrib ou onde for apropriado para como você o instalou). Como usá-lo está listado na documentação padrão do PostgreSQL.
Não há maneiras de limpar o cache do buffer, a não ser reiniciar o servidor. Você pode descartar o cache do sistema operacional com o comando mencionado na outra resposta - desde que seu sistema operacional seja Linux.
fonte
Eu tive esse erro.
Eu estava procurando esvaziar o plano atual e encontrei isto:
PLANOS DE DESCARTE
Tive isso entre minhas inserções e resolve meu problema.
fonte
DISCARD PLANS;
. E, como afirma a documentação: "DISCARD libera recursos internos associados a uma sessão de banco de dados ".Sim, é possível limpar o cache postgres de buffers compartilhados E o cache do sistema operacional. A solução abaixo é para Windows ... outros já deram a solução para Linux.
Como muitas pessoas já disseram, para limpar os buffers compartilhados basta reiniciar o Postgres (não é necessário reiniciar o servidor). Mas apenas fazer isso não limpará o cache do sistema operacional.
Para limpar o cache do sistema operacional usado pelo Postgres, após interromper o serviço, use o excelente RamMap ( https://technet.microsoft.com/en-us/sysinternals/rammap ), do excelente Sysinternals Suite. Depois de executar o RamMap, clique em "Esvaziar" -> "Lista de espera vazia" no menu principal.
Reinicie o Postgres e você verá agora que sua próxima consulta será muito lenta devido à falta de cache.
Você também pode executar o RamMap sem fechar o Postgres, e provavelmente terá os resultados "sem cache" que deseja, visto que, como as pessoas já disseram, os buffers compartilhados geralmente dão pouco impacto em comparação com o cache do sistema operacional. Mas, para um teste confiável, prefiro parar o postgres antes de limpar o cache do sistema operacional para ter certeza.
Nota: AFAIK, não recomendo limpar as outras coisas além da "Lista de espera" ao usar o RamMap, porque os outros dados estão de alguma forma sendo usados e você pode causar problemas / dados perdidos se fizer isso. Lembre-se de que você está limpando a memória usada não apenas pelos arquivos do postgres, mas também por qualquer outro aplicativo e sistema operacional.
Atenciosamente, Thiago L.
fonte
este é o meu atalho
echo 1 > /proc/sys/vm/drop_caches; echo 2 > /proc/sys/vm/drop_caches; echo 3 > /proc/sys/vm/drop_caches; rcpostgresql stop; rcpostgresql start;
fonte
Existe um
pg_buffercache
módulo para examinar oshared_buffers
cache. E em algum ponto eu precisei descartar o cache para fazer alguns testes de desempenho no cache 'frio', então escrevi uma extensão pg_dropcache que faz exatamente isso. Por favor, confira.fonte
Se você tiver um banco de dados de teste dedicado, pode definir o parâmetro: buffers compartilhados para 16. Isso deve desabilitar o cache para todas as consultas.
fonte