商用データベースに関心のある専門家のために、CERNのデータベース専門家による出版物の翻訳を準備しました。 本日の記事では、SystemTapを使用したOracle DBパフォーマンスのトレースとデバッグに関する一連の記事を公開しています。

この記事では、 SystemTapを使用してOracle DBMSをトラブルシューティングする方法について説明します。 特に、Oracleプロセスとそのユーザー空間機能を探索する方法を学習します。 これらの方法は、技術の裏側を調べ、トラブルシューティングやパフォーマンス調査の有効性を高めることに興味がある人にとっては便利で楽しいものになります。
はじめに
ユーザー空間トレースは、V $ビューや「イベント10046」トレースファイルなどのOracleのパフォーマンスとプロファイリング情報を補完するために使用できる非常に強力な方法であり、Oracleカーネルについての高度な診断と学習にも使用できます。 DTraceを実装したSolarisを中心に、同様の研究が数年にわたって利用可能です(たとえば、 Tanelaのブログを参照)。
カーネルとユーザー空間をプロファイルできる動的トレースツールも、最近のカーネルへの追加のおかげで、Linuxの世界で勢いを増しています。 動的トレースデータを収集、集約、および出力するためのインターフェイスを提供するツールがいくつかあります。 SystemTapは最も開発されたものの1つですが、2つのDTraceポートを含む新しいツールが常に登場しています。 このトピックを調べるには、LinuxCon 2014に関するBrendan Greggのプレゼンテーションを参照してください。
SystemTapを使用してFrits Hooglandのユーザー空間をトレースできることを最初に知りました。高度なトラブルシューティングを可能にする機会、つまり、これがパフォーマンスを調整するためにOracleワークロードを調査する方法に非常に感銘を受けました高度な診断。
さらに、この記事で説明されている方法がRHEL 6.5でも機能することを知ってうれしく思いました。これは、私にとって素晴らしいニュースです。なぜなら、更新を待たずに多くの既存のシステムでSystemTapの使用を開始できるからです。最新のカーネルバージョン。
SystemTapのドキュメントには、ユーザースペースプローブの実装に関する追加情報が含まれています。3.5より古いLinuxカーネル(UEK3でRHEL 7.0、OL 7.0またはOL6.5を使用する場合など)では、SystemTapはUPROBESモジュールを使用して、SystemTapが使用できる古いカーネルでユーザースペースをトレースしますUTRACEカーネル拡張機能(利用可能な場合)。 SystemTapはUTRACEとUPROBESの両方でユーザー空間のトレースを提供できますが、他の動的トレースツールはUPROBESでのみ動作するようであり、したがってLinuxの以降のバージョンでのみ動作します。 Fritzが上記の記事で書いているように、ユーザー空間をトレースするにはSystemTap 2.5以降が必要です。 この記事の執筆時点で、SystemTap 2.6がリリースされました。
これは、UTRACE拡張機能が構成されているかどうかを確認する方法です。
# grep CONFIG_UTRACE /boot/config-`uname -r` CONFIG_UTRACE=y
そして、ここでUPROBESが利用可能かどうかがチェックされます:
# grep CONFIG_UPROB /boot/config-`uname -r` CONFIG_UPROBES=y CONFIG_UPROBE_EVENT=y
以下に、OracleのSystemTapでユーザー空間トレースを使用するためのいくつかの例、アイデア、テストコードを示します。 この記事で説明されているスクリプトは、このリンクにあります。
ディープダイブ:SystemTapはOracle待機イベントインターフェイスデータとX $テーブルを読み取ります
このセクションでは、SystemTapをOracle待機イベントインターフェイスに接続する方法を学習します。 これにより、SystemTapプローブを使用して収集されたデータとOracle待機イベントインターフェースから収集されたデータの2種類のツールを組み合わせることができます。 したがって、より複雑な研究への道を開いています。
主なことは、Oracleカーネルの「正しいポイント」でSystemTapプローブを作成し、必要な情報を読み取らせることです。
DTraceおよびOracleでの以前の作業で説明したように、この目的にはOracleカーネル関数「kskthewt」を使用できます。 おそらく、対応するパフォーマンスカウンターを更新するために、各待機イベントの終了時にOracleカーネルによって呼び出されます。 最初のステップは、Oracle実行可能ファイルがkskthewt関数に入った後に開始するプローブを作成することです。 次のステップは、必要な情報をSystemTapに読み取らせることです。 プロセッサのレジスタとメモリ領域が利用可能です。 x86呼び出し規約で説明されているように、一部のレジスタは関数に引数を渡すために使用されます。 その他の場合、CPUレジスタには、親関数の呼び出し後に「残っている」有用な情報が含まれている場合があります。 メモリ領域、特にSGAから直接読み取ることにより、ほとんどのOracle計測データの道が開かれます。
Oracle kskthewt関数のプローブの作成を支援するFritz Hooglandとのコラボレーションで最近発見した追加の事実:
- 実行がkskthewt関数に進むと、 CPUレジスタR13がメモリ構造X $ KSUSEへのポインターを格納します(オフセット付き)。 ほとんどの場合、 R12は同じアドレスを指しているように見えますが、そうでない場合もあったので、 R13を使用することを好みます。
- X $ KSUSEはV $ SESSIONの「基礎となる」サービステーブルであるため、多くの興味深い情報が含まれています。 X $ KSUSEは、SGAのセグメント化された配列としてメモリ内で際立っています;この魅力的なトピックの詳細については、SGA内部に関するJulian Dykeのプレゼンテーションを参照してください。
- V $ SESSION.SADDR -V $ SESSIONおよびX $ KSUSEの現在のセッションデータのベースアドレス-オフセットを減算することにより、R13の値から取得できます。 オフセット値は、Oracleのバージョンとポートによって異なり、SystemTapまたはgdbを使用して「実験的に」見つけることができます(詳細については、スクリプトtrace_oracle_events_debug.stpディレクトリーを参照してください)。
- 関心のあるX $ KSUSEフィールド(つまり、V $ SESSION列の値)は、X $ KQFCOおよびX $ KQFTAからのクエリを使用して計算されたオフセットを使用して、X $ KSUSEのベース値から見つけることができます(スクリプト: ksuse_find_offsets.sqlを参照)。
- RDIレジスタ(SystemTapプローブのarg1引数にマップされる)がタイムスタンプ値に設定されていることが発見されました。 これは待機イベントのタイムスタンプです。これは、イベント10046のトレースファイルで確認できる値と同じです(有効になっている場合)。
- RSIレジスタ(SystemTapプローブのarg2)は、待機イベント番号に設定されます。
これらすべてを組み合わせると、待機イベントと必要なデータv $セッションを収集して出力するSystemTapスクリプトを作成できます。 このようなスクリプトの例を図に示します。 スクリプトは、zipファイルとしてここからダウンロードできます。 直接リンク: trace_oracle_events_11204.stpおよびtrace_oracle_events_12102.stp これらのスクリプトは、RHEL6.5上のOracle 11.2.0.4およびOEL7上のOracle 12.1.0.2のバージョンでそれぞれテストされました。

