跳至內容

如何對 RDS for SQL Server 執行個體中可用記憶體不足的問題進行疑難排解?

3 分的閱讀內容
0

我想對 Amazon Relational Database (Amazon RDS) for SQL Server 執行個體中可用記憶體不足的問題進行疑難排解。

解決方法

監控執行個體的記憶體使用量

若要監控記憶體使用量,您可以使用 Amazon CloudWatch 指標或增強型監控。

使用 CloudWatch 指標

若要識別記憶體不足的情況,請使用 Amazon RDS 主控台監控 FreeableMemory CloudWatch 指標。

若要在可用記憶體不足時識別工作負載的增加,請監控以下指標:

  • DatabaseConnections
  • CPUUtilization
  • ReadIOPS
  • ReadThroughput
  • WriteIOPS
  • WriteThroughput

如需上述指標的資訊,請參閱 Amazon RDS 的 Amazon CloudWatch 執行個體層級指標

啟用增強型監控

若要監控 Microsoft SQL Server 的作業系統 (OS) 指標,請使用增強型監控開啟增強型監控後,您可以將指標收集間隔設定為 1、5、10、15、30 或 60 秒。預設的精度為 60 秒,但最佳做法是將精度設為 1 或 5 秒。

您也可以使用增強型監控來建立 CloudWatch 警示,以監控 Amazon RDS SQL Server 資料庫執行個體的記憶體使用情況。

限制 Amazon RDS 執行個體所使用的記憶體

確定執行個體的 max_server_memory 值,然後將 max_server_memory 設定為不會導致系統整體記憶體壓力的值。

確定 max_server_memory 值

使用下列計算來決定執行個體的 max_server_memory 值:

max_server_memory = total_RAM - (作業系統 1 GB + memory_basis_amount_of_RAM_on_the_server)

total_RAM 等於執行個體類型的記憶體總量。

memory_basis_amount_of_RAM_on_the_server 是透過以下方式決定的:

  • 如果伺服器上的 RAM 在 4 GB 到 16 GB 之間,則會每 4 GB RAM 保留 1 GB。例如,對於具有 16 GB RAM 的伺服器,會保留 4 GB。

  • 如果伺服器上的 RAM 超過 16 GB,則會每 4 GB RAM 保留 1 GB,最多為 16 GB。對於大於 16 GB 的 RAM,每 8 GB 保留 1 GB。

例如,如果伺服器有 64 GB 的 RAM,則 max_server_memory 的計算如下:

  • 1 GB 用於作業系統
  • 最高 16 GB RAM: 16/4 = 4 GB
  • 剩餘 RAM 大於 16 GB: (64-16)/8 = 6 GB
  • (1 GB 用於作業系統 + memory_basis_amount_of_RAM_on_the_server) = 1 + 4 + 6 = 11 GB
  • max_server_memory: 64 - 11 = 53 GB

設定 max_server_memory

若要變更 max_server_memory,請使用自訂參數群組來設定值。提供最大伺服器記憶體 (MB)max_server_memory 的值。由於 max_server_memory 是動態參數,所以您不需要重新啟動即可使變更生效。

**注意:**設定 max_server_memory 後,您必須持續監控 FreeableMemory,以確定是否增加或減少分配的記憶體。

檢查您是否在資料庫執行個體上使用 SSIS、SSAS 或 SSRS 選項

檢查您的 RDS 選項群組,以確定您是否在資料庫執行個體上使用 SQL Server Integration Services (SSIS)、SQL Server Analysis Services (SSAS) 或 SQL Server Reporting Services (SSRS) 選項。此選項使用的記憶體位於 max_server_memory 設定之外,並增加了執行個體上的記憶體佔用空間。如果您沒有使用這些選項,請修改選項群組以將其移除。

**注意:**如果您在執行個體上使用 SSIS、SSAS 或 SSRS,則必須調整 max_server_memory 以配合選項。

例如,如果您使用 SSRS,請將 SSRS 最大記憶體值設定為資料庫執行個體總記憶體的 10%。例如,對於具有 64 GiB 記憶體的執行個體,10% 約為 6.4 GiB。因此,將 max_server_memory 值調整為約 46 GiB(64 - 11 - 6.4 = 46 GiB)。

檢查資料庫連線

每個與執行個體建立的資料庫連線,都需要在緩衝集區之外分配一些記憶體,以供工作執行緒使用。因此,DatabaseConnections 爆量可能會導致可用記憶體下降。

使用 Performance Insights 監控資料庫執行個體

您可以使用 Performance Insights 來分析資料庫效能,並識別導致執行個體速度變慢的潛在瓶頸。使用 Performance Insights 儀表板監控資料庫負載、等待、查詢、主機和使用者。

對資料庫執行個體執行定期維護

