密集彈性集區中的資源管理

適用於:Azure SQL 資料庫

Azure SQL 資料庫彈性集區是一種符合成本效益的解決方案,可用於管理具有不同資源使用量的許多資料庫。 彈性集區中的所有資料庫會共用相同的資源分派,例如 CPU、記憶體、背景工作執行緒、儲存體空間和 tempdb,並假設在任何特定時間,集區中只有資料庫的一個子集將使用這些運算資源。 此假設可讓彈性集區符合成本效益。 客戶不需要支付每個個別資料庫可能需要的所有資源,而是支付集區中所有資料庫共用的較小資源集的費用。

資源管理

資源分享需要系統謹慎控制資源使用量,以將「吵雜芳鄰」效應 (即具有高資源耗用量的資料庫會影響相同彈性集區中的其他資料庫) 降到最低。 Azure SQL 資料庫藉由實作資源控管來達成這些目標。 同時,系統必須為高可用性和災害復原 (HADR) 、備份和還原、監視、查詢存放區、自動調整等功能提供足夠的資源,才能可靠地運作。

彈性集區的主要設計目標是符合成本效益。 基於這個理由,系統刻意允許客戶建立密集集區,也就是資料庫數目接近或達到允許上限,但具有適度的計算資源配置的集區。 基於相同的理由,系統不會為其內部程序保留所有潛在的必要資源,但允許內部程序與使用者工作負載之間的資源分享。

這種方法可讓客戶使用密集的彈性集區,以達到適當的效能和大幅節省成本。 不過,如果密集集區中許多資料庫的工作負載足夠密集,資源爭用就會變得相當嚴重。 資源爭用會減少使用者工作負載效能,而且可能會對內部程式造成負面影響。

重要

在具有許多作用中資料庫的密集集區中,將集區中的資料庫數目增加到 DTU虛擬核心彈性集區所記錄的最大值可能並不可行。

可放置在密集集區中,而不會造成資源爭用和效能問題的資料庫數目,取決於並行作用中的資料庫數目,以及每個資料庫中使用者工作負載的資源耗用量。 隨著使用者工作負載的變更,此數字可能會隨著時間而變更。

此外,如果每個資料庫的最小虛擬核心,或每個資料庫設定的最小 DTU 設定為大於 0 的值,集區中的資料庫數目上限將會隱含限制。 如需詳細資訊,請參閱集區虛擬核心資料庫的資料庫屬性集區 DTU 資料庫的資料庫屬性

在密集的集區中發生資源爭用時,客戶可以選擇下列一或多個動作予以緩和:

  • 調整查詢工作負載以減少資源使用量,或隨著時間將資源使用量分散到多個資料庫。
  • 經由將部份資料庫移至另一個集區,或將其設為獨立資料庫,來降低集區密度。
  • 擴大集區規模以取得更多資源。

如需如何實作最後兩個動作的建議,請參閱本文稍後的作業建議。 減少資源爭用有利於使用者工作負載和內部程式,並讓系統可靠地維護預期的服務等級。

監視資源使用量

為了避免因資源爭用而造成效能降低,使用密集彈性集區的客戶應主動監視資源使用量,並在增加資源爭用開始影響工作負載時,及時採取動作。 持續監視很重要,因為集區中的資源使用量會隨著時間而改變,因為使用者工作負載的變更、資料磁碟區和散佈的變更、集區密度的變更,以及 Azure SQL Database 服務中的變更。

Azure SQL 資料庫提供數個與這種類型的監視相關的計量。 超過每個計量的建議平均值表示集區中的資源爭用,而且應該使用先前所述的其中一個動作來解決。

若要在集區資源使用率 (CPU、資料 IO、記錄 IO、背景工作角色等) 超過閾值時傳送警示,請考慮透過 Azure 入口網站Add-AzMetricAlertRulev2 PowerShell Cmdlet 建立警示。 監視彈性集區時,請考慮在案例中視需要為集區中的個別資料庫建立警示。 如需監視彈性集區的範例案例,請參閱在多租用戶 SaaS 應用程式中監視和管理 Azure SQL 資料庫的效能