図 1 :Oracleカーネル関数とSGAメモリから待機イベントとV $ SESSIONの詳細を収集するSystemTapプローブからのスクリプトとサンプル出力。
注:上記の例は、SystemTapの結果がsed -f eventsname.sedに渡されることを示しています。 これは、イベントID番号を文字列に変換するために必要です。 eventsname.sedファイルは 、 eventsname.sqlスクリプトを実行して生成されます。
Systemtapでの待機イベントデータの集約とフィルタリング
他の動的トレースツールに固有の SystemTapの長所の 1つは、オンザフライの集約とフィルタリングです。 これにより、収集されるデータの量が削減されるため、トレース操作のフットプリントを最小限に抑えながら、意味のあるレポートを作成してリアルタイムでトレースする機能を維持できます。 待機イベントインターフェースに接続するSystemTapプローブを作成する上記の例に基づいて、集計とフィルターを追加して、マイクロ秒単位の正確な待機イベントのヒストグラムを計算できます。
1つの単純で印象的な結果を簡単に再現できます。12cで待機イベントのマイクロ秒ヒストグラムを作成する機能を実際に移植するスクリプトを記述します。 これは、ソリッドステートデバイス(SSD)からのランダムディスク読み取りなどの短いイベントを調べるときに非常に役立ちます。 カスタムフィルターを使用すると、特定のユーザーまたは特定のファイルの待機イベントの詳細、およびその他の選択した条件を集約できます。 一般に、SystemTapはプローブを開発するための大きな自由と十分な機会を提供します。
ここからダウンロードできるサンプル付きの2つのスクリプト、ダイレクトリンク: histograms_oracle_events_11204.stpおよびhistograms_oracle_events_12102.stp

図 2 :SystemTapプローブからのスクリプトおよびサンプル出力。マイクロ秒単位の正確な待機イベントのヒストグラムを計算します。
Oracle待機イベントの待機時間データを収集およびフィルタリングするためのSystemTapプローブを作成する別の方法を検討してください。 これを行うには、Oracleカーネル関数の呼び出し後に取得した追加のデータが必要です:kews_update_wait_time関数はkskthewtの直前に呼び出され 、CPU RSIレジスタの値をマイクロ秒単位のレイテンシに設定します( RSIレジスタはSystemTapプローブでarg2として使用可能です)。 また、前の作業で提供された情報を調べてください。 これにより、Oracleのバージョンに関係なくイベントヒストグラムを計算するプローブを作成できます。 サンプルスクリプト: histograms_oracle_events_version_independent.stp

