如何检查正在运行的查询并诊断 Amazon RDS 或 Aurora PostgreSQL 数据库实例的资源消耗问题?

上次更新时间:2020 年 3 月 26 日

我需要查看哪些查询正在 Amazon Relational Database Service (Amazon RDS) 或 Amazon Aurora PostgreSQL 数据库实例上运行。该如何操作?

解决方法

检查正在运行的查询

必须给您的用户账户授予 rds_superuser 角色,以查看在 RDS for PostgreSQL 或 Aurora PostgreSQL 的数据库实例上运行的所有进程。否则,pg_stat_activity 仅显示为其自身进程运行的查询。有关更多信息,请参阅关于统计收集器的 PostgreSQL 文档。

1.    连接到正在运行 PostgreSQL 或 Aurora PostgreSQL 的数据库实例

2.    运行以下命令:

SELECT * FROM pg_stat_activity ORDER BY pid;

您还可以修改此命令,以查看按建立连接的时间排序的正在运行查询的列表:

SELECT * FROM pg_stat_activity ORDER BY backend_start;

如果列值为 null,则该会话中没有打开事务:

SELECT * FROM pg_stat_activity ORDER BY xact_start;

或者,查看按上一次执行查询时间排序的正在运行查询的相同列表:

SELECT * FROM pg_stat_activity ORDER BY query_start;

对于等待事件的聚合视图(如果有),请运行以下命令:

select state, wait_event, wait_event_type, count(*) from pg_stat_activity group by 1,2,3 order by wait_event;

诊断资源消耗情况

通过使用 pg_stat_activity启用增强监测,您可以识别消耗大量系统资源的查询/进程。启用增强监测后,确保粒度设置足以让您查看诊断问题所需的信息。然后,您可以检查 pg_stat_activity 以查看数据库中的当前活动及当时的增强监测指标。

1.    通过查看 OS 进程列表指标识别消耗资源的查询。在以下示例中,该进程约消耗了 RDS 数据库实例上 95% 的 CPU 时间。该进程的进程 ID (pid) 为 14431,且该进程在执行 SELECT 语句。您也可以通过检查 MEM% 来查看系统内存的使用情况。

NAME VIRT RES CPU% MEM% VMLIMIT
postgres: master postgres 27.0.3.145(52003) SELECT [14431] 457.66 MB 27.7 MB 95.15 2.78 不受限制

2.    连接到正在运行 PostgreSQL 或 Aurora PostgreSQL 的数据库实例

3.    通过运行以下命令确定会话的当前活动:

SELECT * FROM pg_stat_activity WHERE pid = PID;

注意:PID 替换成您在步骤 1 中所确定的 pid。

4.    检查命令的结果:

datid            | 14008
datname          | postgres
pid              | 14431
usesysid         | 16394
usename          | master
application_name | psql
client_addr      | 27.0.3.145
client_hostname  |
client_port      | 52003
backend_start    | 2020-03-11 23:08:55.786031+00
xact_start       | 2020-03-11 23:12:16.960942+00
query_start      | 2020-03-11 23:12:16.960942+00
state_change     | 2020-03-11 23:12:16.960945+00
wait_event_type  |
wait_event       |
state            | active
backend_xid      |
backend_xmin     | 812
query            | SELECT COUNT(*) FROM columns c1, columns c2, columns c3, columns c4, columns c5;
backend_type     | client backend

要停止正在执行查询的进程,请从另一个会话中调用以下查询。务必将 PID 替换为您在步骤 3 中所确定进程的 pid。

SELECT pg_terminate_backend(PID);

重要提示:在终止事务之前,评估每项事务可能对您的数据库和应用程序产生的影响。


这篇文章对您有帮助吗?

我们可以改进什么?


需要更多帮助?