度量名稱 描述 建議的平均值
avg_instance_cpu_percent 與彈性集區相關聯的 SQL 程序 CPU 使用率,如基礎作業系統所測量。 可在每個資料庫的 sys.dm_db_resource_stats 檢視中,以及在 master 資料庫中的 sys.elastic_pool_resource_stats 檢視中使用。 此計量也會發出至 Azure 監視器,在該處命名sql_instance_cpu_percent,且可在 Azure 入口網站中檢視。 這個值對於相同彈性集區中的每個資料庫都相同。 低於 70%。 偶爾高達 90% 的短暫峰值是可接受的。
max_worker_percent 背景工作執行緒使用率。 針對集區中的每個資料庫,以及集區本身提供。 資料庫層級和集區層級對背景工作執行緒數目有不同限制,因此建議在這兩個層級都監視此計量。 可在每個資料庫的 sys.dm_db_resource_stats 檢視中,以及在 master 資料庫中的 sys.elastic_pool_resource_stats 檢視中使用。 此計量也會發出至 Azure 監視器,在該處命名workers_percent,且可在 Azure 入口網站中檢視。 低於 80%。 高達 100% 的峰值會導致連線嘗試和查詢失敗。
avg_data_io_percent 讀取和寫入實體 IO 的 IOPS 使用率。 針對集區中的每個資料庫,以及集區本身提供。 資料庫層級和集區層級對 IOPS 數目有不同限制,因此建議在這兩個層級都監視此計量。 可在每個資料庫的 sys.dm_db_resource_stats 檢視中,以及在 master 資料庫中的 sys.elastic_pool_resource_stats 檢視中使用。 此計量也會發出至 Azure 監視器,在該處命名physical_data_read_percent,且可在 Azure 入口網站中檢視。 低於 80%。 偶爾高達 100% 的短暫峰值是可接受的。
avg_log_write_percent 交易記錄寫入 IO 的輸送量使用率。 針對集區中的每個資料庫,以及集區本身提供。 資料庫層級和集區層級對記錄輸送量有不同的限制,因此建議在這兩個層級都監視此計量。 可在每個資料庫的 sys.dm_db_resource_stats 檢視中,以及在 master 資料庫中的 sys.elastic_pool_resource_stats 檢視中使用。 此計量也會發出至 Azure 監視器,在該處命名log_write_percent,且可在 Azure 入口網站中檢視。 此計量接近 100% 時,所有資料庫修改 (INSERT、UPDATE、DELETE、MERGE 陳述式、SELECT ...INTO、BULK INSERT 等) 速度會變慢。 低於 90%。 偶爾高達 100% 的短暫峰值是可接受的。
oom_per_second 彈性集區中記憶體不足 (OOM) 錯誤的速率,這是記憶體壓力的指標。 可在 sys.dm_resource_governor_resource_pools_history_ex 檢視中使用。 如需計算此計量的範例查詢範例,請參閱範例。 如需詳細資訊,請參閱使用 DTU 的彈性集區,或使用虛擬核心的彈性集區的資源限制,以及針對 Azure SQL 資料庫記憶體不足的錯誤進行疑難排解。 如果您發生記憶體不足的錯誤,請檢閱 sys.dm_os_out_of_memory_events 0
avg_storage_percent 彈性集區內所有資料庫中的資料所使用的儲存空間總計。 不包含資料庫檔案中的空白空間。 可在 master 資料庫中的 sys.elastic_pool_resource_stats 檢視中使用。 此計量也會發出至 Azure 監視器,在該處命名storage_percent,且可在 Azure 入口網站中檢視。 低於 80%。 對於沒有資料成長的集區,可以接近 100%。
avg_allocated_storage_percent 彈性集區內所有資料庫中資料庫檔案所使用的儲存空間總計。 在資料庫檔案中包含空白空間。 可在 master 資料庫中的 sys.elastic_pool_resource_stats 檢視中使用。 此計量也會發出至 Azure 監視器,在該處命名allocated_data_storage_percent,且可在 Azure 入口網站中檢視。 低於 90%。 對於沒有資料成長的集區,可以接近 100%。
tempdb_log_used_percent tempdb 資料庫中的交易記錄空間使用率。 即使在同一個彈性集區中的其他資料庫中看不到在一個資料庫中建立的暫存物件,但 tempdb 是相同集區中所有資料庫的共享資源。 在 tempdb 中,從集區中的一個資料庫啟動的長時間執行或孤立的交易可能會耗用大部分的交易記錄,並導致相同集區中其他資料庫中的查詢失敗。 衍生自 sys.dm_db_log_space_usagesys.database_files 檢視。 此計量也會發出至 Azure 監視器,且可在 Azure 入口網站中檢視。 請參閱範例查詢的範例,以傳回此計量的目前值。 低於 50%。 偶爾高達 80% 的峰值是可接受的。

