Performance 研究生成绩问题

Performance 研究生成绩问题,performance,postgresql,Performance,Postgresql,我们正在运行Postgres 9.1.3,最近在我们的一台服务器上遇到了严重的性能问题 我们的查询在一段时间内运行良好,但截至8月1日,它们的速度急剧放缓。看起来大多数有问题的查询都是Select查询(带有count(*)的查询尤其糟糕),但总体而言,数据库运行非常慢 我们在服务器上运行了query,这些是我们对默认配置文件所做的更改(注意:服务器以前在进行这些更改时运行得很好,因此,它们可能不太重要): 通常,当出现这样的问题时,人们建议的第一件事就是吸尘,我们已经尝试过了。我们对大部分数据库

我们正在运行Postgres 9.1.3,最近在我们的一台服务器上遇到了严重的性能问题

我们的查询在一段时间内运行良好,但截至8月1日,它们的速度急剧放缓。看起来大多数有问题的查询都是Select查询(带有count(*)的查询尤其糟糕),但总体而言,数据库运行非常慢

我们在服务器上运行了query,这些是我们对默认配置文件所做的更改(注意:服务器以前在进行这些更改时运行得很好,因此,它们可能不太重要):

通常,当出现这样的问题时,人们建议的第一件事就是吸尘,我们已经尝试过了。我们对大部分数据库进行了真空分析,但没有任何帮助

我们在一些查询中使用了
Explain
,并注意到Postgres采用了顺序扫描,即使这些表有索引

我们关闭了顺序扫描以强制查询计划器使用索引,但这也没有帮助

然后,我们尝试了这个查询,看看我们是否有大量未使用的磁盘空间,Postgres正在使用这些磁盘空间来查找它要查找的内容。不幸的是,虽然我们的一些表确实有一点大,但它似乎不足以降低总体系统性能

我们认为经济放缓可能与I/O有关,但我们无法确定具体细节。博士后只是愚蠢吗?如果是,那是什么原因?虚拟机是否有问题,或者物理硬件本身是否有问题

对于我们可以尝试或查看的东西,你们还有其他建议吗

编辑:

我很抱歉没有及时更新。我被其他事情缠住了

在这台特定的机器上,通过对虚拟机的设置进行一个小的修改,我们的性能大大提高

有一个处理IO缓存的设置。它最初设置为ON。我们认为,不断地缓存东西会减慢速度,我们是对的。我们关掉了它,事情有了很大的改善

有趣的是,我们的大多数其他服务器已经关闭了此设置

还有其他问题,我相信我们会采纳你的很多建议,所以,非常感谢你的帮助

(带有count(*)的查询尤其糟糕)

你应该调查一下


否则,如果没有看到您的相关架构和查询,我们将无法确定。很难确定,但我认为您对I/O问题的怀疑是正确的。可能发生的情况是,随着表变大或连接增加,缓存命中率开始下降。这会增加I/o需求并降低速度。与此同时,更多的查询出现,使问题变得更糟。这种情况对您来说很复杂,因为虚拟磁盘的行为不一定与物理磁盘相同

首先,您需要测量虚拟机上的实际活动(可能通过vmstat或iostat)。第二,在真正的硬件上也这样做。最后,在两者上运行一些标准磁盘带宽工具(特别是随机读/写混合)。现在,您将能够说出有多少可用I/o正在被使用

至于查询计划,没有模式细节和解释分析输出,谁也说不出

您会发现postgresql.org邮件列表非常有用,即使只是用于归档。另外,下面链接的这本书也很棒


您最大的问题是这一行:

autovacuum | off 这些设置告诉PostgreSQL以牺牲持久性为代价加快写入速度。如果您的硬件或操作系统(或虚拟机)崩溃或突然死机,您的数据库将损坏,您最好的选择是从上次已知的良好备份中恢复。(当然,由于硬件随时可能出现故障,如果您担心数据丢失,那么您有一个好的备份策略。)

维护工作内存1GB 这对于8GB虚拟机来说太高了。在对一个连接进行大量维护之前,您始终可以在该连接上对其进行增强

wal_writer_delay | 10ms wal|U写入延迟| 10ms 即使是经验丰富的专家也难以将其调整到比默认情况下性能更好的情况。几乎总是最好不要去管它

此时,最好使用pg_dumpall将数据库集群转储到其他介质,从一个新的initdb开始,然后进行恢复。作为数据库超级用户,运行
VACUUM FREEZE ANALYZE
(通常不建议使用
FREEZE
,除非在这样的批量加载之后),并在打开autovacuum的情况下运行


我强烈建议您购买一本格雷格·史密斯的《PostgreSQL 9.0高性能》一书,并仔细阅读。(完全公开,我是这本书的技术评论员之一,但没有从销售中获得任何收入。)他建议的第一件事是在你安装PostgreSQL之前获得RAM和磁盘速度的基准数字——这样你就知道你在处理什么了。

我也会打开自动吸尘器。你可以设置几个变量来控制真空干扰的程度。根据您拥有的RAM数量,您应该将共享缓冲区设置在2048MB-3276MB之间。如果您有很多额外的RAM,而您的系统似乎没有使用这些RAM,而您在其他地方不需要这些RAM,那么您可能应该将其设置得更靠近高端。此外,您可能需要使用sysctl查看最大段大小。您的维护工作量确实很高,但如果您主要进行维护,那么我想这并不像我最初想的那么糟糕。

好吧,我不能分享太多(有点安静,安静),但这并不是说查询太慢,当某些东西在运行时,整个系统就会停止。这些麻烦的查询是从单个表中选择的吗?如果是这样,您可以删除索引,然后作为测试再次创建它们吗?(一张桌子没有什么特别之处,只是它是si checkpoint_segments | 6 fsync | off full_page_writes | off maintenance_work_mem | 1GB wal_writer_delay | 10ms