Ver e limpar caches / buffers do Postgres?

Às vezes executo uma consulta do Postgres em 30 segundos. Então, eu imediatamente executo a mesma consulta e leva 2 segundos. Parece que o Postgres tem algum tipo de cache. Posso de alguma forma ver o que esse cache está segurando? Posso forçar todos os caches a serem limpos para fins de ajuste?

Nota: Estou basicamente procurando uma versão postgres do seguinte comando do SQL Server:

DBCC FREEPROCCACHE DBCC DROPCLEANBUFFERS 

Mas também gostaria de saber como ver o que está realmente contido nesse buffer.

Obrigado por qualquer ajuda.

Você pode ver o que está no cache de buffer do PostgreSQL usando o módulo pg_buffercache. Eu fiz uma apresentação chamada ” Inside the PostgreSQL Buffer Cache ” que explica o que você está vendo, e eu mostro algumas consultas mais complicadas para ajudar a interpretar as informações que acompanham isso.

Também é possível ver o cache do sistema operacional em alguns sistemas, veja pg_osmem.py para um exemplo um tanto grosseiro.

Não há como limpar os caches facilmente. No Linux, você pode parar o servidor de database e usar o recurso drop_caches para limpar o cache do SO; certifique-se de ouvir o aviso lá para executar a synchronization primeiro.

Eu não vi nenhum comando para liberar os caches no PostgreSQL. O que você vê é provavelmente apenas caches de dados e índices normais sendo lidos do disco e retidos na memory. pelo postgresql e os caches no sistema operacional. Para se livrar de tudo isso, a única maneira que conheço é:

O que você deve fazer é:

  1. Desligue o servidor de database (pg_ctl, sudo service postgresql stop, etc.)
  2. echo 3> / proc / sys / vm / drop_caches Isso limpará os caches de arquivos / blocos do sistema operacional – muito importante, embora eu não saiba como fazer isso em outros sistemas operacionais.
  3. Inicie o servidor do database

Eu uso este comando na minha checkbox linux:

 sync; /etc/init.d/postgresql-9.0 stop; echo 1 > /proc/sys/vm/drop_caches; /etc/init.d/postgresql-9.0 start 

Ele se livra completamente do cache.

A resposta de Greg Smith sobre drop_caches foi muito útil. Eu 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 

Eu testei com uma consulta que levou 19 segundos na primeira vez e menos de 2 segundos nas tentativas subseqüentes. Depois de executar esse script, a consulta novamente levou 19 segundos.

Eu tive esse erro.

psql: /cygdrive/e/test_insertion.sql: 9: ERRO: o tipo de parâmetro 53 (t_stat_gardien) não corresponde àquele ao preparar o plano (t_stat_avant)

Eu estava procurando por liberar o plano atual e achei isso:

PLANO DE DESCARTE

Eu tive isso entre minhas inserções e isso resolve o meu problema.

Sim, o postgresql certamente tem armazenamento em cache. O tamanho é controlado pela configuração shared_buffers . Fora isso, há como a resposta anterior menciona, o cache de arquivos do sistema operacional que também é usado.

Se você quiser ver o que há no cache, há um módulo contrib chamado pg_buffercache disponível (em contrib / na tree 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 de buffer, exceto para 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.

esse é 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; 

Existe o módulo pg_buffercache para procurar no cache shared_buffers . E em algum momento eu precisei deixar cair o cache para fazer alguns testes de desempenho no cache ‘frio’ então eu escrevi uma extensão pg_dropcache que faz exatamente isso. Por favor, confira.

Sim, é possível limpar os buffers compartilhados do cache postgres E do cache do sistema operacional. A solução abaixo é para o Windows … outros já deram a solução linux.

Como muitas pessoas já disseram, para limpar os buffers compartilhados, basta reiniciar o Postgres (não é necessário reiniciar o servidor). Mas apenas fazendo isso não vai limpar o cache do sistema operacional.

Para limpar o cache do sistema operacional usado pelo Postgres, após parar o serviço, use o excelente RamMap ( https://technet.microsoft.com/en-us/sysinternals/rammap ), no excelente Sysinternals Suite. Depois de executar o RamMap, basta clicar em “Empty” -> “Empty Standby List” no menu principal.

Reinicie o Postgres e você verá que sua próxima consulta será lenta devido a nenhum cache.

Você também pode executar o RamMap sem fechar o Postgres, e provavelmente terá o resultado “sem cache” que você quer, já que como as pessoas já disseram, os buffers compartilhados geralmente causam pouco impacto comparado ao cache do sistema operacional. Mas para um teste confiável, eu prefiro parar o postgres como todos antes de limpar o cache do sistema operacional para ter certeza.

Nota: AFAIK, eu não recomendo limpar as outras coisas além da “lista de espera” ao usar o RamMap, porque os outros dados estão sendo usados ​​de alguma forma, e você pode causar problemas / dados soltos se você fizer isso. Lembre-se de que você está limpando a memory não apenas usada por arquivos postgres, mas também por qualquer outro aplicativo e sistema operacional.

Atenciosamente, Thiago L.