除了這些計量之外,Azure SQL 資料庫還提供可傳回實際資源控管限制的檢視,以及傳回資源集區層級和工作負載群組層級的資源使用率統計資料的其他檢視。

檢視表名稱 描述
sys.dm_user_db_resource_governance 傳回目前資料庫或彈性集區中資源控管機制使用的實際設定和容量設定。
sys.dm_resource_governor_resource_pools 傳回有關目前資源集區狀態、資源集區的目前組態和累計資源集區統計資料的相關資訊。
sys.dm_resource_governor_workload_groups 傳回累計工作負載群組統計資料和作業負載群組目前的組態。 此檢視可以與 pool_id 資料行上的 sys.dm_resource_governor_resource_pools 聯結,以取得資源集區資訊。
sys.dm_resource_governor_resource_pools_history_ex 根據可用的快照數目,傳回最近記錄的資源集區使用率統計資料。 每個資料列代表一個時間間隔。 間隔的持續時間會在 duration_ms 資料行中提供。 delta_ 資料行會在間隔期間傳回每個統計資料中的變更。
sys.dm_resource_governor_workload_groups_history_ex 根據可用的快照數目,傳回最近記錄的工作負載群組使用率統計資料。 每個資料列代表一個時間間隔。 間隔的持續時間會在 duration_ms 資料行中提供。 delta_ 資料行會在間隔期間傳回每個統計資料中的變更。

提示

若要使用伺服器管理員以外的主體來查詢這些和其他動態管理檢視,請將此主體新增至##MS_ServerStateReader##伺服器角色

這些檢視可用來監視資源使用率,並近乎即時地針對資源爭用進行疑難排解。 主要和可讀取次要複本 (包括異地複本) 上的使用者工作負載會分類為 SloSharedPool1 資源集區和 UserPrimaryGroup.DBId[N] 工作負載群組,其中 N 代表資料庫識別碼值。

除了監視目前的資源使用率之外,使用密集集區的客戶還可以在不同資料存放區中維護歷史資源使用率資料。 此資料可用於預測性分析,根據歷史和季節性趨勢主動管理資源使用率。

作業建議

保留足夠的資源空餘空間。 如果發生資源爭用和效能降低,風險降低措施可能包括將某些資料庫從受影響的彈性集區移出,或相應增加集區,如先前所述。 不過,這些動作需要額外的計算資源才能完成。 特別是,對於進階版和業務關鍵集區,這些動作需要傳送要移動之資料庫的所有資料,或如果集區相應增加,則針對彈性集區中的所有資料庫傳輸所有資料。 資料傳輸是長時間執行且需要大量資源的作業。 如果集區已面臨高資源壓力,風險降低作業本身會進一步降低效能。 在極端情況下,由於無法使用所需的資源,可能無法透過資料庫移動或集區相應增加來解決資源爭用。 在此情況下,暫時減少受影響彈性集區上的查詢工作負載可能是唯一的解決方案。

