Oracle 12c (12.2.0.1) でORA-27103/ORA-27102が発生 その原因と対処方法
Windows Server 2016+Oracle12c環境で、ORA-27103/ORA-27102が発生しました。
Oracle12cは、2018年4月17日時点では最新の12.2.0.1の環境を利用しております。
alertログの抜粋
ORA-27103: 内部エラー
OSD-00033: 追加エラー情報
O/S-Error: (OS 9) 記憶域制御ブロックのアドレスが無効です。
ORA-27102: メモリー不足です
OSD-00043: 追加エラー情報
O/S-Error: (OS 1455) ページング ファイルが小さすぎるため、この操作を完了できません。
Windowsイベントログの抜粋
警告 ***** Microsoft-Windows-Resource-Exhaustion-Detector 2004
リソース消費診断イベント
Windows は仮想メモリの不足状態を診断しました。仮想メモリを多く消費したのは次のプログラムです:
oravssw.exe (5028) は 102766358528 バイトを消費し、oracle.exe (17672) は 7020707840 バイトを消費し、
perfmon.exe (15624) は 1064710144 バイトを消費しました。
このエラー原因に対する考察
素人が見ても、O/S-Errorという記述から、OS側でメモリ利用時によるページング処理でエラーが発生し、
そのエラーをOracleが検知してORA-27102が発生し、最終的にORA-27103(内部エラーのためOracleサポートへ問い合わせが必要)という状態になったことは明らかです。
Oracleサポートとのやり取りで至った原因と対処方法
Oracleのサポートに問い合わせしたところ、いろいろとやり取りがあるものの、Oracleサポートから以下のような回答(結論)を頂いた。
原因
- インシデントファイルからの調査結果として、SGA/PGAに対するメモリ不足や占用といった事象ではない。
- OSのメモリが枯渇状態である。
- Memory (Avail/Total): Ph:28535M/64956M, Ph+PgF:9M/128956M ← この部分で、OSには9MBしかメモリ空き容量がなく、枯渇状態であると判断。
- 本件は DBインスタンスが被害者の位置づけで、ORA-27102 メモリ不足を検知したことになり、DBインスタンス自体には特に異常な状況ではない。
- イベントログから、大量にメモリを消費している
oravssw.exe
がメモリリークしている可能性が考えられる。(が、Oracleが原因とは考えていない。)
対処方法
- 本事象は12.2.0.1で再現性が捉えず、新たにバグの特定ができていない。
事象再現の際に、DBインスタンス、または OS の再起動で回避できるとよく報告されており、回避策の1つと考えられる。 - oravssw.exe のサービスを停止して再起動したら、メモリリークの解消が期待できる。
oravssw.exe サービスはデフォルトで起動するが、不要な場合はサービスを停止して問題ない。
これらのことから
基本的にはOracleサポートの回答として、
- Oracleは悪くない。被害者だ。
- OSもろとも再起動すれば解決するからいいじゃん。
- 気になるなら、影響なければ
oravssw.exe
のサービス停止して様子みよう。
・・・・・・・・え?
Oracleデータベースをセットアップする際、自動でインストールされ、サービスが自動起動するOracleVSSライター
が、大量にメモリを消費し、メモリリークしている(可能性が考えられる)にも関わらず、Oracleの製品バグとして認識されるものではないのか?
メモリリークが発生する原因は、そのシステムのメモリ管理が不十分だからではないのか?
ガベージコレクションの対象にならないインスタンス化されたオブジェクトが無数にメモリ上に展開されるからいけないのでは?
補足
OracleVSSライターのサービスが原因でメモリリークが発生する事象については、
MyOracleSupportの以下ナレッジに障害として認識されている事象がある。
VSS Writer によるバックアップ実行で oravssw.exe よりメモリ・リークが発生する(KROWN:139081) (ドキュメントID 1747904.1)
この記事では障害として認識されている。(記事にも、原因の欄に「製品の不具合です。」と記述されている。)
どうやら、VSS Writerのクリーンアップ処理で、メモリを不必要に割り当てる処理が存在し、それが原因でメモリリークするようです。
この事象はOracle 12.2のバージョンで修正したリリースとして提供されている。
今回の事象は、これと類似している事象のように見受けられるが、修正リリースとされている 12.2以降のバージョンを利用しているにも関わらず、この問題が発生しているので、実際にはこの問題が正しく解消されていない?などの可能性がないのか、疑問である。