SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

sys.dm_os_performance_counters でパフォーマンスモニターの情報を取得する際のポイント

leave a comment

何年も前に書いた sys.dm_os_performance_counters の情報取得時の注意点 の補足になります。
なぜ、このタイミングで改めて書いたかというと、sys.dm_os_performance_counters は、SQL Server on Linux で SQL Server のパフォーマンスを確認する際に重要な DMV となるからです。
SQL Database で情報を確認する場合にもこの DMV は重要となりますので、値の成型方法は覚えておいて損はないかと。

詳細については、次の情報も併せて確認してください。

取得用のクエリについては sys.dm_os_performance_counters の加工.sql で、私が作ったものを公開していますので、ご参考になれば。

上述の DMV から取得した情報ですが、cntr_type に応じて、次の 3 種類の利用方法があります。

  • 値をそのまま利用
    • cntr_type = 65792
  • 2 点で情報を取得し、その差分の値を取得間隔で除算する
    • cntr_type = 272696320 / 272696576
  • 2 種類の項目を使用して、その値を除算することパーセントを算出する
    • cntr_type = 537003264 / 1073874176

cntr_type に応じた、値の利用方法は次のようになります。

cntr_type 16進値 カウンターのタイプ
65792 0x00010100 PERF_COUNTER_LARGE_RAWCOUNT 瞬間的な値を示す 64 ビット値
(
値をそのまま利用可能)
272696320 0x10410400 PERF_COUNTER_COUNTER 1 秒あたりのイベント発生率を示す 32 ビット値

後続の値との差を取り、2つの値のタイムスタンプの秒数で除算する(A2 – A1) / (A2 Timstamp – A1 Timestamp)

272696576 0x10410500 PERF_COUNTER_BULK_COUNT 1 秒あたりのイベント発生率を示す 64 ビット値

後続の値との差を取り、2つの値のタイムスタンプの秒数で除算する(A2 – A1) / (A2 Timstamp – A1 Timestamp)

537003264 0x20020500 PERF_LARGE_RAW_FRACTION 比率をパーセントで表すことができる 64 ビット値Base Counter の値で除算することで、比率を算出できるRAW_FRACTION / RAW_BASE * 100
1073939712 0x40030500 PERF_LARGE_RAW_BASE PERF_LARGE_RAW_FRACTION との計算で使用される 64 ビット値
1073874176 0x40020500 PERF_AVERAGE_BULK 平均メトリックを示すために使用される 64 </
span>ビット値
後続の値との差を取り、後続の Base Counter の差で除算する(A2 – A1) / (A2 Base – A1 Base)

cntr_type = 65792 については、取得した値がそのまま利用可能で、大体の項目についてはこれに該当しているかと。
代表的なものとしては、Memory Manager の項目などがあります。

この項目の場合「SQL Server のメモリ使用量」を示すものとなり、取得した値を利用そのまま利用することが可能です。
(Pages となっている項目が存在することもありますが、その場合は、値に 8KB をかけることでサイズに変換できます)

cntr_type = 272696320 / 272696576 については、2 点で情報を取得し、その差分を取得間隔で除算することで利用することが可能です。
代表的なものとしては、SQL Statistics の項目などがあります。

この項目の例としては、「Batch Requests/sec」がよく使用するものとなるかと。

この項目は、秒間の SQL のバッチ実行数を表すものであり、SQL Server のインスタンスに対して、どの程度クエリが実行されているかを把握するために使用するものになるのですが、この項目を DMV から取得する場合には、瞬間の値だけをとればよいのではなく、必ず 2 点で取得する必要があります。
2 点で取得した結果が A1 (1 回目の取得) : 50 / A2 (2 回目の取得) : 100 で A1 / A2 の取得間隔が 10 秒だった場合、「(100 – 50) / 10 = 5 Batch Request / sec」となります。

cntr_type = 537003264 / 1073874176 については、2 つの項目をペアとして使用して、その値で除算することで利用することが可能です。
代表的なものとしては、Buffer Manager の項目などがあります。

この項目の例としては「Buffer cache hit ratio」がよく使用するものになるかと。
この項目は、バッファーキャッシュのヒット状況を表すものになるのですが、この項目単体では利用することはできず、ペアとなる値と組み合わせて使用する必要があります。

「Buffer cache hit ratio」の場合、「Buffer cache hit ratio base」がペアとなる値となります。
Buffer cache hit ratio の場合「Buffer cache hit ratio / Buffer cache hit ratio base * 100」というような計算を行うことで、キャッシュヒット率 (%) を算出することができます。

これらの加工方法を知っておくと、様々なモニタリングの仕組みで有効に活用できるかと。

SQL Server on Linux の場合、パフォーマンスモニターを使用した、パフォーマンス情報の取得ができませんので、SQL ベースで情報の取得ができるようになっていると、問題解決の即応性にもつながりますので。

モニタリングのソフトでは、「SQL を実行できるプラグイン」が含まれていることが多く、このようなデータ加工方法を知っておくと性能情報の取得にも役に立てることができるのではないでしょうか。
(時系列 DB だと、一つ前のデータとの差分抽出も簡単にできるものが多いですので、2 点間の差分も容易に出せます)

SQL Database でもこの方法は使用することができますので、「SQL Database の性能情報は DTU だけだとブラックボックス」と思っている方は、DMV から情報をブレークダウンすることに挑戦してみてはいかがでしょう。リソースの使用状況について、かなりの情報を取得することが可能です。

Share

Written by Masayuki.Ozawa

4月 1st, 2018 at 11:35 pm

Posted in SQL Server

Tagged with

Leave a Reply