是否查看并清除Postgres缓存/缓冲区?


88

有时我运行一个Postgres查询需要30秒。然后,我立即运行相同的查询,这需要2秒钟。看来Postgres具有某种缓存。我能以某种方式查看该缓存保存了什么吗?我可以强制清除所有缓存以进行调整吗?

注意:我基本上是在寻找以下SQL Server命令的postgres版本:


DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS

但我也想知道如何查看该缓冲区中实际包含的内容。

谢谢你的帮助。

Answers:


59

您可以使用pg_buffercache模块查看PostgreSQL缓冲区高速缓存中的内容。我完成了一个名为“ Inside PostgreSQL Buffer Cache ”的演示,它解释了您所看到的内容,并且显示了一些更复杂的查询来帮助解释随之而来的信息。

在某些系统上也可以查看操作系统缓存,有关示例,请参见pg_osmem.py

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


28
是否可以简单地绕过单个会话中的缓存?我们经常需要对不同的查询进行性能测试,并且这种缓存使很难评估一种方法是否优于另一种方法(比较缓存性能时除外!)
EvilPuppetMaster 2010年

7
无法绕过或刷新数据库的缓存。您可以清除它的所有操作是重新启动服务器。
格雷格·史密斯

2
可想而知,例如在未来的发展中,这将成为可能吗?还是如果要尝试使用当前系统(PG和Linux),这将是不可能的?
Kuberchaun 2011年

9
当使用托管的PostgreSQL安装(例如Amazon RDS)时,无法访问操作系统,并且清空OS缓存以进行测试可能非常困难,因此此功能在PostgreSQL中将非常有益。
Samuli Pahaoja 2014年

4
无法重现缓慢的查询,这是一个问题,如何确定我的查询在调音后是否正在执行?重新启动服务器不是一种选择,我正在测试生产中的查询,因为只有生产具有并发性,锁定和记录才能重现该问题
deFreitas

21

我还没有看到任何刷新PostgreSQL中缓存的命令。您所看到的可能只是从磁盘读取并保存在内存中的普通索引和数据缓存。通过postgresql和操作系统中的缓存。要摆脱所有这些,我知道的唯一方法是:

您应该做的是:

  1. 关闭数据库服务器(pg_ctl,sudo服务postgresql停止等)
  2. echo 3> / proc / sys / vm / drop_caches这将清除OS文件/块缓存-非常重要,尽管我不知道如何在其他OS上执行此操作。
  3. 启动数据库服务器

1
认为有必要注意:如果Postgres的数据目录与'/'所在的卷不在同一卷上,则您可能需要在上述操作之前/之后进行卸载(不确定是哪个)。另外(也许有些巫毒)尝试在这些步骤之前和之后运行“同步”。
2011年

18

格雷格·史密斯(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秒。


15

我在Linux机器上使用以下命令:

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

它完全摆脱了缓存。


2
如果Postgresql版本不是9.0:sudo服务postgresql停止;回声1> / proc / sys / vm / drop_caches; sudo服务postgresql开始
rusllonrails 2015年

@rusllonrails仅在服务名为时才有效postgresql,但事实并非如此。
jpmc26

我认为,sync应该在停止服务器之后,紧接在之前完成drop_caches,因为Postgres可以在停止过程中再次写一些东西。
greatvovan

8

是的,postgresql当然具有缓存。大小由设置shared_buffers控制。除此之外,如先前的答案所述,还使用了OS文件缓存。

如果要查看缓存中的内容,可以使用一个名为pg_buffercache的contrib模块(在contrib /中的源树中,contrib RPM中或适合于其安装方式的任何地方)。标准PostgreSQL文档中列出了如何使用它。

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


7

我有这个错误。

psql:/cygdrive/e/test_insertion.sql:9:错误:参数53(t_stat_gardien)的类型与准备计划时的参数(t_stat_avant)不匹配

我正在寻找刷新当前计划并发现以下内容:

报废计划

我在插入物之间插入了这个,它解决了我的问题。


2
弃用

1
正确的语法是DISCARD PLANS;。并且,如文档所述:“ DISCARD释放与数据库会话关联的内部资源”。
EAmez,

6

是的,可以同时清除共享缓冲区postgres缓存OS缓存。以下是Windows的解决方案...其他人已经给出了Linux解决方案。

正如许多人已经说过的,要清除共享缓冲区,您只需重启Postgres(无需重启服务器)。但是仅执行此操作不会清除操作系统缓存。

要清除Postgres使用的OS缓存,请在停止服务后使用Sysinternals Suite中出色的RamMaphttps://technet.microsoft.com/en-us/sysinternals/rammap)。执行RamMap后,只需在主菜单中单击“空”->“空待机列表”。

重新启动Postgres,由于完全没有缓存,您现在将看到下一个查询缓慢。

您也可以在不关闭Postgres的情况下执行RamMap,并且可能会获得所需的“无缓存”结果,因为正如人们已经说过的那样,共享缓冲区通常与OS缓存相比影响不大。但是为了进行可靠的测试,我宁愿在清除OS缓存以确保之前停止所有postgres。

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

此致Thiago L.


很高兴提供了帮助;)
Thiago Linhares de Oliveira

5

这是我的捷径

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;

5

pg_buffercache模块可以查看shared_buffers缓存。在某个时候,我需要删除缓存以对“冷”缓存进行一些性能测试,因此我编写了一个pg_dropcache扩展来实现此目的。请检查一下。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.