【MOS】故障排除“cursor: pin S wait on X”等待事件 (Doc ID 2901617.1)

0    222    1

Tags:

👉 本文共约4522个字,系统预计阅读时间或需17分钟。

故障排除“cursor: pin S wait on X”等待事件 (Doc ID 2901617.1)

Troubleshooting 'cursor: pin S wait on X' waits. (Doc ID 1349387.1)

排错步骤

什么是“cursor: pin S wait on X”等待事件?

游标等待与某种形式的解析相关联。 当会话尝试在共享模式下获取 mutex pin 资源,但另一个会话在同一个游标对象上以独占方式持有该 mutex pin 资源时,就可能会发生此等待事件。通常,等待“cursor: pin S wait on X”等待是一种症状,而不是原因。 可能存在潜在的调优要求或是遭遇了已知问题。

是什么引发“cursor: pin S wait on X”等待呢?

  • 首先,要保证 shared pool 的大小设置正确。

    一般来说,如果 shared pool 大小不足或者承受负载的能力不足,就可能表现为“cursor: pin S wait on X”等待。如果使用了自动内存管理模式,那么这通常不是问题,详见:

    Document 443746.1 Automatic Memory Management (AMM) on 11g

  • 频繁硬解析
    如果硬解析的频率很高的话,在 mutex pin 上就会发生竞争。

  • 子游标版本数过高
    当子游标版本数过高时,需要检查一长串版本,这可能会导致对该事件的争用。

  • 已知的 BUG

  • 解析错误,详见以下文档:

    Document 1353015.1 How to Identify Hard Parse Failures

如何诊断原因

获取诊断信息用以帮助定位原因。

  1. 比较“Cursor: pin S wait on X”等待期间和正常(基准)情况的 AWR 和 ADDM 报告。基准向我们展示了在问题和正常期间发生的典型“背景”下并发和活动情况,并且可能有助于识别出(例如)子游标版本数过高的 SQL。
    建议半小时到一小时间隔运行 AWR 和 ADDM 来收集信息,收集信息命令如下所示:

  1. 有时为了匹配已知问题需要获取 system state dump 信息。例如,如果 AWR 中没有明显的候选 SQL,则需在 system state dump 中捕获 mutex bin 资源持有进程或等待进程以专注于潜在问题的分析。当进程发生“cursor: pin S wait on X”等待时,取得 System State Dump:

  1. Errorstack:获取进程信息的另一种方法是使用 Errorstack。假设可以识别一个阻塞源,可以获取 Errorstack,Errorstack 提供的信息与 System State 的信息大致相同,但 trace 量可以很大程度的减少。一旦找到阻塞源的 ospid,就可以生成一个 Errorstack:

尤其是通过 trace 中的 Stack 信息可用于匹配已知问题。

Systemstate 和 errorstack 有可能不是很易读,此时,需要提交 SR 来解析 trace 文件。

  1. 运行 system state dump 并不总是可行的, 因此也可以参阅以下文档查找阻塞进程:

Document 786507.1 How to Determine the Blocking Session for Event: 'cursor: pin S wait on X'

本人提供Oracle(OCP、OCM)、MySQL(OCP)、PostgreSQL(PGCA、PGCE、PGCM)等数据库的培训和考证业务,私聊QQ646634621或微信dbaup66,谢谢!
  1. 更进一步,可以运行下面的 sql 来查找等待进程:

  1. 在 11g 的 RAC 环境,同获取 system state dump 相比,可以使用另一种资源密集度较低的工具:

Document 459694.1 Procwatcher: Script to Monitor and Examine Oracle DB and Clusterware Processes

如何检查诊断。

  1. 通过 AWR 报告查找高解析和高子游标版本数。
    点击 AWR 报告中 Main Report 下的 SQL Statistics:

然后,在 SQL Statistics 下点击“SQL ordered by Parse Calls”或者“SQL ordered by Version Count”查看如下信息:

image-20240414100908582

SQL ordered by Parse Calls

从上面的一览中,调查 Top SQL 确定 parse calls 量是否过多,或者能否减少解析回数。

SQL ordered by Version Count

从上面的一览中,调查高子游标版本数的 SQL。为什么对象语句的子游标无法共享?能否解决?

  1. 通过 System state 和 errorstack,我们可以通过 Stack 信息来匹配已知案例。
    Systemstate 和 errorstack 是否有用依赖于“在正确的时间”获取该信息。 在快速运行的系统上,进程可能已经脱离了 Hang 的状态,因此无法显示有效的锁的持有者和等待者的信息。在一个完美的例子中,Systemstate 应该显示阻塞源进程和被阻塞进程或其中之一。 阻塞源进程的 Stack 信息可能帮助确认已知问题。

