Pg_stat_monitor-更好地了解PostgreSQL中的查询性能

2020-10-14 23:55:03

Peter Zaitsev我对数据库的可观测性非常感兴趣,我相信查询性能可观测性是您可以从您的数据库中获得的最重要的洞察力。因为如果您从应用程序开发人员的角度来看,一旦提供了数据库并可以连接到它,那么您基本上只需要从数据库中快速、正确地响应您的查询。这既适用于您在本地部署的数据库,也适用于基于云的DBaaS产品。

PostgreSQL有一个非常棒的用于捕获查询性能的扩展,名为PG_STAT_STATEMENTS,它捕获了大量查询执行细节;但是,它没有捕获我们想要捕获的所有细节,以便在Percona Monitoring and Management中提供深入的查询性能洞察力。因此,我们开发了一个新的pg_stat_monitor插件,它的设计目标和使用模式略有不同,同时提供了您从pg_stat_Statements中习惯的所有内容,等等。

此时,pg_stat_monitor作为一个独立于Percona的项目发布,因此我们更容易尝试新的方法和想法。同时,我们非常期待与PostgreSQL社区合作,看看是否有足够的共识将其合并到pg_stat_Statements中。

时间分组:pg_stat_monitor不是提供一组不断增加的计数,而是计算配置数量的时间间隔的统计数据。这允许更好的数据准确性,特别是在高分辨率或不可靠网络的情况下。

多维分组:当pg_stat_Statements按(userid,dbid,queryId)对计数器分组时,pg_stat_monitor使用(userid,clientip,dbid,queryId)。这使您可以深入了解来自特定客户端地址的查询的性能,我们Percona在许多情况下都发现这一点非常有价值。

捕获查询中的实际参数:PG_STAT_MONITOR允许您选择是要查看带有占位符的参数查询还是实际查询示例。我们发现拥有完整的查询示例非常有帮助,因为您可以对其运行解释或轻松地修改查询以使其运行得更好,以及在与其他DBA和应用程序开发人员讨论时使有关查询的沟通更清晰。

存储按语句访问的表的信息:这使我们可以轻松地识别访问给定表的所有查询。这样的方法比解析查询来提取此类信息更可靠。

响应时间分布直方图:虽然min/max/avg查询执行统计数据很棒,特别是在短时间段内计算时,但在长时间尝试查看它们时,很难理解这些统计数据。为此,我们添加了一个查询响应时间直方图,它可以提供更好的洞察力。

重要的是要注意,我们能够实现这些附加功能,同时具有与原始pg_stat_Statements扩展相当的性能开销。

有许多我们想要实现的特性,但是还没有想好如何使用PostgreSQL扩展来实现它们(以及是否可以在不打PostgreSQL代码补丁的情况下实现这些特性)。如果您对如何实现这些目标有什么想法,请让我们知道。

捕获所有查询:捕获所有查询(不仅仅是成功的查询),这样就不会错过因错误而终止的查询(或者需要另一个数据源来捕获)。一旦有了这些,我们就可以分别测量成功和失败查询的性能,这样就可以将提高的失败率视为不同于不同查询性能的信号。

错误和警告直方图:并非所有查询都成功,当它们失败时,您确实想知道原因。我们不仅希望看到给定查询失败的次数,而且希望看到失败的原因是什么。相同的查询可能会因为权限错误或外键冲突而失败,这需要完全不同的操作才能补救。知道哪个查询触发了特定的警告也很有帮助。

准确的等待事件对查询的属性:对于给定的查询类型,最好能看到它的响应时间来自哪里。等待事件是捕捉这一点的一种方式,目前,查询属性可以通过对pg_stat_active表进行高频采样来完成。但是,对于大量的活动后端,它并不准确,也不具有可伸缩性。

Pg_stat_monitor现在以技术预览版的形式提供,在我们将pg_stat_monitor作为未来几年支持的通用版本发布之前,我们将其发布,以便从社区获得反馈,告诉我们哪些做得对,哪些应该做得不同。请查看,或给我们留言,提交问题,或提出拉请求!

我们的白皮书“为什么选择PostgreSQL?”介绍了PostgreSQL的特性和优点,并提供了一些实际使用示例。我们还将研究PostgreSQL对于希望从Oracle迁移的公司有何用处。