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