定期執行索引維護並保持統計資料更新。高度碎片化的索引會增加 I/O 活動並導致記憶體使用量增加。此外,過時的統計資料可能會導致基數估計不準確,並導致資料庫選擇次優的查詢計劃。如需詳細資訊,請參閱 Microsoft 網站上的最佳化索引維護,以提高查詢效能並減少資源消耗。另請參閱 Microsoft 網站上的更新統計資料 (Transact-SQL)

**注意:**最佳做法是在非尖峰時段或維護時段執行索引和統計資料維護。

監控 PLE 和 BCHR

若要識別記憶體壓力,請監控頁面預期壽命 (PLE) 和緩衝區快取命中率 (BCHR)。為了獲得最佳效能,請檢查 PLE 和 BCHR 的值是否已盡力提高。如果 PLE 和 BCHR 的值在一段時間內持續較低,請調整存取資料的查詢,或增加執行個體類別以提供更多記憶體。

若要使用 Performance Insights 監控指標,請完成以下步驟:

  1. 開啟 Amazon RDS console (Amazon RDS 主控台)。
  2. 在導覽窗格中,選擇 Performance Insights
  3. 使用 Filter a DB instance (篩選資料庫執行個體) 搜尋欄位,選取要監控的執行個體。
  4. 設定您想要查看指標的時間範圍。
  5. Metrics dashboard (指標儀表板) 中,選取 Custom dashboard - SQL Server database (自訂儀表板-SQL Server 資料庫),然後選擇 Add first widget (新增第一個小工具)。
  6. Filter metrics by name, category or ID (依名稱、類別或 ID 篩選指標) 搜尋欄位中,搜尋 Page Life Expectancy (頁面預期壽命),然後加以選取。
  7. 選擇 Add Widget (新增小工具)。
  8. 重複步驟 6 和步驟 7,在自訂儀表板選取 Buffer Cache Hit Ratio (緩衝快取命中比率)。

如需 PLE 和 BCHR 的詳細資訊,請參閱 Microsoft 網站上的緩衝區管理器效能物件

當執行個體存在記憶體壓力且 PLE 和 BCHR 較低時,PAGEIOLATCH 等待時間會增加。Microsoft SQL Server 正在等待將頁面從磁碟載入到記憶體。當查詢的記憶體請求因記憶體不足而失敗時,您可能也會看到 RESOURCE_SEMAPHORE 等待。此時,CPU 使用量會增加,因為資料頁面在記憶體中快取的時間不夠長。發生這種情況時,Microsoft SQL Server 必須重複存取磁碟上的資料。

為您的工作負載選擇正確的執行個體大小

執行個體上的記憶體數量取決於執行個體類型。請確定您選取具有足夠資源的執行個體類別,以便資料庫執行個體具有足夠的資源來處理工作負載。當執行個體的資源較少時,您會遇到效能問題。執行個體過大會浪費資源。

例如,db.r5.8xlarge 執行個體類別提供 32 個 vCPU 和 256 GiB 記憶體。當您使用 db.r5.8xlarge 佈建 Amazon RDS 執行個體時,下列資源會共用執行個體類別上的所有 256 GiB 記憶體:

  • 作業系統
  • Amazon RDS 程序
  • 資料庫引擎
  • 工作執行緒
  • 商業智慧套件應用程式,例如 SSIS、SSAS 和 SSRS。

如需 Microsoft SQL Server 如何使用記憶體的詳細資訊,請參閱 Microsoft 網站上的記憶體管理架構指南

確定資源使用基準

若要確定執行個體上資源使用情況的基準,請監控諸如 FreeableMemory頁面預期壽命緩衝區快取命中率等指標。如果執行個體上的資料量顯著增加,請增加 max_server_memory 值。請確定根據資料量變化比例增加 max_server_memory 值,以保持執行個體的相同效能水準。

**注意:**若要識別使用 SQL Server 內部使用記憶體的元件,您可以使用 SQL Server 工具,例如報表和 DMV。

若要使用 SQL Server Management Studio (SSMS) 檢視 SQL Server 記憶體使用情況,請完成下列步驟:

  1. 開啟 SSMS,然後連線到您的 Amazon RDS for SQL Server 執行個體。
  2. Object Explorer (物件總管) 中,以滑鼠右鍵按一下 Amazon RDS 執行個體端點名稱。
  3. 選擇 Reports (報告)、Standard Reports (標準報告)、Memory Consumption (記憶體消耗)。

若要下載 SSMS,請參閱 Microsoft 網站上的下載 SQL Server Management Studio (SSMS)

您也可以查詢 sys.dm_os_memory_clerks 來識別 SQL Server 內部使用最大記憶體的元件。如需詳細資訊,請參閱 Microsoft 網站上的 sys.dm_os_memory_clerks (Transact-SQL)SQL Server 引擎的內部記憶體使用情況