図 3 :Oracleのバージョンに関係なく、マイクロ秒単位の正確な待機イベントヒストグラムを計算するSystemTapプローブからのスクリプトおよびサンプル出力。
SystemTapユーザー空間プローブを使用したOracle論理I / Oトレース
Oracle論理I / Oのトレースを含む、Systemtapユーザースペースプローブを使用できます。 このプローブは、Tanel Poderの研究(DTraceを使用したqer_trace.shスクリプトを探す)とAlexander Anokhinの広範な研究に基づいています。
Oracleカーネルのkcbgtcr関数に固執すると、Alexander Anokhinが説明したように、論理読み取りに関する情報を取得できます。 kcbgtcr = Kernel Cache Buffer Get Consistent Read、および呼び出された関数の最初の引数は、テーブルスペース、相対ファイル番号、ブロック番号、および一貫性のある読み取りオブジェクト番号に関する情報を持つメモリ構造を示します。 これらすべてを使用して、プロファイリングプローブtrace_oracle_logical_io_basic.stpを作成できます。
probe process("oracle").function("kcbgtcr") { printf("tbs#=%d, rfile=%d, block#=%d, obj#=%d\n",user_int32(u64_arg(1)), user_int32(u64_arg(1)+4) >> 22 & 0x003FFFFF, user_int32(u64_arg(1)+4) & 0x003FFFFF, user_int32(u64_arg(1)+8)) }
これに基づいて、集計を実行し、論理読み取りの統計を計算するプローブを作成することもできます(例: trace_oracle_logical_io_count.stp) 。

図 4 :Oracleで論理I / O情報を収集および集約するためのSystemTapプローブからのスクリプトおよびサンプル出力(一貫した読み取り操作のため)。
Systemtapは、Oracle待機イベントデータをOSトレースと統合できます。
システムコールの追跡は、SystemTapの強さと優先事項です。 この機能を使用すると、Oracle待機イベントインターフェイスデータ(上記のようにSystemTapを使用して収集された)とSystemTap OSプローブからのデータを組み合わせることにより、Oracleトレースプロセスをより深く掘り下げることができます。
以下に、OSからブロックデバイスとしてストレージが見えるようになったときにASMを使用したOracleに基づく例を示します(この例ではasmlibは使用されません)。 この場合、OracleプロセスによるI / O呼び出しは通常、同期シングルブロックI / Oのpreadとpwrite、マルチブロックおよび/または非同期I / Oのio_submitとio_geteventsになります。 下位レベルでは、ブロックデバイスのすべてのI / Oをioblock要求として追跡できます。
スクリプトtrace_oracle_iocalls_12102.stpを使用して、Oracle待機イベント、システムI / Oコール、およびブロックI / Oの関係の調査を開始できます。

図 5 :SystemIapは、OS I / OのトレースとOracle待機イベントのトレースをプローブします。 これにより、Oracle I / Oイベントの基礎となるアクションと関連するOSアクションの統合ビューが提供されます。
以下の図6に、OracleへのI / Oトレースの例を示します。ここでは、OSへの事前呼び出しにより、単一ブロック(同期)I / Oが実行されます。 これは、OracleランダムI / Oの典型的なアクセスシナリオです。 OS側では、pread呼び出しはio_block_requestとしてブロックデバイススタックにプッシュされます 。 Oracleの待機イベントインターフェイスでは、I / O操作は、ファイル番号とブロック番号(パラメーターp1およびp2)を持つdbファイルの順次読み取り待機と見なされます

図 6 : SystemTapプローブを使用してプロファイルされたOracleが単一ブロックI / Oを実行します。 これにより、I / O操作のエンドツーエンドのトレースが提供されます。OS呼び出しの詳細と、対応するOracle待機イベントデータを確認できます。
Linuxの非同期I / Oインターフェイスは、マルチブロックI / OのためにOracleでよく使用されます。 これは、まずパフォーマンス上の理由から行われ、ファイルシステムで許可されている場合にのみ実行できます(このアプローチは、ASMを使用しているため、ここで示した例で行われます)。 Oracleの非同期I / Oを学習すると、メイントピックから離れすぎてしまいます。そのため、いくつかの基本的な観察と、SystemTapプローブを使用してこの問題をさらに調査する方法の例を説明します。
非同期IOの場合、カーネルは実際にI / Oを実行し、ユーザープロセスはI / O操作のみを要求し、後で必要な情報の返却を要求します。 非同期I / Oを調べるときは、少なくとも2つの呼び出しをトレースする必要があります。1つはI / O要求の送信(io_submit)、もう1つは結果の受信(io_getevents)です。 次に、I / O要求はブロックI / Oレベルに渡されます。 この段階では、図7の例に示すように、いくつかの小さな操作に分割できます。また、Martin Bachの記事「Linuxでの最大I / Oサイズの増加」も参照してください。 Oracle I / Oトレースの詳細については、 Fritz HooglandのgdbによるOracleのプロファイリングに関する優れた研究と、マルチブロックI / Oに関する彼の研究を参照してください。

