跳至内容

如何解决 Amazon RDS for PostgreSQL 或 Aurora PostgreSQL 兼容版中 LWLock:pg_stat_statements 等待事件导致的问题?

2 分钟阅读
0

我想解决 Amazon Relational Database Service (Amazon RDS) for PostgreSQL 或 Amazon Aurora PostgreSQL 兼容版中 LWLock:pg_stat_statements 等待事件导致的性能问题。

解决方法

pg_stat_statements 模块跟踪有关 SQL 语句的统计数据。对于与 PostgreSQL 11 或更高版本兼容的 PostgreSQL 数据库实例,默认情况下会加载 pg_stat_statements 库。有关详细信息,请参阅 PostgreSQL 网站上的 pg_stat_statements

当跟踪的唯一语句的数量超过 pg_stat_statements.max 值时,PostgreSQL 会从共享内存中的哈希表中取消分配最不经常运行的查询的统计数据。取消分配可为新条目创建空间。

在取消分配期间,PostgreSQL 将 LWLock 用于哈希表,以防止并发访问。这可能会阻塞并发的后端进程,您可能会在“性能详情”中看到等待事件 LWLock:pg_stat_statements

**注意:**如果哈希表经常分配条目,则工作负载的整体性能可能会降低。

增加 pg_stat_statements.max 模块

要减少 LWLock:pg_stat_statements 等待事件,请增加参数组中的 pg_stat_statements.max 值。有关详细信息,请参阅 PostgreSQL 网站上的 pg_stat_statements.max

**注意:**当您增加 pg_stat_statements.max 的值时,哈希表会消耗额外的共享内存来存储更多 SQL 语句信息。

对于 Amazon RDS for PostgreSQL,您可以修改数据库参数组中的 pg_stat_statements.max

对于 Aurora PostgreSQL 兼容版,您可以修改数据库集群参数组数据库参数组中的值。

修改参数组中的 pg_stat_statements.max 后,重启数据库实例以应用更改。在重启期间,您会遇到短暂的中断。有关详细信息,请参阅重启数据库实例:基本步骤在 Aurora 集群内重启数据库实例

您无法修改默认数据库参数组或默认数据库集群参数组中的参数。要修改默认组中的参数,请创建自定义数据库参数组或自定义数据库集群参数组。然后,将其与您的数据库实例或数据库集群相关联。

**注意:**您可以将较长的查询文本存储在单独的磁盘文件中。如果由于查询长度或 pg_stat_statements.max 值过高而导致文件变得过大,则所有查询文本可能会被丢弃。然后,pg_stat_statements.query 字段可能会变为空。有关详细信息,请参阅 PostgreSQL 网站上的 pg_stat_statements -- track statistics of SQL planning and execution(pg_stat_statements -- 跟踪 SQL 规划与执行的统计数据)

减少 pg_stat_statements 条目

最佳做法是使用 PostgreSQL 版本 17 来减少 pg_stat_statements 条目。例如,当使用 PostgreSQL 版本 17 及更高版本时,您可以将常量的 SAVEPOINT 名称替换为占位符。例如,在早期版本的 PostgreSQL 中,您可以将 SAVEPOINT sp1SAVEPOINT sp2 另存为两个不同的 pg_stat_statements 条目。但是,在 PostgreSQL 版本 17 及更高版本中,这两个语句存储为一个条目,例如存储为 SAVEPOINT $1。有关详细信息,请参阅 PostgreSQL 网站上的 pg_stat_statements

如果您无法升级到 PostgreSQL 版本 17 或更高版本,请验证您的应用程序、对象关系映射器 (ORM) 和数据库驱动程序是否自动发出 SQL,例如 SAVEPOINT 命令。这些自动 SAVEPOINT 命令可能会增加 pg_stat_statements 条目的数量。

查看发生了多少次取消分配

PostgreSQL 版本 14 及更高版本

要查看取消分配的总次数,请查看 pg_stat_statements_info 视图的 dealloc 列。您可以使用这些信息来适当调整 pg_stat_statements.max。有关详细信息,请参阅 PostgreSQL 网站上的 pg_stat_statements_info 视图。

要查看特定时间内的取消分配次数,请定期选择 pg_stat_statements_info 视图,然后计算与 pg_stat_statements_info.dealloc 的差异。

当选择 pg_stat_statements_info 视图时,您可能会收到“ERROR: relation 'pg_stat_statements_info' does not exist”的错误消息。当 pg_stat_statements 仅加载到内存中但未安装在数据库上时,就会出现此错误。要解决此错误,请将 pg_stat_statements 扩展安装到应用程序连接的数据库中。连接到数据库,然后运行以下 SQL 语句将 pg_stat_statements 安装到数据库中:

CREATE EXTENSION pg_stat_statements;

有关详细信息,请参阅 PostgreSQL 网站上的 CREATE EXTENSION