Redrock Postgres 文档
主页 切换暗/亮/自动模式 切换暗/亮/自动模式 切换暗/亮/自动模式 返回首页

Lock - extend

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

上下文

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

等待次数增加的可能原因

extend 事件的发生率超过正常(可能表示性能问题)时,典型原因包括以下几点:

  • 对同一表的并发插入或更新激增

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

  • 网络带宽不足

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

操作

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

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

首先,确定 tup_insertedtup_updated 指标是否有增加,以及此等待事件是否伴随增加。如果是这样,请检查哪些关系在插入和更新操作中处于高争用状态。要确定这一点,请查询 pg_stat_all_tables 视图,以了解 n_tup_insn_tup_upd 字段中的值。有关 pg_stat_all_tables 视图的信息,请参阅 PostgreSQL 文档中的 pg_stat_all_tables

要获取有关正在阻止和已阻止的查询的更多信息,请如以下示例所示查询 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

在您确定有助于增加 extend 事件的关系后,请使用以下方法来减少争用:

  • 查明是否可以使用分区来减少同一个表的争用。将插入或更新的元组分成不同的分区可以减少争用。

  • 如果等待事件主要是由于更新活动造成的,请考虑减少关系的 fillfactor 值。这可以减少更新期间对新数据块的请求。fillfactor 是表的存储参数,用于确定打包表页面的最大空间量。它表示为页面总空间的百分比。有关 fillfactor 参数的更多信息,请参阅 PostgreSQL 文档中的 CREATE TABLE

    重要

    我们强烈建议您在更改 fillfactor 时测试系统,因为更改此值可能会对性能产生负面影响,这具体取决于您的工作负载。