de:code 2019 の? DP06 Deep-dive in Azure Cosmos DB: Advanced topics on partitioning, data distribution and indexing で実施されていた Cosmos DB のグローバル分散のデモ で面白いなと思ったものの一つとして、リージョンが違うことによるレイテンシーの違いというものがありました。
この見せ方、面白いなと思って、SQL Database でも簡単なものを試してみました。
DTU モデルの場合は公開されていないのですが、vCore モデルの場合は、デプロイ時に次のような記載があります。
データファイル / ログファイルのような物理ファイルにアクセスする場合の想定待機時間が記載されていますね。
詳細については、仮想コアベースの購入モデルを使用した単一データベースに対するリソース制限 でまとめられているのですが、基本的な考え方としては次のようになります。
- リモートストレージへのアクセス
- 書き込み時 : 5 ~ 7 ミリ秒程度の I/O 待機時間
- 読み込み時 : 5~10 ミリ秒程度の I/O 待機時間
- ローカルストレージへのアクセス :
- 書き込み時 : 1~2 ミリ秒程度の I/O 待機時間
- 読み込み時 : 1~2 ミリ秒程度の I/O 待機時間
SQL Database はサービスレベルに応じて、使用するストレージ (接続方式) が異なります。
DTU モデルの「Basic」「Standard」と、vCore モデルの「汎用目的」については、「リモートストレージ」が使用されており、データベースは Azure Premium Storage 上に格納されています。
DTU モデルの「Premium」と、vCore モデルの「ビジネスクリティカル」については、「ローカルストレージ」が使用されており、リモートストレージと比較して、高速にアクセスができるようになっています。
データベースの処理時間を考える際には、以下の 2 点を考慮する必要があるか思います。
- アプリケーションからのアクセスを考慮した応答時間
- データベース単体の応答時間
今回はこれらを考慮した情報の取得を行ってみたいと思います。
取得する情報の対象をざっくりと次のように分けてみます。
①については、処理実行からの経過時間を Stopwatch を使用して取得してみます。
②については、SET STATISTICS TIME で出力できるメッセージから取得します。
SET STATISITCS TIME の実行結果については、そのままでは取得ができず、Connection の InfoMessage に出力用の処理を追加しておく必要があります。
PowerShell を使用した場合の処理の実装方法ついては、Capture Sql Server Information Messages in Powershell を参考にするとよいかと。
今回私が作ったスクリプトについては SQL Database Latency Test.ps1 にアップしてあります。
(Microsoft.Data.SqlClient を使いたかったので、これを使っていますが、System.Data.SqlClient でも処理は変わりません)
今回は、「東日本」と「米国東部」の 2 個所に SQL Database を Standard : S0 で作成し「INSERT INTO INSTEST VALUES(1)」という、単純な 1 行の INSERT を実行して速度を確認しています。
東日本で実行した場合は次のような結果が取得できます。
1 INSERT を実行した場合には、4~9 ms 程度で処理が完了していることが確認できますね。
今回は、Azure 内ではなく、インターネット経由で外部からアクセスをしているのですが、アプリケーションから見た場合は、13~56 ms 程度の時間がかかっています。
米国東部に対して実行した場合、1 INSERT のy粗利は、5~7 ms 程度かかっていますが、ネットワーク的に遠いリージョンで処理をしていることになりますので、処理の完了としてみた場合には、170ms 程度かかっていることになります。
近くのリージョンにデプロイした際の速度差を確認する場合、こういう見せ方をするとわかりやすいんだなと、セッションを受けて実感しました。
上記の結果では、S0 を使用してた際の実行結果となりますが、東日本の Premium のサービスレベルを使用すると、実行時間は次のようになります。
Premium ではローカルストレージになりますので、INSERT の処理時間が短縮されていますね。
このような確認方法は結構面白いなと思った今日この頃です。