Azure SQL DatabaseのDTUモデルとvCoreモデルのマッピングクエリで比較してみた

2021.04.26

いわさです。

Azure SQL Databaseには複数の購入モデルがあります。

私はこれまでDTUベースしか使ったことが無かったのですが、CPUやメモリなどどの程度のリソースなのかよくわかってないまま、ワークロードを評価してメトリクスからDTUの過不足を判断し調整することが多かったです。
今はvCoreベースが推奨されており、DTUベースからvCoreベースに移行するにあたってコア数やメモリ数のマッピング用T-SQLが公開されており、移行のための見積もりに利用することが出来ます。

vCoreベースと他クラウドの比較ができていれば、DTUからvCoreへのマッピング情報はAzureからAWSやGCPなどへの移行時も参考になるのではないかなと思い、全価格レベルで確認してみました。

DTUベースの購入モデルとvCoreベースの購入モデル

https://docs.microsoft.com/en-us/azure/azure-sql/database/purchasing-models より

DTUベースはリソース構成の細かいカスタマイズは出来ず、DTUを調整してパフォーマンスをコントロールします。
vCoreベースは個別にリソース調整が可能です。

私はDTUシンプルで好きでした。
シンプルですが、少し無駄なリソースが発生することが多いイメージでしょうか。

Gen4とGen5

Azure SQL Database は Gen4(Haswell)とGen5(Broadwell, Skylake)が混在しています。
vCoreモデルの新規構築時はGen4は現在は選択することは出来ません。

今回の検証で知ったのですが、DTUモデルについてはまだGen4が使われることがあるようです。
同じ価格レベル、同じリージョンでもスケールアップ、スケールダウンしたタイミングでランダムでGen4かGen5のハードが割り当てられる感じでしょうか。
米国西部2リージョンだとGen4は一度も引きませんでしたが、東日本リージョンでは2割程度の確率でGen4を引いてました。

評価方法

以下のURLで公開されているT-SQLをDTUデータベース上で実行し評価していきたいと思います。
東日本と米国西部リージョンで評価しました。

WITH dtu_vcore_map AS
(
SELECT rg.slo_name,
       DATABASEPROPERTYEX(DB_NAME(), 'Edition') AS dtu_service_tier,
       CASE WHEN rg.slo_name LIKE '%SQLG4%' THEN 'Gen4'
            WHEN rg.slo_name LIKE '%SQLGZ%' THEN 'Gen4'
            WHEN rg.slo_name LIKE '%SQLG5%' THEN 'Gen5'
            WHEN rg.slo_name LIKE '%SQLG6%' THEN 'Gen5'
            WHEN rg.slo_name LIKE '%SQLG7%' THEN 'Gen5'
       END AS dtu_hardware_gen,
       s.scheduler_count * CAST(rg.instance_cap_cpu/100. AS decimal(3,2)) AS dtu_logical_cpus,
       CAST((jo.process_memory_limit_mb / s.scheduler_count) / 1024. AS decimal(4,2)) AS dtu_memory_per_core_gb
FROM sys.dm_user_db_resource_governance AS rg
CROSS JOIN (SELECT COUNT(1) AS scheduler_count FROM sys.dm_os_schedulers WHERE status = 'VISIBLE ONLINE') AS s
CROSS JOIN sys.dm_os_job_object AS jo
WHERE dtu_limit > 0
      AND
      DB_NAME() <> 'master'
      AND
      rg.database_id = DB_ID()
)
SELECT dtu_logical_cpus,
       dtu_hardware_gen,
       dtu_memory_per_core_gb,
       dtu_service_tier,
       CASE WHEN dtu_service_tier = 'Basic' THEN 'General Purpose'
            WHEN dtu_service_tier = 'Standard' THEN 'General Purpose or Hyperscale'
            WHEN dtu_service_tier = 'Premium' THEN 'Business Critical or Hyperscale'
       END AS vcore_service_tier,
       CASE WHEN dtu_hardware_gen = 'Gen4' THEN dtu_logical_cpus
            WHEN dtu_hardware_gen = 'Gen5' THEN dtu_logical_cpus * 0.7
       END AS Gen4_vcores,
       7 AS Gen4_memory_per_core_gb,
       CASE WHEN dtu_hardware_gen = 'Gen4' THEN dtu_logical_cpus * 1.7
            WHEN dtu_hardware_gen = 'Gen5' THEN dtu_logical_cpus
       END AS Gen5_vcores,
       5.05 AS Gen5_memory_per_core_gb,
       CASE WHEN dtu_hardware_gen = 'Gen4' THEN dtu_logical_cpus
            WHEN dtu_hardware_gen = 'Gen5' THEN dtu_logical_cpus * 0.8
       END AS Fsv2_vcores,
       1.89 AS Fsv2_memory_per_core_gb,
       CASE WHEN dtu_hardware_gen = 'Gen4' THEN dtu_logical_cpus * 1.4
            WHEN dtu_hardware_gen = 'Gen5' THEN dtu_logical_cpus * 0.9
       END AS M_vcores,
       29.4 AS M_memory_per_core_gb
