

# 使用 CloudWatch 数据库洞察分析 Amazon Aurora PostgreSQL 和 Amazon RDS for PostgreSQL 的锁定树
<a name="Database-Insights-Lock-Analysis"></a>

要解决由锁定引起的性能问题，您可以使用 CloudWatch 数据库洞察来分析 Amazon Aurora PostgreSQL 和 Amazon RDS for PostgreSQL 数据库的锁定树，方法如下。
+ **划分者**下拉列表：在**数据库负载**图表中选择**阻止对象**、**阻止会话**或**阻止 SQL** 维度，以查看排名靠前的各个拦截器在一段时间内对数据库负载的贡献。使用数据库负载图表，您可以分析排名靠前的拦截器是保持恒定还是经常变化。之后，您就可以对拦截器进行故障排除。  
![\[在切片方式下拉列表中选择了“阻止会话”的主要 SQL 表\]](http://docs.aws.amazon.com/zh_cn/AmazonCloudWatch/latest/monitoring/images/DBInsights_TopSQLBlocking.png)
+ **锁定分析**选项卡 – 选择**数据库负载分析**，然后选择**锁定分析**选项卡以查看有关数据库中锁定争用的信息。  
![\[数据库负载控制面板中的锁定树表\]](http://docs.aws.amazon.com/zh_cn/AmazonCloudWatch/latest/monitoring/images/DBInsights_LoadLockAnalysis.png)

**注意**  
CloudWatch 数据库洞察支持所有 Aurora PostgreSQL 版本的锁定分析。要分析锁定树，必须启用数据库洞察高级模式。有关如何开启高级模式的信息，请参阅[开启适用于 Amazon Aurora 的数据库洞察的高级模式](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/USER_DatabaseInsights.TurningOnAdvanced.html)和 [Turning on the Advanced mode of Database Insights for Amazon Relational Database Service](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_DatabaseInsights.TurningOnAdvanced.html)

锁定分析选项卡提供有关数据库锁定争用的信息。锁定树可视化会显示来自不同会话的锁定请求之间的关系和依赖关系。

数据库洞察会每 15 秒捕获一次快照。快照显示的是数据库在某个时间点的锁定数据。

**注意**  
当 CloudWatch 检测到高锁定率时，CloudWatch 会在**锁定分析**选项卡中显示**检测到高锁定率**横幅。如果 CloudWatch 在连续 15 分钟内每隔 15 秒拍摄一次锁定快照，则表示 CloudWatch 检测到高锁定率。

锁定树中的每个节点代表一个特定的会话。父节点是阻止其子节点的会话。

要分析锁定树，请按照以下流程操作。

**分析锁定树的步骤**

1. 登录 AWS 管理控制台并打开 CloudWatch 控制台（[https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/)）。

1. 选择 **Insights**。

1. 选择 **Database Insights**。

1. 选择**数据库实例**视图。

1. 选择一个数据库实例。

1. 选择**数据库负载分析**选项卡。

1. 选择**锁定分析**选项卡。

   要查看数据库实例的锁定数据，请选择 1 天或更短的时间段。

1. 选择快照窗口。默认情况下，数据库洞察会选择受阻会话最多的快照窗口。  
![\[锁定分析表\]](http://docs.aws.amazon.com/zh_cn/AmazonCloudWatch/latest/monitoring/images/dbi_lock-analysis.png)

1. 要查看快照的锁定数据，请选择数据库洞察功能拍摄快照的时间。

1. 要展开锁定树，请选择会话 ID 旁边的箭头。  
![\[锁定树已展开\]](http://docs.aws.amazon.com/zh_cn/AmazonCloudWatch/latest/monitoring/images/dbi_lock-analysis-expand.png)

## 锁定快照数据
<a name="Database-Insights-Lock-Analysis-snapshot-data"></a>

数据库洞察功能可提供每个锁定请求的以下信息。要查看默认情况下未启用的列，请选择**锁定树**表格的**设置**图标并启用其他列。


| 列名称 | 定义  | 默认列 | 备注 | 
| --- | --- | --- | --- | 
|  `session_id`  | 会话唯一标识符。 |  是  | `session_id` 派生自 `HEX(pg_stat_activity.backend_start).HEX(pg_locks.pid)`。 | 
|  `pid`  | 此后端的 PID。 |  是  | `pg_locks.pid` | 
|  `blocked_sessions_count`  | 此锁定阻止的会话数。 |  是  | `blocked_sessions_count` 派生自此锁定阻止的会话 ID 的数量。 | 
|  `last_query_executed`  | 此会话执行的最后一个查询。对于拦截器来说，其可能不是保留了拦截锁定的查询。 |  是  | `pg_stat_activity.query` | 
|  `wait_event`  | 如果后端当前正在等待，则为等待事件名称，否则值为 NULL。 |  是  | `pg_stat_activity.wait_event` | 
|  `blocking_time_(In Seconds)`  | 自此锁定开始以来的时间（以秒为单位）。 |  是  | `blocking_time_(In Seconds)` 派生自第一个 Waiter 的等待事务的开始时间 (`pg_locks.waitstart`)。 | 
|  `blocking_mode`  | 由阻止会话保留的锁定模式。 |  否  | `pg_locks.mode` | 
|  `waiting_mode`  | 由等待会话请求的锁定模式。 |  否  | `pg_locks.mode` | 
|  `application`  | 连接到此后端的应用程序的名称。 |  否  | `pg_stat_activity.application_name` | 
|  `blocking_txn_start_time`  | 阻止事务的开始时间；如果没有处于活动状态的事务，则为 null。 |  否  | `pg_stat_activity.xact_start` | 
|  `waiting_start_time`  | 等待中的用户会话开始等待此锁定的时间；如果保留锁定，则为 null。 |  否  | `pg_locks.waitstart` | 
|  `session_start_time`  | 用户会话开始的时间。 |  否  | `pg_stat_activity.backend_start` | 
|  `state`  | 后端的状态。 |  否  | `pg_stat_activity.state` | 
|  `wait_event_type`  | 此会话正在等待的等待事件类型。 |  否  | `pg_stat_activity.wait_event_type` | 
|  `last_query_exec_time`  | 最后一次查询开始的时间。 |  否  | `pg_stat_activity.query_start` | 
|  `user`  | 登录到此后端的用户名称。 |  否  | `pg_stat_activity.usename` | 
|  `host`  | 已连接客户端的主机名，如 `client_addr` 反向 DNS 查找所报告。只有针对 IP 连接，并且仅在已启用 [log\$1hostname](https://www.postgresql.org/docs/current/runtime-config-logging.html#GUC-LOG-HOSTNAME) 时，此字段才会为非空。 |  否  | `pg_stat_activity.client_hostname` | 
|  `port`  | 客户端用于与此后端通信的 TCP 端口号；如果使用 Unix 套接字，则为 `-1`。如果此字段为 null，则表示这是一个内部服务器进程。 |  否  | `pg_stat_activity.client_port` | 
|  `client_address`  | 连接到此后端的客户端 IP 地址。如果此字段为 null，则表示客户端是通过服务器计算机上的 Unix 套接字连接的，或者表示这是内部进程，例如 autovacuum。 |  否  | `pg_stat_activity.client_addr` | 
|  `granted`  | 如果保留锁定，则该值为 true；如果等待锁定，则该值为 false。 |  否  | `pg_locks.granted` | 
|  `waiting_tuple`  |  页面内锁定所针对的元组编号；如果目标不是元组，则为 null。  |  否  | `pg_locks.tuple` | 
|  `waiting_page`  | 关系内锁定所针对的页码；如果目标不是关系页面或元组，则为 null。 |  否  | `pg_locks.page` | 
|  `waiting_transaction_id`  | 锁定所针对的事务 ID；如果目标不是事务 ID，则为 null。 |  否  | `pg_locks.transactionid` | 
|  `waiting_relation`  | 锁定所针对的关系 OID；如果目标不是关系或关系的一部分，则为 null。 |  否  | `pg_locks.relation` | 
|  `waiting_object_id`  | 锁定目标在其系统目录中的 OID；如果目标不是通用数据库对象，则为 null。 |  否  | `pg_locks.objid` | 
|  `waiting_database_id`  | 锁定目标所在数据库的 OID；如果目标是共享对象，则为零；如果目标是事务 ID，则为 null。 |  否  | `pg_locks.database` | 
|  `waiting_database_name`  | 锁定目标所在数据库的名称。 |  否  | `pg_stat_activity.datname` | 
|  `waiting_locktype`  | 可锁定对象的类型：relation、extend、frozenid、page、tuple、transactionid、virtualxid、spectoken、object、userlock、advisory 或 applytransaction。 |  否  | `pg_locks.locktype` | 
|  `is_fastpath`  | 如果使用快速路径获取锁定，则该值为 true；如果从主锁定表中获取，则该值为 false。 |  否  | `pg_locks.fastpath` | 

有关 `pg_stat_activity` 和 `pg_locks` 视图中值的更多信息，请参阅 PostgreSQL 文档中的以下主题。
+ [pg\$1locks](https://www.postgresql.org/docs/current/view-pg-locks.html)
+ [pg\$1stat\$1activity](https://www.postgresql.org/docs/current/monitoring-stats.html#MONITORING-PG-STAT-ACTIVITY-VIEW)