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

Use*_*er1 75 postgresql optimization

有时我运行Postgres查询需要30秒.然后,我立即运行相同的查询,需要2秒.似乎Postgres有某种缓存.我可以以某种方式看到缓存持有什么?我是否可以强制清除所有缓存以进行调整?

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


DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS
Run Code Online (Sandbox Code Playgroud)

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

谢谢你的帮助.

Gre*_*ith 55

您可以使用pg_buffercache模块查看PostgreSQL缓冲区缓存中的内容.我做了一个名为" Inside the PostgreSQL Buffer Cache " 的演示文稿,它解释了你所看到的内容,并展示了一些更复杂的查询来帮助解释随之而来的信息.

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

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

  • 是否可以在单个会话中简单地绕过缓存?我们经常需要对不同的查询进行性能测试,这种缓存很难评估一种方法是否优于另一种方法(除非比较缓存的性能!) (25认同)
  • 当使用托管的PostgreSQL安装(如Amazon RDS)时,无法访问操作系统,并且为了测试目的而清空操作系统缓存非常困难,因此这个功能在PostgreSQL中非常有用. (8认同)
  • 无法绕过或刷新数据库的缓存.您只需重新启动服务器即可清除它. (6认同)
  • 可以想象这可以成为可能,例如在未来的发展中吗?或者这只是当前系统(PG和Linux)不可能的话,如果要尝试一下? (2认同)
  • 无法重现慢速查询,这是一个问题,如何确定我的查询在调音后是否正在执行?重新启动服务器不是一种选择,我正在测试生产中的查询,因为只有生产具有并发性,锁和记录足以重现该问题 (2认同)

Lee*_*roy 20

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

你应该做的是:

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

  • 认为注意到这一点会很有帮助:如果 Postgres 的数据目录与“/”安装的卷不在同一个卷上,则您可能需要在上述操作之前/之后卸载(实际上不确定是哪个)。另外(也许有点巫毒)尝试在这些步骤之前和之后运行“同步”。 (2认同)

Mik*_*rov 15

我在我的linux盒子上使用这个命令:

sync; /etc/init.d/postgresql-9.0 stop; echo 1 > /proc/sys/vm/drop_caches; /etc/init.d/postgresql-9.0 start
Run Code Online (Sandbox Code Playgroud)

它完全摆脱了缓存.

  • 如果Postgresql版本不是9.0:sync; sudo service postgresql stop; echo 1>/proc/sys/vm/drop_caches; sudo服务postgresql启动 (2认同)

Ste*_*rta 11

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
Run Code Online (Sandbox Code Playgroud)

我使用第一次花费19秒的查询进行测试,并且在后续尝试中花费不到2秒.运行此脚本后,查询再次耗时19秒.


Luc*_*c M 7

我有这个错误.

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

我正在寻找冲洗当前的计划,并发现了这个:

丢弃计划

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

  • 放弃计划没有解决我,查询看起来缓存了 (2认同)
  • 正确的语法是“DISCARD PLANS;”。并且,正如文档所述:“DISCARD 释放与**数据库会话**相关的内部资源”。 (2认同)

Mag*_*der 6

是的,postgresql肯定有缓存.大小由shared_buffers设置控制.除此之外,还有前面提到的答案,也使用了OS文件缓存.

如果你想查看缓存中的内容,可以使用一个名为pg_buffercache的contrib模块(在contrib /中,在contrib树中,在contrib RPM中,或者在适合你安装它的地方).如何使用它列在标准的PostgreSQL文档中.

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


小智 6

是的,可以清除共享缓冲区postgres缓存 OS缓存.解决方案贝娄是针对Windows ...其他人已经给出了Linux解决方案.

正如许多人已经说过的,要清除共享缓冲区,您只需重启Postgres(无需重启服务器).但这样做不会清除操作系统缓存.

要清除Postgres使用的操作系统缓存,请在停止服务后使用优秀的Sysinternals Suite中的优秀RamMap(https://technet.microsoft.com/en-us/sysinternals/rammap).执行RamMap后,只需在主菜单中单击"清空" - >"清空待机列表".

重新启动Postgres,你会看到由于没有缓存,你的下一个查询将会很慢.

你也可以在不关闭Postgres的情况下执行RamMap,并且可能会有你想要的"无缓存"结果,因为正如人们已经说过的,与OS缓存相比,共享缓冲区通常没什么影响.但是对于可靠的测试,我宁愿在清除操作系统缓存之前停止postgres以确保.

注意:AFAIK,我不建议在使用RamMap时清除除"待机列表"之外的其他内容,因为其他数据以某种方式被使用,如果你这样做,你可能会导致问题/数据松散.请记住,您正在清除不仅由postgres文件使用的内存,还包括任何其他应用程序和操作系统.

此致,Thiago L.

  • 这适用于Windows案例!谢谢. (2认同)

wut*_*aer 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;
Run Code Online (Sandbox Code Playgroud)


Ild*_*sin 5

pg_buffercache查看shared_buffers缓存的模块.并且在某些时候我需要删除缓存以对"冷"缓存进行一些性能测试,因此我编写了一个pg_dropcache扩展来完成此操作.请检查一下.