SQL 超大規模資料庫效能疑難排解診斷

適用於:Azure SQL Database

若要為超大規模資料庫中的效能問題疑難排解,可以從 Azure SQL Database 計算節點上的一般效能微調方法開始進行效能調查。 但考慮到超大規模資料庫的分散式架構,已新增其他的診斷功能來協助。 本文描述超大規模資料庫特有的診斷資料。

記錄速率節流等候

每個 Azure SQL Database 服務目標,都具有透過記錄速率控管強制執行的記錄產生速率限制。 在超大規模資料庫中,不論服務層級為何,記錄控管限制皆設為 105 MB/秒。 105 MB/秒。 此值會在 sys.dm_user_db_resource_governanceprimary_max_log_rate 資料行中顯示。

不過有時主要計算複本上的記錄產生速率必須進行節流處理,以維持復原能力服務等級協定。 當頁面伺服器或其他計算複本因套用記錄服務的新記錄檔記錄而大幅落後時,就會發生此節流。 如果沒有頁面伺服器或複本落後,節流機制可讓記錄產生速率達到 100 MB/秒。 這是所有超大規模資料庫服務目標中有效的最大記錄產生率。

下列等候類型 (於 sys.dm_os_wait_stats) 說明在主要計算複本上發生記錄速率節流的可能原因:

等候類型 描述
RBIO_RG_STORAGE 發生於因為頁面伺服器上發生記錄取用延遲,而將超大規模資料庫主要計算節點記錄產生速率節流時。
RBIO_RG_DESTAGE 發生於因為長期的記錄儲存使記錄取用延遲,而將超大規模資料庫主要計算節點記錄產生速率節流時。
RBIO_RG_REPLICA 發生於因為可讀取次要複本的記錄取用延遲,而將超大規模資料庫主要計算節點記錄產生速率節流時。
RBIO_RG_GEOREPLICA 發生於因為異地複寫次要複本的記錄取用延遲,而將超大規模資料庫主要計算節點記錄產生速率節流時。
RBIO_RG_LOCALDESTAGE 發生於因為記錄服務的記錄取用延遲,而將超大規模資料庫主要計算節點記錄產生速率節流時。

頁面伺服器讀取

計算複本不會在本機快取資料庫的完整複本。 計算複本的本機資料會儲存緩衝集區 (記憶體) 及本機復原緩衝集區延伸 (RBPEX) 快取中,此快取是資料頁面的部分 (非涵蓋) 快取。 此本機 RBPEX 快取會依計算大小按比例調整,且會是計算層記憶體的三倍。 RBPEX 類似於緩衝區集區,因其具有最常存取的資料。 另一方面,每個頁面伺服器都會有一個涵蓋 RBPEX 快取,用於其維護的資料庫部分。

在計算複本上發出讀取時,如果資料不存在於緩衝集區或本機 RBPEX 快取中,則系統會發出 getPage(pageId, LSN) 函式呼叫,並從對應的頁面伺服器擷取該頁面。 從頁面伺服器讀取是遠端讀取,因此速度會比從本機 RBPEX 讀取緩慢。 在為 IO 相關效能問題疑難排解時,我們必須能夠分辨透過速度相對慢的遠端頁面伺服器讀取所完成的 IO 數目。

有幾個動態管理檢視 (DMV) 與擴充事件具有可指出從頁面伺服器遠端讀取之數目的資料行和欄位,可將此數目與總讀取數目加以比較。 查詢存放區在查詢執行階段統計資料時也會擷取遠端讀取數目。

<RunTimeCountersPerThread Thread="8" ActualRows="90466461" ActualRowsRead="90466461" Batches="0" ActualEndOfScans="1" ActualExecutions="1" ActualExecutionMode="Row" ActualElapsedms="133645" ActualCPUms="85105" ActualScans="1" ActualLogicalReads="6032256" ActualPhysicalReads="0" ActualPageServerReads="0" ActualReadAheads="6027814" ActualPageServerReadAheads="5687297" ActualLobLogicalReads="0" ActualLobPhysicalReads="0" ActualLobPageServerReads="0" ActualLobReadAheads="0" ActualLobPageServerReadAheads="0" />

注意

若要在 [查詢計劃屬性] 視窗中檢視這些屬性,則需要 SSMS 18.3 或更新版本。

虛擬檔案統計資料和 IO 計量

在 Azure SQL Database 中,sys.dm_io_virtual_file_stats () DMF 是監視 SQL Database IO 的主要方式。 超大規模資料庫中的 IO 特性會因為其分散式架構而有所不同。 在本節中,我們將聚焦在 IO (讀取和寫入) 到資料檔案中,如此 DMF 中所示。 在超大規模資料庫中,此 DMF 中可見的每個資料檔案都對應至遠端頁面伺服器。 此處所提及的 RBPEX 快取是以本機 SSD 為基礎的快取,也就是計算複本上的非涵蓋快取。

本機 RBPEX 快取使用量

本機 RBPEX 快取存在於本機 SSD 儲存體上的計算複本。 因此,針對此快取執行的 IO 會快於針對遠端頁面伺服器執行的 IO。 目前,超大規模資料庫中的 sys.dm_io_virtual_file_stats() 具有特殊的資料列,會報告針對計算複本上本機 RBPEX 快取執行的 IO。 database_idfile_id 資料行的此資料列其值為 0。 例如,下列查詢會傳回自資料庫啟動後 RBPEX 使用量的統計資料。

