Oracle cursor: pin S wait on X
忘れないようにメモ
DB: Oracle10gR2
現象:CPUが高負荷状態となり、最終的にサービス(インスタンス)は起動しているがSQLPlusを始め全く接続できなくなる。
調査
1.待機イベントを見てみる(V$system_event)
2.「cursor: pin S wait on X」の待機イベントがほとんどタイムアウトしている
3.そもそも「cursor: pin S」ってなにかというと、SQLパース時の
共有プールに対するMutexらしい。
4.V$mutex_sleep、V$mutex_sleep_historyを見てみる。
5.V$mutex_sleep_historyのGETS、SLEEPSの値がとんでもないことに。
6.外人さんの英語記事はMutex SitとかWTFとか素敵な感じですが、
今回のケースは、過度にパースが実行されることにより、
Mutexの待機イベントが発生し、それがCPU負荷をかけて
最終的にOracleがハングした・・。みたいな。
対処
・同じSQLだと判断して待機しないように、SQLのリテラル化を実施。
ちなみに、「_kks_use_mutex_pin」という隠しパラメータがあり、
外人さんは「Falseにしろ!」と言っていますが、今回は効果がありませんでした。
ちなみに、10gではLacheの一部がMutexに置き換えられ、
11gではすべてMutexだそうな。
追記
パラメータをもう一つ設定したら効果あり。
Bug 6795880 - Session spins / OERI after 'kksfbc child completion' wait
_cursor_features_enabled=10
_kks_use_mutex_pin= false