使用密集集區的客戶應如先前所述密切監視資源使用率趨勢,並在計量維持在建議範圍內且彈性集區中仍有足夠資源時採取風險降低動作。

資源使用率取決於每個資料庫和每個彈性集區隨著時間變化的多個因素。 在密集集區中達到最佳價格/效能比率需要持續監視和重新平衡,也就是將資料庫從較使用率較高的集區移至較少使用量的集區,並視需要建立新的集區以容納增加的工作負載。

注意

對於 DTU 彈性集區,集區層級的 eDTU 計量不是個別資料庫使用率的 MAX 或 SUM。 其衍生自不同集區層級計量的使用率。 集區層級的資源限制可能會高於個別的資料庫層級限制,因此,即使集區的 eDTU 報告指出沒有任何限制,個別資料庫仍有可能達到特定的資源限制 (CPU、資料 IO、記錄 IO 等)。

請勿移動「熱門」資料庫。 如果集區層級的資源爭用主要是由少數高使用率的資料庫所造成,則可能會誘使這些資料庫移至較少使用率的集區,或將其設為獨立資料庫。 不過,不建議這麼做,因為移動作業會進一步降低要移動的資料庫和整個集區效能。 相反地,請等候高使用率消退,或改為移動使用率較低的資料庫,以減輕集區層級的資源壓力。 但是,在此情況下,移動使用率非常低的資料庫不會提供任何好處,因為它不會大幅降低集區層級的資源使用率。

在「隔離」集區中建立新的資料庫。 在經常建立新資料庫的情況下,例如使用每個資料庫租用戶模型的應用程式,將新資料庫置於現有彈性集區的風險會意外地耗用大量資源,並影響集區中的其他資料庫和內部程序。 若要降低此風險,請建立具有大量資源配置的個別「隔離」集區。 將此集區用於具有未知資源使用量模式的新資料庫。 一旦資料庫在此集區中停留了一個商務週期,例如一週或一個月,且已知其資源使用量,就可以將其移至容量足以容納此額外資源使用量的集區。

監視已使用和配置的空間。 當配置的集區空間 (集區中所有資料庫儲存區中所有資料庫檔案的大小總計) 達到集區大小上限時,可能會發生空間不足錯誤。 如果配置的空間趨勢很高,且有望達到集區大小上限,風險降低選項包括:

  • 將某些資料庫移出集區,以減少配置的總空間
  • 壓縮資料庫檔案以減少檔案中空的配置空間
  • 將集區相應增加為具有較大集區大小上限的服務目標

如果使用的集區空間 (集區中所有資料庫的資料大小總計,不包括檔案中的空白空間) 趨勢很高,且有望達到集區大小上限,風險降低選項包括:

  • 將某些資料庫移出集區,以減少總使用空間
  • 在資料庫外部移動 (封存) 資料,或刪除不再需要的資料
  • 實作資料壓縮
  • 將集區相應增加為具有較大集區大小上限的服務目標

避免過度密集的伺服器。 Azure SQL 資料庫支援每個伺服器最多 5000 個資料庫。 使用具有數千個資料庫彈性集區的客戶,可能會考慮將多個彈性集區放在單一伺服器上,而資料庫總數最多可達支援的限制。 不過,具有數千個資料庫的伺服器會帶來作業挑戰。 需要列舉伺服器上所有資料庫的作業 (例如在入口網站中檢視資料庫) 將會變慢。 作業錯誤,例如伺服器層級登入或防火牆規則的修改不正確,將影響較大的資料庫數目。 意外刪除伺服器需要 Microsoft 支援服務協助復原已刪除伺服器上的資料庫,而且會導致所有受影響的資料庫長時間中斷。

