夏真っ盛りのある日、2ノードRACで片ノードにCPU負荷が偏っているので、調査して欲しいとの依頼を受けました。
リリースしたばかりの本番環境で、構成は以下の通りです。
ps情報で確認した結果、サーバプロセス数に顕著な偏りは見られませんでした。
また、topで確認した結果、CPU負荷が高い時間帯で共有サーバプロセスがCPUを非常に多く使用しています。
この為、共有サーバプロセスのCPU高負荷がサーバのCPU高騰の原因であろうと思われます。
AWRレポートを取得して、CPU負荷が偏っていた時間帯について調査しました。
結論から言うと、CPU使用時間の長いSQLの実行数が高負荷ノードに偏っていたので、それが原因だと考えられます。
これについてはAP側に接続方式などを確認してもらう事にしましたが、どう見てもAPのSQLでないものがCPU使用時間上位にいたので、それについて調べてみました。
ノード1の「SQL ordered by CPU Time」
CPU Time (s) | Executions | CPU per Exec (s) | %Total | Elapsed Time (s) | %CPU | %IO | SQL Id | SQL Text |
---|---|---|---|---|---|---|---|---|
1,104.18 | 74,208 | 0.01 | 7.61 | 1,080.59 | 102.18 | 0.26 | xxxxxxxxxx | update TABLE_A set... |
135.80 | 4,612,584 | 0.00 | 0.94 | 206.48 | 65.77 | 0.00 | a6r5q9yqaqabs | select obj#, name, stab#, sobj... |
101.52 | 24,685 | 0.00 | 0.70 | 176.52 | 57.51 | 0.41 | c3zymn7x3k6wy | select obj#, dataobj#, part#, ... |
ノード2の「SQL ordered by CPU Time」
CPU Time (s) | Executions | CPU per Exec (s) | %Total | Elapsed Time (s) | %CPU | %IO | SQL Id | SQL Text |
---|---|---|---|---|---|---|---|---|
7,945.56 | 1,402,823 | 0.01 | 47.81 | 8,208.24 | 96.80 | 0.43 | xxxxxxxxxx | update TABLE_A set... |
73.53 | 15,118 | 0.00 | 0.44 | 132.14 | 55.65 | 0.41 | c3zymn7x3k6wy | select obj#, dataobj#, part#, ... |
66.06 | 2,385,744 | 0.00 | 0.40 | 106.47 | 62.05 | 0.00 | a6r5q9yqaqabs | select obj#, name, stab#, sobj... |
「c3zymn7x3k6wy」について、以下のドキュメントを見つけました。
Hard Parse For Large Partitioned Table Is Very Slow (ドキュメントID 2486764.1)
パーティション数の多いテーブルにアクセスするSQLでハードパース時間が非常に長くなるというもので、「c3zymn7x3k6wy」の他にも「9tgj4g8y4rwy8」と「9b4m3fr3vf9kn」の実行時間が長くなるそうです。
今のところバグではないとされているので(機能拡張リクエストはされています)、回避策も無しだそうです。
「a6r5q9yqaqabs」については、以下のドキュメントがヒットしました。
こちらはBug 20853821 の影響で Sql ID 'a6r5q9yqaqabs'が多数実行され、パフォーマンスに影響を及ぼすとの説明で、個別パッチが出ています。
ですがこれらがレポートされたのは調査した中のある1時間だけで、影響も少ないので特に対処は行っていません。
APの偏りについてはAP側で調査中ですので、何かわかったら追記したいと思います。