図 7 :Oracleが非同期I / Oを実行することを決定した場合のマルチブロック読み取りのOracle I / Oプロファイリングを示すSytemTapプローブの例 OSレベルのI / O要求はio_submitを使用して行われ、結果はio_geteventsを使用して収集されます。 また、SystemTapでは、このテストに使用したシステムでI / O操作が最大サイズ512 KBの小さな断片に分割されたときに、ブロックデバイスレベルで何が起こるかを確認できます。
デモブースのセットアップとドキュメント
以下に、上記のメソッドとスクリプトを試すためのテスト環境をセットアップするためのヒントを示します。
-Oracle Virtual Boxをダウンロードしてインストールします
-たとえば、 https://edelivery.oracle.com/linuxからOL 7.0(またはOL 6.x)をダウンロードします。
-kernel-devel rpmもインストールする
SystemTapと組み合わせてプローブを使用する場合は、使用しているカーネルのdebuginfoおよびdebuginfo-commonパッケージをダウンロードしてインストールします。 RPMは、OEL 7およびOEL 6について、それぞれhttps://oss.oracle.com/ol7/debuginfo/およびhttps://oss.oracle.com/el6/debuginfo/にあります 。 非同期I / OのOS呼び出しを追跡する場合は、libaio-debuginfoとlibaio-develを同じ方法でインストールします。
Oracleユーザースペース機能に対してのみプローブを実行する場合は、カーネルおよびlibaioのdebuginfoパッケージのインストールをスキップできることに注意してください。
ここで説明するスクリプトには、systemtap 2.5以降が必要です。 すでに古いバージョンがある場合は、systemtapをアンインストールすることを検討してください。
https://sourceware.org/systemtap/ftp/releases/ (この記事の執筆時点でバージョン2.6)で最新のsystemtapをダウンロードしてください 。
ダウンロードしたソースコードからSystemTapをインストールするには、次を実行します。
./configure # configure , ; , make make install
インストール後のチェックとして、次を実行します。
stap --help
SystemTapのドキュメントを学習するには、言語 ガイドとtapsetリファレンスマニュアルだけでなく、初心者向けガイドも参考にしてください 。
Oracleバージョン12.1.0.2または11.2.0.4をダウンロードしてインストールします。
ソフトウェアはこちらからダウンロードできます: https : //edelivery.oracle.com/
Oracleデータベースを備えたプレインストールされた仮想マシンは、OTNからダウンロードできます(たとえば、このリンク )
Oracleのドキュメントに加えて、インストールガイドもhttp://www.oracle-base.com/articles/12c/articles-12c.phpおよびracattack wikiで入手できます 。
おわりに
動的トレースは、Oracleカーネルのユーザースペースレベルでプローブを使用可能にし、カーネルレベルのLinuxプローブを使用して、Oracleパフォーマンス情報(特に、待機イベントインターフェイスと統計カウンターからのデータ)を補完するために使用できます。 これらの方法は、パフォーマンスの問題を調査し、問題を診断する際に利用可能なデータの量を大幅に増やすことができるため、専門家が体系的なアプローチを使用して問題を解決し、一般的により成功し、行動を一貫させることができます。
この記事では、始めるためのヒントと例をいくつか紹介しました(このリンクまたはGithubからダウンロードできます)。 オラクルおよびその他の複雑なプラットフォームの研究および診断のために提案された方法の適用と改善は、大きな可能性を秘めた有望な方向です。 今後の出版物では、さらにいくつかの例を取り上げる予定です。 提案された例を学習して楽しんでいただけたことを願っています。また、これらの方法をシステムで使用することで、忍耐強く、これらの方針、成功、および喜びにたどり着いたすべての読者にお願いします。
謝辞
オリジナルのアイデアがこの資料を書くきっかけとなった3人の著者、 Brendan Gregg 、Tanel Poder、Frits Hooglandに感謝します。 この記事をチェックしてくれたFritz Hooglandに感謝します。

このリリースがお役に立てば幸いです。 次のパートでは、SystemTapの機能を使用して、Oracleの論理的および物理的なI / Oトレースの複雑さを掘り下げます。