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

时间:2009-08-01 13:58:58

标签: optimization postgresql

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

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


DBCC FREEPROCCACHE
DBCC DROPCLEANBUFFERS

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

感谢您的帮助。

10 个答案:

答案 0 :(得分:48)

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

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

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

答案 1 :(得分:19)

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

你应该做的是:

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

答案 2 :(得分:13)

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

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

它完全摆脱了缓存。

答案 3 :(得分:10)

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秒。

答案 4 :(得分:6)

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

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

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

答案 5 :(得分:6)

是的,可以清除共享缓冲区postgres缓存 AND 操作系统缓存。解决方案是针对 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。

答案 6 :(得分:5)

我有这个错误。

  

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

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

DISCARD PLAN

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

答案 7 :(得分:5)

pg_buffercache个模块可以查看shared_buffers缓存。在某些时候,我需要删除缓存以对“冷”进行一些性能测试。缓存所以我写了一个pg_dropcache扩展名来完成这个。请检查一下。

答案 8 :(得分:4)

这是我的捷径

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;

答案 9 :(得分:1)

如果您有专用的测试数据库,则可以将参数:shared buffers 设置为 16。这应该会禁用所有查询的缓存。