FROM dtu_vcore_map;

クエリは単純で、dm_user_db_resource_governanceから実際の構成と容量情報を取得・計算し、係数で世代間を調整しています。
概算見積もりくらいに考えておいたほうが良いかもしれませんが、指標にはなると思います。

sys.dm_user_db_resource_governance については以下を参考にしてください。

評価結果

dtu_logical_cpus dtu_hardware_gen dtu_memory_per_core_gb dtu_service_tier vcore_service_tier
B(5) 0.5 Gen5 1.3 Basic General Purpose
S0(10) 0.5 Gen5 1.3 Standard General Purpose or Hyperscale
S1(20) 1 Gen5 2.65 Standard General Purpose or Hyperscale
S2(50) 1 Gen5 2.65 Standard General Purpose or Hyperscale
S3(100) 2 Gen5 5.4 Standard General Purpose or Hyperscale
S4(200) 4 Gen5 5.4 Standard General Purpose or Hyperscale
S6(400) 6 Gen5 5.4 Standard General Purpose or Hyperscale
S7(800) 12 Gen5 5.4 Standard General Purpose or Hyperscale
S9(1600) 24 Gen5 5.4 Standard General Purpose or Hyperscale
S12(3000) 24 Gen4 6.16 Standard General Purpose or Hyperscale
P1(125) 2 Gen5 5.4 Premium Business Critical or Hyperscale
P2(250) 2 Gen4 6.94 Premium Business Critical or Hyperscale
P4(500) 6 Gen5 5.4 Premium Business Critical or Hyperscale
P6(1000) 6 Gen4 6.98 Premium Business Critical or Hyperscale
P11(1750) 18 Gen5 5.4 Premium Business Critical or Hyperscale
P15(4000) 42 Gen5 4.86 Premium Business Critical or Hyperscale

Gen4, Gen5

Gen4_vcores Gen4_memory_per_core_gb Gen5_vcores Gen5_memory_per_core_gb
B(5) 0.35 7 0.5 5.05
S0(10) 0.35 7 0.5 5.05
S1(20) 0.7 7 1 5.05
S2(50) 0.7 7 1 5.05
S3(100) 1.4 7 2 5.05
S4(200) 2.8 7 4 5.05
S6(400) 4.2 7 6 5.05
S7(800) 8.4 7 12 5.05
S9(1600) 16.8 7 24 5.05
S12(3000) 24 7 40.8 5.05
P1(125) 1.4 7 2 5.05
P2(250) 2 7 3.4 5.05
P4(500) 4.2 7 6 5.05
P6(1000) 6 7 10.2 5.05
P11(1750) 12.6 7 18 5.05
P15(4000) 29.4 7 42 5.05

Fsv2シリーズ、Mシリーズ

  • Fsv2シリーズ:Intel® 8168 (Skylake) プロセッサ
  • Mシリーズ:Intel® E7-8890 v3 2.5 GHz プロセッサおよび Intel® 8280M 2.7 GHz (Cascade Lake) プロセッサ
Fsv2_vcores Fsv2_memory_per_core_gb M_vcores M_memory_per_core_gb
B(5) 0.4 1.89 0.45 29.4
S0(10) 0.4 1.89 0.45 29.4
S1(20) 0.8 1.89 0.9 29.4
S2(50) 0.8 1.89 0.9 29.4
S3(100) 1.6 1.89 1.8 29.4
S4(200) 3.2 1.89 3.6 29.4
S6(400) 4.8 1.89 5.4 29.4
S7(800) 9.6 1.89 10.8 29.4
S9(1600) 19.2 1.89 21.6 29.4
S12(3000) 24 1.89 33.6 29.4
P1(125) 1.6 1.89 1.8 29.4
P2(250) 2 1.89 2.8 29.4
P4(500) 4.8 1.89 5.4 29.4
P6(1000) 6 1.89 8.4 29.4
P11(1750) 14.4 1.89 16.2 29.4
P15(4000) 33.6 1.89 37.8 29.4

所感

繰り返しますが、この数値はあくまで指標で、ワークロード毎の評価は必要です。
ただ、全くマシンリソースが意識出来ていなかった状態からすると、これだけ情報を得れるだけでも役立ちそうです。

私はAzure SQL Database では小規模のワークロードを設計することが多く、S0~S3くらいで足りていました。
データベース外でキャッシュを活用していたとしても、この程度のリソースだったのかと少し驚きました。

どういう規模・特性のワークロードがどの程度のDTUが必要か、ざっくり見積もれる人は多いと思いますので、これを参考にvCoreベースでの見積もりに活かせれると便利だなと感じました。