概述

数据库中的等待事件是指当一个会话(或事务)在尝试执行某些操作时,由于资源暂时不可用而进入的一种等待状态。这些等待事件是数据库管理系统用来管理并发访问和确保数据一致性的机制的一部分。了解这些等待事件对于数据库性能调优、故障排查以及确保系统高效运行至关重要。

等待事件分类

在openGauss数据库中,把等待事件分为了四大类
1)STATUS(状态):反应数据库内部的关键操作的资源等待。
image.png
2)IO EVENT(IO类的等待事件):反应数据库的IO操作等待。
image.png
3)事务锁等待:事务,表、tuple级的锁等待。
image.png
4)轻量级锁等待:LWLock主要用于保护数据库内部的数据结构,例如共享缓冲区、事务ID分配器等,以确保这些关键资源在多进程环境下的正确性和一致性。
image.png

查看数据库的等待事件

1、实时等待事件

select wait_status,wait_event,count(*) from pg_thread_wait_status group by 1,2 order by 3 desc;

如下图所示:
image.png

2、过去一段时间内的等待事件

查询过去2小时内的等待事件,可以通过dbe_perf.local_active_session视图,该视图为内存态的视图,只会保留10万条记录。过去两天内的等待事件,通过gs_asp视图查看,该视图会存储到磁盘。

select wait_status,cur_event,count(*) from dbe_perf.local_active_session where sample_time > '20250723 16:00:00' and sample_time < '20250723 18:00:00' group by 1,2 order by 3 desc limit 10;

image.png

如果数据库持续一直很慢

通过dbe_perf.wait_events视图,查询数据库的TOP等待事件,分析数据库存在的瓶颈。

select type,event,total_wait_time,avg_wait_time from dbe_perf.wait_events order by total_wait_time desc limit 10;

image.png

分析异常的慢SQL

通过如下语句查看某个SQL的异常等待事件

select unique_query_id,debug_query_id,finish_time-start_time as runtime,substr(query,1,50) as query,query_plan,pg_catalog.statement_detail_decode(details,'plaintext',true) as detail
from (select *,ROW_NUMBER() over (partition by unique_query_id order by finish_time-start_time desc) rn from statement_history 
where start_time>'2025-03-03 16:07:48' and start_time < '2025-03-04 16:07:48' and db_name='testdb' and user_name='test')
where rn=1;

如下图所示,帮助分析单个SQL的性能问题:
image.png

常见数据库等待事件解析

下面总结一些比较常见的数据库等待事件,以及优化思路。

  1. 有序列表等待应用侧发数据 - STATUS/wait cmd
    表示此session正在等待用户发送数据,当前压力未在内核侧。
  2. 正在执行中 - STATUS/none
    表示正在执行过程中,未在某个events产生较多耗时。
    此状态下内核侧从Events来看无明显瓶颈。
  3. 数据库限流 - IO_EVENT/LOGCTRL_SLEEP
    为了保障数据库的RTO,openGauss具备流控功能(受recovery_time_target控制),如果打开了数据库的流控功能,出现大量该等待事件说明数据库频繁触发流控。在压力测试的时候,性能压制较为明显,可考虑是否关闭流控。
  4. 等待wal日志同步 - STATUS/wait wal sync
    通常表示事务提交等待备机日志下盘,此事件异常,可能表示如下原因:
    1)wal日志量大
    2)主备机网络异常
    3)备机IO异常
  5. 发送数据 - STATUS/flush data
    表示网络数据发送,可能存在:
    1) 数据量大
    2)网络异常
  6. 正在执行sort算子 - STATUS/Sort、Sort - fetch tuple、Sort - write file
    1)分别表示正在执行sort算子、获取sort元组、sort下盘操作。
    2)其它算子Material/HashJoin/HashAgg等类似。
    3)对于异常下盘场景,可以评估考虑本session增加work_mem。
    4)考虑是否优化Query。
  7. IO异常 - IO_EVENT/DataFileRead, DataFileWrite
    通常出现大量这两种等待事件,可能的情况是IO异常、业务不优导致的IO使用,可以重点分析排查。
  8. 并发更新 - LOCK_EVENT/tuple、transactionid
    1)通常大量出现这两个等待事件,业务极大可能出现并发更新,出现整体业务阻塞。
    2)结合pg_thread_wait_status/dbe_perf.local_active_session/gs_asp内block_sessionid,可找到具体阻塞本session的session id。
  9. 常规锁管理器热 - LWLOCK_EVENT/LockMgrLock,如果此Event出现在异常等待事件内,代表常规锁的管理器的分区锁产生热点。
    1)可适当调整num_internal_lock_partitions内LOG2_LOCKTABLE_PART/FASTPATH_PART。
    2)具体细节可参考产品文档的相关参数介绍。
Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