有时我运行一个Postgres查询需要30秒。然后,我立即运行相同的查询,这需要2秒钟。看来Postgres具有某种缓存。我能以某种方式查看该缓存保存了什么吗?我可以强制清除所有缓存以进行调整吗?
注意:我基本上是在寻找以下SQL Server命令的postgres版本:
DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS
但我也想知道如何查看该缓冲区中实际包含的内容。
谢谢你的帮助。
Answers:
您可以使用pg_buffercache模块查看PostgreSQL缓冲区高速缓存中的内容。我完成了一个名为“ Inside PostgreSQL Buffer Cache ”的演示,它解释了您所看到的内容,并且显示了一些更复杂的查询来帮助解释随之而来的信息。
在某些系统上也可以查看操作系统缓存,有关示例,请参见pg_osmem.py。
无法轻松清除缓存。在Linux上,您可以停止数据库服务器并使用drop_caches工具清除OS缓存。请务必留意那里的警告以先运行同步。
我还没有看到任何刷新PostgreSQL中缓存的命令。您所看到的可能只是从磁盘读取并保存在内存中的普通索引和数据缓存。通过postgresql和操作系统中的缓存。要摆脱所有这些,我知道的唯一方法是:
您应该做的是:
格雷格·史密斯(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秒。
我在Linux机器上使用以下命令:
sync; /etc/init.d/postgresql-9.0 stop; echo 1 > /proc/sys/vm/drop_caches; /etc/init.d/postgresql-9.0 start
它完全摆脱了缓存。
postgresql
,但事实并非如此。
sync
应该在停止服务器之后,紧接在之前完成drop_caches
,因为Postgres可以在停止过程中再次写一些东西。
是的,postgresql当然具有缓存。大小由设置shared_buffers控制。除此之外,如先前的答案所述,还使用了OS文件缓存。
如果要查看缓存中的内容,可以使用一个名为pg_buffercache的contrib模块(在contrib /中的源树中,contrib RPM中或适合于其安装方式的任何地方)。标准PostgreSQL文档中列出了如何使用它。
除了重新启动服务器之外,没有其他方法可以清除缓冲区高速缓存。您可以使用其他答案中提到的命令删除操作系统缓存-如果您的操作系统是Linux。
是的,可以同时清除共享缓冲区postgres缓存和OS缓存。以下是Windows的解决方案...其他人已经给出了Linux解决方案。
正如许多人已经说过的,要清除共享缓冲区,您只需重启Postgres(无需重启服务器)。但是仅执行此操作不会清除操作系统缓存。
要清除Postgres使用的OS缓存,请在停止服务后使用Sysinternals Suite中出色的RamMap(https://technet.microsoft.com/en-us/sysinternals/rammap)。执行RamMap后,只需在主菜单中单击“空”->“空待机列表”。
重新启动Postgres,由于完全没有缓存,您现在将看到下一个查询缓慢。
您也可以在不关闭Postgres的情况下执行RamMap,并且可能会获得所需的“无缓存”结果,因为正如人们已经说过的那样,共享缓冲区通常与OS缓存相比影响不大。但是为了进行可靠的测试,我宁愿在清除OS缓存以确保之前停止所有postgres。
注意:AFAIK,我不建议在使用RamMap时清除“待机列表”之外的其他内容,因为其他数据正在以某种方式被使用,如果这样做,可能会导致问题/数据丢失。请记住,您不仅要清除postgres文件使用的内存,还清除所有其他应用程序和操作系统的内存。
此致Thiago L.
有pg_buffercache
模块可以查看shared_buffers
缓存。在某个时候,我需要删除缓存以对“冷”缓存进行一些性能测试,因此我编写了一个pg_dropcache扩展来实现此目的。请检查一下。