如何對 Amazon RDS for MySQL 資料庫中的可釋放記憶體不足進行疑難排解?

2 分的閱讀內容
0

我正在執行適用於 MySQL 執行個體的 Amazon Relational Database Service (Amazon RDS)。我的可用記憶體不足,我的資料庫記憶體不足,或記憶體不足導致應用程式出現延遲問題。

簡短說明

若要對記憶體不足問題進行疑難排解,請先檢查 Amazon RDS for MySQL 如何使用記憶體。如需更多詳細資訊,請參閱 MySQL 網站上的 8.12.4.1 MySQL 如何使用記憶體。識別使用記憶體的元件。然後,尋找執行個體和資料庫層級的瓶頸。最後,監控這些元件的指標,並設定您的工作階段以獲得最佳效能。

解決方法

檢查 RDS for MySQL 如何使用記憶體

為了最佳化效能,RDS for MySQL 會將執行個體上 80% 至 90% 的可用記憶體分配給預設參數。如果您設定使用更多記憶體的參數,請修改其他參數以使用較少的記憶體進行補償。

若要計算 RDS for MySQL 資料庫執行個體的大約記憶體使用量,請使用下列公式: 最大 MySQL 記憶體使用量 = innodb_buffer_pool_size + key_buffer_size + ((read_buffer_size + read_rnd_buffer_size + sort_buffer_size + join_buffer_size) X max_connections)

緩衝集區

innodb_buffer_pool_size 參數是 RAM 的記憶體區域,其中 InnoDB 快取資料庫資料表和索引相關的資料。緩衝集區越大,需要轉移回磁碟的 I/O 操作越少。依預設,innodb_buffer_pool_size 使用配置給 Amazon RDS 資料庫執行個體的最多 75% 的可用記憶體:innodb_buffer_pool_size = DBInstanceClassMemory*3/4

若要識別記憶體使用的來源,請先檢查 innodb_buffer_pool_size。接著如果需要,修改自訂參數群組中的參數值以減少 innodb_buffer_pool_siz

例如,您可以將預設的 DBInstanceClassMemory*3/4 減少為 *5/8*1/2。請確保執行個體的 BufferCacheHitRatio 值不會太低。如果 BufferCacheHitRatio 值很低,則可能需要增加執行個體大小以取得更多 RAM。如需更多詳細資訊,請參閱設定 Amazon RDS for MySQL 參數的最佳實務,第 1 部分: 與效能相關的參數

MySQL 執行緒

還會為連接至 MySQL 資料庫執行個體的每個 MySQL 執行緒配置記憶體。下列執行緒需要配置記憶體:

  • thread_stack
  • net_buffer_length
  • read_buffer_size
  • sort_buffer_size
  • join_buffer_size
  • max_heap_table_size
  • tmp_table_size
  • binlog_cache_size

此外,MySQL 會建立臨時內部表格來執行一些操作。當表格達到 tmp_table_sizemax_heap_table_size 的最低值時,MySQL 會將表格從以記憶體為基礎的表格轉換為以磁碟為基礎的表格。如果多個工作階段建立臨時內部表格,則可能會看到記憶體使用量增加。若要減少記憶體使用,請勿在查詢中使用臨時表格。

注意: 當您增加 tmp_table_sizemax_heap_table_size 的值時,您可使較大的暫時表格存在於記憶體中。若要驗證 MySQL 是否建立隱藏暫存表格,請使用 created_tmp_tables 變數。如需更多有關此變數的詳細資訊,請參閱 MySQL 網站上的 Created_tmp_tables

JOIN 和 SORT 操作

如果在 JOIN 或 SORT 操作期間,MySQL 分配多個相同類型的緩衝區 (例如 join_buffer_sizesort_buffer_size),記憶體用量將會增加。例如,MySQL 分配一個 JOIN 緩衝區來執行兩個表格之間的 JOIN。對於使用多表格 JOIN 的查詢且所有查詢都需要 JOIN 緩衝區,MySQL 會分配比表格總數少一個的 JOIN 緩衝區。如果您設定的工作階段變數值太高,查詢若未最佳化時,則會遇到問題。為工作階段層級變數分配所需的最小記憶體,例如 join_buffer_size sort_buffer_size

注意: 如果您對 MYISAM 表格執行大量插入,則 MySQL 會使用 bulk_insert_buffer_size 個位元組的記憶體。如需更多詳細資訊,請參閱使用 MySQL 的最佳實務

效能結構描述

如果您啟用效能洞察,則 MySQL 會在啟用執行個體和伺服器作業期間,為效能結構描述分配內部緩衝區。如需更多有關效能結構描述如何使用記憶體的詳細資訊,請參閱 MySQL 網站上的 29.17 效能結構描述記憶體配置模型

