

# Lock:extend


当后端进程正在等待锁定关系以对其进行扩展，而另一个进程出于同样目的锁定该关系时，会发生 `Lock:extend` 事件。

**Topics**
+ [

## 支持的引擎版本
](#wait-event.lockextend.context.supported)
+ [

## 上下文
](#wait-event.lockextend.context)
+ [

## 等待次数增加的可能原因
](#wait-event.lockextend.causes)
+ [

## 操作
](#wait-event.lockextend.actions)

## 支持的引擎版本


RDS for PostgreSQL 的所有版本均支持此等待事件信息。

## 上下文


事件 `Lock:extend` 表示后端进程正在等待扩展另一个后端进程在扩展该关系时保持锁定的关系。由于每次只有一个进程可以扩展关系，因此系统会生成 `Lock:extend` 等待事件。`INSERT`、`COPY` 和 `UPDATE` 操作可以生成此事件。

## 等待次数增加的可能原因


当 `Lock:extend` 事件的发生率超过正常（可能表示性能问题）时，典型原因包括以下几点：

**对同一表的并发插入或更新激增 **  
插入或更新同一表的查询的并发会话数可能会增加。

**网络带宽不足**  
数据库实例上的网络带宽可能不足以满足当前工作负载的存储通信需求。这可能会导致存储延迟，从而导致 `Lock:extend` 事件增加。

## 操作


根据等待事件的原因，我们建议采取不同的操作。

**Topics**
+ [

### 减少同一关系的并发插入和更新
](#wait-event.lockextend.actions.action1)
+ [

### 提高网络带宽
](#wait-event.lockextend.actions.increase-network-bandwidth)

### 减少同一关系的并发插入和更新


首先，确定 `tup_inserted` 和 `tup_updated` 指标是否有增加，以及此等待事件是否伴随增加。如果是这样，请检查哪些关系在插入和更新操作中处于高争用状态。要确定这一点，请查询 `pg_stat_all_tables` 视图，以了解 `n_tup_ins` 和 `n_tup_upd` 字段中的值。有关 `pg_stat_all_tables` 视图的信息，请参阅 PostgreSQL 文档中的 [pg\$1stat\$1all\$1tables](https://www.postgresql.org/docs/13/monitoring-stats.html#MONITORING-PG-STAT-ALL-TABLES-VIEW)。

要获取有关正在阻止和已阻止的查询的更多信息，请如以下示例所示查询 `pg_stat_activity`：

```
SELECT
    blocked.pid,
    blocked.usename,
    blocked.query,
    blocking.pid AS blocking_id,
    blocking.query AS blocking_query,
    blocking.wait_event AS blocking_wait_event,
    blocking.wait_event_type AS blocking_wait_event_type
FROM pg_stat_activity AS blocked
JOIN pg_stat_activity AS blocking ON blocking.pid = ANY(pg_blocking_pids(blocked.pid))
where
blocked.wait_event = 'extend'
and blocked.wait_event_type = 'Lock';
 
   pid  | usename  |            query             | blocking_id |                         blocking_query                           | blocking_wait_event | blocking_wait_event_type
  ------+----------+------------------------------+-------------+------------------------------------------------------------------+---------------------+--------------------------
   7143 |  myuser  | insert into tab1 values (1); |        4600 | INSERT INTO tab1 (a) SELECT s FROM generate_series(1,1000000) s; | DataFileExtend      | IO
```

在您确定有助于增加 `Lock:extend` 事件的关系后，请使用以下方法来减少争用：
+ 查明是否可以使用分区来减少同一个表的争用。将插入或更新的元组分成不同的分区可以减少争用。有关分区的信息，请参阅 [使用 pg\$1partman 扩展管理 PostgreSQL 分区](PostgreSQL_Partitions.md)。
+ 如果等待事件主要是由于更新活动造成的，请考虑减少关系的 fillfactor 值。这可以减少更新期间对新数据块的请求。fillfactor 是表的存储参数，用于确定打包表页面的最大空间量。它表示为页面总空间的百分比。有关 fillfactor 参数的更多信息，请参阅 PostgreSQL 文档中的 [CREATE TABLE](https://www.postgresql.org/docs/13/sql-createtable.html)。
**重要**  
我们强烈建议您在更改 fillfactor 时测试系统，因为更改此值可能会对性能产生负面影响，这具体取决于您的工作负载。

### 提高网络带宽


要查看写入延迟是否增加，请检查 CloudWatch 中的 `WriteLatency` 指标。如果有，请使用 `WriteThroughput` 和 `ReadThroughput` Amazon CloudWatch 指标监控数据库实例上与存储相关的流量。这些指标可以帮助您确定网络带宽是否足以满足您的工作负载的存储活动。

如果您的网络带宽不够，请增加它。如果您的数据库实例已达到网络带宽限制，增加带宽的唯一方法是增加数据库实例大小。

有关 CloudWatch 指标的更多信息，请参阅[Amazon RDS 的 Amazon CloudWatch 实例级指标](rds-metrics.md#rds-cw-metrics-instance)。有关每个数据库实例类的网络性能的信息，请参阅 [Amazon RDS 的 Amazon CloudWatch 实例级指标](rds-metrics.md#rds-cw-metrics-instance)。