2009-08-01 236 views
55

有时我运行Postgres查询需要30秒。然后,我立即运行相同的查询,它需要2秒钟。看来Postgres有某种缓存。我可以以某种方式查看缓存的内容吗?我可以强制清除所有缓存以进行调整吗?查看并清除Postgres缓存/缓存?

注:基本上,我在寻找一个Postgres版本以下SQL Server命令:


DBCC FREEPROCCACHE 
DBCC DROPCLEANBUFFERS 

但我也想知道怎么看什么是真正包含在缓冲区中。

感谢您的任何帮助。

回答

43

您可以使用pg_buffercache模块查看PostgreSQL缓冲区缓存中的内容。我已经完成了一个名为“Inside the PostgreSQL Buffer Cache”的演示文稿,它解释了您所看到的内容,并展示了一些更复杂的查询以帮助解释与之相关的信息。

也可以在某些系统上查看操作系统缓存,有关一个有点粗略的示例,请参阅pg_osmem.py

无法轻松清除缓存。在Linux上,您可以停止数据库服务器并使用drop_caches工具清除OS缓存;一定要注意那里的警告先运行同步。

+14

是否可以简单地绕过一个会话中的缓存?我们经常需要对不同的查询进行性能测试,并且这种缓存使得评估一种方法是否比另一种更好(除了比较缓存的性能时)是非常困难的。 – EvilPuppetMaster 2010-12-09 02:02:56

+0

谢谢,但是有Postgres SQL命令刷新缓存吗? – 2011-01-14 23:59:14

+4

无法绕过或刷新数据库的缓存。您可以执行的所有操作都是重新启动服务器。 – 2011-01-22 15:24:30

16

我还没有看到任何命令刷新PostgreSQL中的缓存。你看到的可能只是正常的索引和数据缓存从磁盘读取并保存在内存中。通过postgresql和操作系统中的缓存。为了摆脱这一切,我知道的唯一途径:

你应该做的是:

  1. 关闭数据库服务器(pg_ctl,须藤服务的PostgreSQL停止, 等)
  2. 回声3>/proc/sys/vm/drop_caches 这将清除OS文件/块缓存 - 非常重要,但我不知道如何在其他操作系统上执行此操作。
  3. 启动数据库服务器
+1

认为这将是有益的注意:如果Postgres的数据目录是不一样的卷上‘/’安装,您可能需要之前卸除/上述操作后, (不确定哪个,真的)。另外(也许有点巫术)尝试在这些步骤之前和之后运行“同步”。 – marqueed 2011-11-04 07:01:58

5

是和PostgreSQL肯定有缓存。大小由设置shared_buffers控制。除此之外,正如前面的回答所提到的那样,OS文件缓存也被使用。

如果你想看看有什么在缓存中,有一个名为pg_buffercache可用的contrib模块(contrib请/在源代码树,在contrib RPM,或任何适合您如何安装)。如何使用它在标准的PostgreSQL文档中列出。

除了重启服务器之外,没有办法清除缓冲区缓存。您可以使用其他答案中提到的命令删除操作系统缓存 - 只要您的操作系统是Linux。

11

我在我的Linux系统中使用这个命令:

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

它彻底摆脱了缓存。

6

我有这个错误。

psql:/cygdrive/e/test_insertion.sql:9: ERROR: type of parameter 53 (t_stat_gardien) does not match that when preparing the plan (t_stat_avant)

我一直在寻找冲洗当前计划和发现这一点:

DISCARD PLAN

我有我的这个插件之间,它解决了我的问题。

6

Greg Smith对drop_caches的回答非常有帮助。我发现除了删除缓存之外,还需要停止并启动postgresql服务。这是一个可以实现这个技巧的shell脚本。 (我的环境是Ubuntu的14.04和PostgreSQL 9.3。)

#!/usr/bin/sudo bash 

service postgresql stop 
sync 
echo 3 > /proc/sys/vm/drop_caches 
service postgresql start 

我与花19秒所述第一时间,以及小于2秒后续尝试查询测试。运行此脚本后,查询再次花费19秒。

3

这是我的快捷

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; 
3

pg_buffercache模块寻找到shared_buffers缓存。在某些时候,我需要放弃缓存来对'冷'缓存进行一些性能测试,所以我写了一个pg_dropcache扩展,完成这个。请检查一下。

3

是的,可以清除共享缓冲区postgres缓存 OS缓存。解决方案波纹管是针对Windows ...其他人已经提供了Linux解决方案。

正如许多人已经说了,要明确你可以重新启动的Postgres(无需重新启动服务器)的共享缓存。但只是这样做不会清除操作系统缓存。

要清除Postgres所使用操作系统的缓存,停止服务后,使用该外观极好RAMMAPhttps://technet.microsoft.com/en-us/sysinternals/rammap),从外观极好的Sysinternals Suite。 一旦你执行RamMap,只需点击主菜单中的“Empty” - >“Empty Standby List”。

重新启动Postgres,你会看到现在你的下一个查询将由于没有缓存而变得缓慢。

您也可以执行RAMMAP而不关闭Postgres的,而且很可能会有“不缓存”结果,你想要的,因为人们已经说过,共享缓存相比,操作系统的缓存通常给人的影响很小。但是对于可靠的测试,我宁愿在清除OS缓存之前停止postgres以确保。

注意:AFAIK,在使用RamMap时,我不建议您清除“备用列表”以外的其他内容,因为其他数据在某种程度上正在被使用,如果您这样做,您可能会导致问题/数据丢失。请记住,您正在清除内存,不仅可以使用postgres文件,还可以使用其他应用程序和操作系统。

问候,蒂亚戈L.