死锁是指两个应用程序彼此锁定对方所需的数据,这将导致在死锁检测器不介入的情况下,这两个应用程序都无法继续执行。死锁将导致参与者事务由于等待死锁检测而减慢,将导致由于回滚牺牲事务而浪费系统资源,并且将导致在整个进程期间执行额外的系统工作和事务日志访问。如果死锁数增大到超出基线数目,并且事务被重新执行,那么可能是发生了死锁问题。
关于此任务
- 诊断
- 死锁是指两个应用程序彼此锁定对方所需的数据,这将导致在死锁检测器不介入的情况下,这两个应用程序都无法继续执行。在系统自动回滚先前发生死锁的事务之后,牺牲应用程序必须从头开始重新执行该事务。监视这种情况的发生比率有助于避免由于死锁过多而大幅增加系统负载但不被 DBA 所了解的情况。
- 指示信号
- 请查找下列死锁指示信号:
- 一个或多个应用程序偶尔重新执行事务
- 管理通知日志中的死锁消息条目
- deadlocks 监视器元素指示死锁数增加
- int_deadlock_rollbacks 监视器元素指示回滚数增加
- 代理程序等待日志记录被清仓到磁盘时耗用的时间增加,这由
log_disk_wait_time 监视器元素指示
- 要监视的内容
- 死锁的成本会有所变化,并且与所回滚的事务的长度成正比。虽然如此,任何死锁通常都表明发生问题。
实际上,可以通过三种方法来检测死锁事件:
- 设置锁定事件监视器,并设置 mon_deadlock
数据库配置参数以捕获有关数据库中发生的所有锁定事件的详细信息
- 在管理通知日志中监视死锁消息以及附带的基本信息
注: 为了能够将死锁消息写入管理通知日志文件,请将
mon_lck_msg_lvl 数据库配置参数的值设为 2。
- 通过表函数来监视指示器监视器元素
大多数用户采用第一种方法。通过监视关键的指示器监视器元素来检测死锁的发生时间,用户可以通过检查事件监视器所收集的信息来获取详细信息。
- 关键的指示器监视器元素如下所示:
- deadlocks 值为非零
- int_deadlock_rollbacks 表明回滚数由于死锁事件而增加
- log_disk_wait_time 表明代理程序等待日志被清仓到磁盘时耗用的时间增加
如果您观察到这里列示的一个或多个指示信号,那么很有可能存在死锁问题。请遵循“下一步做什么”一节中的链接来解决此问题。
开始之前
通常,观察到的任何死锁都被认为是异常情况。为了能够有针对性地评估系统行为是否不正常(这可能包括处理延迟以及性能不佳),您必须要有描述了系统典型行为(基线)的信息。然后,可以将您观察到的可疑异常行为与基线进行比较。通过安排定期的运作监视任务来收集基线数据是故障诊断过程的关键组成部分。有关确定系统的基线操作的更详细信息,请参阅:“对系统性能进行运作监视”。
有关如何监视死锁锁定事件的指示信息,请参阅监视锁定事件。
下一步做什么
在诊断出您所遇到的问题可能由死锁所致之后,请执行步骤来解决问题:解决死锁问题