技術ブログ
技術ブログ
このエントリは (全部俺) Oracle ACE Director Tanel Poder Advent Calendar 2013 16日目の記事です。
Advanced Oracle Troubleshooting Guide, Part 9 - OStackProfを使用してSQL*Plusからプロセススタックプロファイリング で使われていたoStackProf oStackProf.sqlについて書きます。
oStackProf は、oradebug short_stackを使用して取得したプロセスのコールスタックを、指定された感覚で指定された回数サンプリングし、コールスタックをサマリしてくれるスクリプトです。典型的な使い方や機能については、 Advanced Oracle Troubleshooting Guide, Part 9 - OStackProfを使用してSQL*Plusからプロセススタックプロファイリング で説明されていますので、内部実装の観点で気になったところをメモ書きしておきます。
これまで、V$ビューを非常に高い頻度でサンプリングして統計情報のサマリをレポートしてくれるスクリプト、WaitProfや、LatchProfをご紹介してきましたが、oStackProfは、サンプリング対象の情報ソースがoradebug short_stackの実行結果であるため、非常に高い頻度でサンプリングすることは不適切であり、かつ有益でないので、dbms_lock.sleep()を使用し、一定間隔sleepしてから定期的にoradebugを実行する作りになっています。
サンプリング処理=繰り返し処理と考えると、なんらかのループ処理で実装することを考えるのが一般的だとは思いますが、SQLは手続き型プログラミング言語ではないため、forやwhileのような「繰り返し」処理がありません。もちろん、Oracle Databaseにおける手続き型プログラミング言語であるところのPL/SQLには「繰り返し」処理がありますが、PL/SQLからoradebug short_stackを呼び出すことはできません。
SQL> DECLARE 2 BEGIN 3 EXECUTE IMMEDIATE 'oradebug setmypid'; 4 EXECUTE IMMEDIATE 'oradebug short_stack'; 5 END; 6 / DECLARE * 行1でエラーが発生しました。: ORA-00900: SQL文が無効です。 ORA-06512: 行3
これらの制約のため、oStackProfでは、サンプリング処理を繰り返し処理により実装して「いません」。実行するすべてのコマンドを一旦テキストファイルに出力し、出力したテキストファイルを外部コマンドファイルとして読み出し+実行することでサンプリング処理を実装しています。
具体的には以下のようなテキストファイルを生成し、これをSQL*plusの'@'コマンドで実行しています。
(b201)>type ostackprof_12016.tmp spool ostackprof_12016.txt oradebug short_stack exec dbms_lock.sleep(1) oradebug short_stack exec dbms_lock.sleep(1) oradebug short_stack exec dbms_lock.sleep(1) oradebug short_stack exec dbms_lock.sleep(1) oradebug short_stack exec dbms_lock.sleep(1) oradebug short_stack exec dbms_lock.sleep(1) oradebug short_stack exec dbms_lock.sleep(1) oradebug short_stack exec dbms_lock.sleep(1) oradebug short_stack exec dbms_lock.sleep(1) oradebug short_stack exec dbms_lock.sleep(1) spool off
実行して得られた結果を、stack_helper.vbs で整形および集計してレポートを表示します。
HOST "cscript //nologo %SQLPATH%\stack_helper.vbs -strip < ostackprof_&ostackprof_spid..txt | sort | cscript //nologo %SQLPATH%\stack_helper.vbs -report | sort /r"
Advanced Oracle Troubleshooting Guide, Part 9 - OStackProfを使用してSQL*Plusからプロセススタックプロファイリングでも触れられていましたが、実際のトラブルシュートで使用できるマシンがWindowsマシンであることが多いため、Tanel Poderさんは oradebug short_stackの実行結果を整形および集計する処理をVBScriptで実装しています。言語としての評判はあまりよくありませんし、私もあまり好きではありませんが、Windows環境でインストール不要なプログラム処理系となると、確かにVBScript(かJSscript)になってしまいますよね。