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

適用于:Azure SQL資料庫

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

資源管理

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

彈性集區的主要設計目標是符合成本效益。 基於此原因,系統刻意讓客戶建立密集的集區,意即該集區的資料庫數目接近或達到允許上限,但具有適度配置的計算資源。 基於相同的原因,系統不會保留其內部流程所有可能需要的資源,但允許內部流程和使用者工作負載之間的資源共用。

此方法可讓客戶使用密集的彈性集區,以達成足夠的效能和主要成本節省。 但是,如果密集集區中許多資料庫的工作負載足夠密集,資源爭用就會變得很明顯。 資源爭用會減少使用者工作負載的效能,而且可能會對內部流程造成負面影響。

重要

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

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

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

當密集封裝的集區中發生資源爭用時,客戶可以選擇下列一或多個動作來減緩此情況:

  • 調整查詢工作負載,以降低資源耗用,或在一段時間內跨多個資料庫散佈資源耗用。
  • 經由將部份資料庫移至另一個集區,或將其設為獨立資料庫,來降低集區密度。
  • 擴大集區規模以取得更多資源。

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

監視資源耗用

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

Azure SQL Database 提供與此監視相關的數個計量。 超過每個計量的建議平均值表示集區中的資源爭用,而且應該使用先前所述的其中一個動作來處理。

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

度量名稱 描述 建議的平均值
avg_instance_cpu_percent 與彈性集區相關聯之 SQL 處理序的 CPU 使用率,由基礎作業系統測量。 可在每個資料庫中的 sys.dm_db_resource_stats 檢視,以及 master 資料庫中的 sys.elastic_pool_resource_stats 檢視中使用。 此計量也會發出至 Azure 監視器,並在此將其命名為sqlserver_process_core_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 Database 的記憶體不足錯誤進行疑難排解。 如果您發生記憶體不足的錯誤,請檢閱 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 Database 會提供一個傳回實際資源管理限制的檢視,以及會在資源集區層級和工作負載群組層級傳回資源使用量統計資料的額外檢視。

檢視表名稱 描述
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 Database 每個伺服器支援最多 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 伺服器的 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());

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

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
;

後續步驟