潜在的解决方案

  1. 通过调查应用程序或 SQL 来调优具有高解析回数的 SQL。

在 AWR 报告中,解析统计信息位于报告顶部的 load profile 下:

在这个例子中主要是软解析,然而,如果有大量的硬解析,表明有可能使用了文字或者是进入了大量的新 SQL。在这种情况下,请考虑使用绑定变量代替文字。
如果软解析的百分比很高,则检查应用程序确认是否正在使用可共享的 SQL。
理想情况下,Execute to Parse 应该接近 100%。 应用程序应该解析更少而并执行多次。详见:

Document 62143.1 Understanding and Tuning the Shared Pool

同时,请记住如果 shared pool 刷新了的话,SQL 也会做硬解析。这也会引发 Mutex 的等待。因此,一旦硬解析,请确保 SQL 在内存中,并监视互斥等待是否得到缓解。

  1. 高子游标版本数也会引发“cursor: pin S wait on X”等待。
    使用 V$SQL_SHARED_CURSOR 视图确认高子游标版本数产生的潜在原因:

Document 438755.1 Formated V$SQL_SHARED_CURSOR Report by SQLID or Hash Value
Document 296377.1 Troubleshooting: High Version Count Issues

有一些值得注意的 BUG,其中高版本数是一个因素:

Document 10157392.8 Bug 10157392 - High version counts for SQL with binds (BIND_MISMATCH)
Document 9689310.8 Bug 9689310 - Excessive child cursors / high VERSION_COUNT / OERI:17059 due to bind mismatch

  1. 更多已知瑕疵,请参阅以下文档并点击已知 BUG:

Document 1298015.1 WAITEVENT: "cursor: pin S wait on X" Reference Note

单击适用的版本并查看具有类似情况的 BUG。

  1. 如果数据库已从 10g 迁移到 11g 并且出现 Mutex 性能问题,请考虑 11.2.0.2.2 psu + 修复但未发布的 Bug 12431716。补丁 11204 中已经包含了许多 Mutex 锁的修复。因此,如果可能的话,请应用最新的 PSU 补丁集。

12c 上的已知案例

如果从 11g 升级到 12c 以后,发生了“cursor: pin S wait on X”等待,请查阅下面的文档:

Document 1949691.1 High wait time for 'cursor: pin S wait on X' After Upgrade
Document 18018515.8 High CPU in qctHasFakeBind (can cause 'cursor: pin S wait on X' waits)
Document 16448569.8 PQ hang/deadlock possible - "cursor: pin S wait on X" waits
Bug 22500027 : PX SLAVE BLOCKS 144 SESSIONS DUE ROWCACHE LOCK DURING DATAFILE RESIZE OPS
Document 2006145.1 High Waits for 'cursor: pin S wait on X' due to Dynamic Sampling Against Parallel Queries

解决其他问题

有关解决其他性能问题的指导,详见:

Document 1377446.1 Troubleshooting Performance Issues

参考

NOTE:2006145.1 - High Waits for 'cursor: pin S wait on X' due to Dynamic Sampling Against Parallel Queries
NOTE:1949691.1 - High Wait Time for 'cursor: pin S wait on X' Event After Upgrade
NOTE:2096561.1 - ORA-04031 Memory Errors with Argument KGLH0^
NOTE:459694.1 - Procwatcher: Script to Monitor and Examine Oracle DB and Clusterware Processes
NOTE:438755.1 - High SQL Version Counts - Script to determine reason(s)
NOTE:10157392.8 - Bug 10157392 - High version counts for SQL with binds (BIND_MISMATCH)
NOTE:1291879.1 - Oracle Database Patch Set Update 11.2.0.2.2 Known Issues
NOTE:1298015.1 - WAITEVENT: "cursor: pin S wait on X" Reference Note
NOTE:9689310.8 - Bug 9689310 - Excessive child cursors / high VERSION_COUNT / ORA-600 [17059] due to bind mismatch
BUG:10157392 - HIGH VERSION COUNT OF RECURSIVE SQL THOUGH THE FIX FOR BUG 10086843 WAS APPLIED
NOTE:786507.1 - How to Determine the Blocking Session for Event: 'cursor: pin S wait on X'
NOTE:2119923.1 - Bug 20370037 - Shared Pool from KGLH0 constantly growing causing ORA-04031 and Latch contention
BUG:9689310 - SPORADIC BUNCHES OF ORA-600 [17059]
NOTE:1377446.1 - * Troubleshooting Performance Issues
NOTE:62143.1 - Troubleshooting: Understanding and Tuning the Shared Pool
NOTE:296377.1 - Troubleshooting: High Version Count Issues

标签:

Avatar photo

小麦苗

学习或考证,均可联系麦老师,请加微信db_bao或QQ646634621

您可能还喜欢...

发表回复