何年も前に書いた 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 から情報をブレークダウンすることに挑戦してみてはいかがでしょう。リソースの使用状況について、かなりの情報を取得することが可能です。