select * from sys.dm_io_virtual_file_stats(0,NULL);

在 RBPEX 上完成的讀取數,對比所有在其他資料檔案上完成的彙總讀取數後所得的比率,可得出 RBPEX 快取命中率。 計數器 RBPEX cache hit ratio 也會在效能計數器 DMV sys.dm_os_performance_counters 中公開。

資料讀取

  • 當 SQL Server 資料庫引擎在計算複本上發出讀取時,這些讀取可能是由本機 RBPEX 快取或遠端頁面伺服器所提供,或若是讀取多個頁面時,由上述兩個方式的組合來提供。
  • 當計算複本從特定檔案讀取某些頁面時,例如 file_id 1,如果此資料僅位於本機 RBPEX 快取上,則此讀取的所有 IO 都會計入 file_id 0 (RBPEX)。 如果該資料的某些部分是在本機 RBPEX 快取中,而某些部分是在遠端頁面伺服器上,則系統會針對 RBPEX 所提供的部分將 IO 計入 file_id 0,而從遠端頁面伺服器提供的部分則計入 file_id 1。
  • 當計算複本從頁面伺服器要求特定 LSN 的頁面時,如果頁面伺服器尚未趕上所要求的 LSN,則計算複本上的讀取將會等待,直到頁面伺服器趕上後將該頁面傳回至計算複本為止。 對於計算複本上從頁面伺服器的任何讀取,如果讀取是在等待該 IO,您將會看到 PAGEIOLATCH_ * 等待類型。 在超大規模資料庫中,此等待時間包括頁面伺服器上的要求頁面趕上所需的 LSN 的時間,以及將頁面從頁面伺服器傳送到計算複本所需的時間。
  • 大量讀取 (例如預先讀取) 通常是使用「分散-集中」式讀取所完成。 這種方式能一次讀取高達 4 MB 的頁面,在 SQL Server 資料庫引擎中視為單一讀取。 不過,當讀取的資料是在 RBPEX 時,這些讀取會被視為多個個別的 8 KB 讀取,因為緩衝集區和 RBPEX 一律使用 8 KB 的頁面。 因此,針對 RBPEX 的讀取 IO 數目可能會大於引擎所執行的實際 IO 數目。

資料寫入

  • 主要計算複本不會直接寫入頁面伺服器, 而是在對應的頁面伺服器上重新執行記錄服務的記錄檔記錄。
  • 在計算複本上發生的寫入主要是寫入本機 RBPEX (file_id 0)。 針對大於 8 KB 的邏輯檔案上的寫入 (換句話說,使用集中-寫入方式完成的寫入),每個寫入作業都會轉譯至 RBPEX 成為多個 8 KB 的個別寫入,因為緩衝集區和 RBPEX 一律使用 8 KB 的頁面。 因此,針對 RBPEX 的寫入 IO 數目可能會大於引擎所執行的實際 IO 數目。
  • 非 RBPEX 檔案,或非頁面伺服器對應 file_id 0 的資料檔案,也會顯示寫入。 在超大規模資料庫服務層中,系統會模擬這些寫入,因為計算複本永遠不會直接寫入頁面伺服器。 寫入 IOPS 和輸送量會在其發生於計算複本上時計入,但 file_id 0 以外資料檔案的延遲則不會反映頁面伺服器寫入的實際延遲。

記錄寫入

  • 在主要計算上,記錄寫入會計入至 sys.dm_io_virtual_file_stats 的 file_id 2 中。 主要計算的記錄寫入會寫入至記錄登陸區域。
  • 系統不會在認可時將記錄檔記錄強行寫入次要複本。 在超大規模資料庫中,記錄服務會以非同步方式將記錄檔套用至次要複本。 由於記錄寫入實際上不是在次要複本上發生的,因此次要複本上任何記錄 IO 的計入僅供追蹤之用。

資源使用率統計資料中的資料 IO

在非超大規模資料庫中,相對於資源管控資料 IOPS 限制,針對資料檔案的讀取與寫入合併的 IOPS 會在 sys.dm_db_resource_statssys.resource_stats 檢視中的 avg_data_io_percent 資料行中報告。 同一個值在 Azure 入口網站中是以資料 IO 百分比形式報告。

在超大規模資料庫中,此資料行會報告僅相對於計算複本上的本機儲存體限制的資料 IOPS 使用率,特別是針對 RBPEX 和 tempdb 的 IO。 此資料行中的 100% 值表示資源控管會限制本機儲存體 IOPS。 如果這與效能問題相互關聯,請調整工作負載以產生較少的 IO,或增加資料庫服務目標來增加資源管控的「最大資料 IOPS」限制。 針對 RBPEX 讀取和寫入的資源管控,系統會計入個別的 8 KB IO,而不是由 SQL Server 資料庫引擎所發出的較大 IO。

針對遠端頁面伺服器的資料 IO 不會在資源使用率檢視或入口網站中報告,但會在 sys.dm_io_virtual_file_stats() DMF 中報告,如先前所述。

其他資源