將每部伺服器的資料庫數目限制為低於支援的上限。 在許多案例下,每部伺服器最多使用 1000-2000 個資料庫是最佳做法。 若要降低意外刪除伺服器的可能性,請在伺服器或其資源群組上放置刪除鎖定

範例

檢視個別資料庫容量設定

使用 sys.dm_user_db_resource_governance 動態管理檢視來檢視目前資料庫或彈性集區中資源控管所使用的實際組態和容量設定。 如需詳細資訊,請參閱 sys.dm_user_db_resource_governance

在彈性集區中的任何資料庫中執行此查詢。 集區中的所有資料庫都有相同的資源控管設定。

SELECT * FROM sys.dm_user_db_resource_governance AS rg
WHERE database_id = DB_ID();

監視整體彈性集區資源使用量

使用 sys.elastic_pool_resource_stats 系統目錄檢視來監視整個集區的資源使用量。 如需詳細資訊,請參閱 sys.elastic_pool_resource_stats

此檢視最近 10 分鐘的範例查詢應在包含所需彈性集區之邏輯 Azure SQL Server 的 master 資料庫中執行。

SELECT * FROM sys.elastic_pool_resource_stats AS rs
WHERE rs.start_time > DATEADD(mi, -10, SYSUTCDATETIME()) 
AND rs.elastic_pool_name = '<elastic pool name>';

監視個別資料庫資源使用量

使用 sys.dm_db_resource_stats 動態管理檢視來監視個別資料庫的資源使用量。 如需詳細資訊,請參閱 sys.dm_db_resource_stats。 即使沒有任何活動,每 15 秒就會存在一個資料列。 歷程記錄資料大約會維護一小時。

此範例查詢可檢視應在所需資料庫中執行之最後 10 分鐘的資料。

SELECT * FROM sys.dm_db_resource_stats AS rs
WHERE rs.end_time > DATEADD(mi, -10, SYSUTCDATETIME());

若保留時間較長且頻率較低,請考慮 sys.resource_stats 上的 下列查詢,在 Azure SQL 邏輯伺服器的 master 資料庫中執行。 如需詳細資訊,請參閱 sys.resource_stats (Azure SQL 資料庫)。 每五分鐘就會存在一個資料列,而且歷程記錄資料會維護兩週。

SELECT * FROM sys.resource_stats
WHERE [database_name] = 'sample'
ORDER BY [start_time] desc;

監視記憶體使用率

此查詢會根據可用的快照數目,計算最近記錄之每個資源集區的 oom_per_second 計量。 此範例查詢有助於識別集區中最近記憶體配置失敗的平均次數。 此查詢可以在彈性集區的任何資料庫中執行。

SELECT pool_id,
       name AS resource_pool_name,
       IIF(name LIKE 'SloSharedPool%' OR name LIKE 'UserPool%', 'user', 'system') AS resource_pool_type,
       SUM(CAST(delta_out_of_memory_count AS decimal))/(SUM(duration_ms)/1000.) AS oom_per_second
FROM sys.dm_resource_governor_resource_pools_history_ex
GROUP BY pool_id, name
ORDER BY pool_id;

監視 tempdb 記錄空間使用率

此查詢會傳回 tempdb_log_used_percent 計量的目前值,顯示 tempdb 交易記錄相對於其允許大小上限的相對使用率。 此查詢可以在彈性集區的任何資料庫中執行。

SELECT (lsu.used_log_space_in_bytes / df.log_max_size_bytes) * 100 AS tempdb_log_space_used_percent
FROM tempdb.sys.dm_db_log_space_usage AS lsu
CROSS JOIN (
           SELECT SUM(CAST(max_size AS bigint)) * 8 * 1024. AS log_max_size_bytes
           FROM tempdb.sys.database_files
           WHERE type_desc = N'LOG'
           ) AS df
;

下一步