除了效能結構描述資料表外,您還可以使用 MySQL sys 結構描述。例如,使用 performance_schema 事件來顯示 MySQL 為效能結構描述使用的內部緩衝區分配多少記憶體。或者,執行下列查詢以查看已分配多少記憶體:

SELECT * FROM performance_schema.memory_summary_global_by_event_name WHERE EVENT_NAME LIKE 'memory/performance_schema/%';

您可以在 setup_instruments 表格中找到 memory/code_area/instrument_name 格式的記憶體儀表。

若要啟動記憶體儀表,請在 setup_instruments 表格中,將儀表的 ENABLED (啟動) 資料欄設定為 YES (是):

UPDATE performance_schema.setup_instruments SET ENABLED = 'YES' WHERE NAME LIKE 'memory/%';

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

CloudWatch 指標

當可用記憶體不足時,請使用 Amazon RDS 主控台上的 Monitoring (監視) 索引標籤來監控 DatabaseConnectionsCPUUtilizationReadIOPSWriteIOPS Amazon CloudWatch 指標。

對於 DatabaseConnections,對資料庫進行的每個連線都需要分配記憶體。因此,資料庫連線激增可能會導致可釋放的記憶體下降。使用下列公式來計算預估的 max_connections 配額: DBInstanceClassMemory/12582880。若要檢查您是否超過此配額,請檢查DatabaseConnections 指標。

若要檢查記憶體壓力,請監控 SwapUsageFreeableMemory CloudWatch 指標。高交換用量和較低的可釋放記憶體可能會對執行個體造成高記憶體壓力。最佳實務是將記憶體壓力程度保持在 95% 以下。高記憶體壓力會影響資料庫效能。如需更多詳細資訊,請參閱為什麼 Amazon RDS 資料庫執行個體在我具有足夠的記憶體時使用交換記憶體?

增強型監控

若要監控資料庫執行個體的資源使用率,請啟用增強型監控。然後將精度設定在 1 到 5 秒之間。預設的精度為 60 秒。使用增強型監控,您可以即時監控可釋放記憶體和作用中記憶體。

若要監控消耗最多 CPU 和記憶體的執行緒,請執行下列命令以列出資料庫執行個體的執行緒:

mysql> select THREAD_ID, PROCESSLIST_ID, THREAD_OS_ID from performance_schema.threads;

然後,運行以下命令將 thread_OS_ID 對映到 thread_ID

select p.* from information_schema.processlist p, performance_schema.threads t
where p.id=t.processlist_id and t.thread_os_id=thread-ID;

注意:thread-ID 取代執行序 ID。

疑難排解可釋放記憶體不足

確保您具有足夠的資源分配給您的資料庫來執行查詢。使用 Amazon RDS 時,分配的資源量取決於執行個體類型。此外,特定查詢 (例如儲存程序) 在執行時可能會佔用無限量的記憶體。將大型查詢分割成較小的查詢,以避免長時間執行交易。

若要檢視資料庫中所有作用中的連線和查詢,請使用 SHOW FULL PROCESSLIST 命令。如需更多有關 SHOW FULL PROCESSLIST 和範例命令的詳細資訊,請參閱 MySQL 網站上的 13.7.5.29 SHOW PROCESSLIST 陳述式。如果您發現具有 JOIN 或 SORTS 作業的查詢會長時間執行,則必須擁有足夠的 RAM 供最佳化計算計畫。此外,如果您識別需要暫時表格的查詢,則必須具有額外的記憶體才能分配給表格。

若要檢視長時間執行的交易、記憶體使用率統計資料或鎖定,請使用 SHOW ENGINE INNODB STATUS 命令。如需更多有關 SHOW ENGINE 命令的詳細資訊,請參閱 MySQL 網站上的 13.7.5.15 SHOW ENGINE 陳述式。檢閱輸出並檢查 BUFFER POOL AND MEMORY 項目的 InnoDB 記憶體配置有關資訊,例如已分配的總記憶體內部雜湊表緩衝集區大小。InnoDB 狀態還提供關於閂鎖、鎖定和鎖死的資訊。如果您的工作負載經常遇到鎖死,請在自訂參數群組中修改 innodb_lock_wait_timeout 參數。InnoDB 依賴於 innodb_lock_wait_timeout 設定在發生鎖死時復原交易。

若要最佳化資料庫效能,請最佳化和調整查詢。使用 Amazon RDS Performance Insights 以監控資料庫執行個體,並識別有問題的查詢。亦請在 FreeableMemory 指標上設定 CloudWatch 警示,以在可用記憶體達到 95% 時收到通知。最佳實務是保持至少 5% 的執行個體記憶體可用。

定期升級執行個體的 MySQL 次要版本。較早的次要版本可能包含記憶體洩漏相關的錯誤。如需更多有關 MySQL 版本的詳細資訊,請參閱 MySQL 網站上的 MySQL 8.0 版本說明

相關資訊

Amazon RDS 的監控工具