我正在執行 Amazon Relational Database Service (Amazon RDS) 資料庫執行個體。即使我已配置足夠的可用記憶體,它仍在使用大量交換記憶體。為什麼在我具有足夠的記憶體時使用交換記憶體?
簡短描述
執行 Linux 的 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體會在系統需要的記憶體超過配置的記憶體時使用交換記憶體。如需詳細資訊,請參閱執行個體儲存體交換磁碟區。由於大多數 RDS 資料庫執行個體都使用 Linux (SQL Server 除外),因此您的資料庫有時可能使用交換記憶體。
僅當目前存取 RAM 中的分頁時 (例如,在執行查詢時),RDS 資料庫執行個體才需要這些分頁。由先前執行的查詢引入 RAM 的其他分頁會排清以交換空間 (如果最近未使用這些分頁)。最佳實務是讓作業系統 (OS) 交換較舊的分頁,而不是強制作業系統將分頁保留在記憶體中。這可確保具有足夠的可用 RAM 用於即將進行的查詢。
Linux 交換用量不會經常清除,因為清除交換用量需要額外負荷,以便在需要時以及重新載入分頁時重新配置交換。因此,如果在 RDS 資料庫執行個體上使用了交換空間,即使是一次,SwapUsage 指標也不會傳回零。如果您使用 Amazon RDS for Oracle 支援的 HugePages 和 Amazon RDS for PostgreSQL 上的 HugePages,也可以使用交換記憶體。HugePages 大於 Linux 預設大小 2 MB。
解決方法
若要了解 RDS 資料庫執行個體的交換使用行為,請先根據應用程式工作負載檢查資料庫效能指標。同時檢查 FreeableMemory 和 SwapUsage Amazon CloudWatch 指標,以了解 RDS 資料庫執行個體的整體記憶體用量模式。檢查這些指標,看看 FreeableMemory 指標是否在 SwapUsage 指標增加的同時出現減少。這可能表示 RDS 資料庫執行個體的記憶體存在壓力。如需詳細資訊,請參閱如何對 Amazon RDS for MySQL 資料庫中的可釋放記憶體不足進行疑難排解?如果具有足夠的可釋放記憶體可用,則交換用量應不會影響 RDS 資料庫執行個體的效能。如果可釋放記憶體持續較低,您可以將 RDS 資料庫執行個體大小變更為具有更多記憶體的較大執行個體大小。
若要監控交換記憶體,請開啟增強型監控,以最少一秒的精細程度間隔檢閱指標。增強型監控會在主機層級收集統計資料,CloudWatch 每 60 秒從 Hypervisor 層級收集資料。使用「增強型監控」識別僅發生一秒的增加或減少,並查看個別程序使用的 CPU 和記憶體。如需詳細資訊,請參閱使用 CloudWatch 日誌檢視作業系統指標。
您也可以開啟 Performance Insights,以識別 RDS 資料庫執行個體上耗用過多交換或記憶體的 SQL 和等待事件。Performance Insights 會在資料庫層級收集資料,並在 Performance Insights 儀表板中顯示該資料。Performance Insights 可協助您對與資料庫效能相關的問題進行疑難排解。如需詳細資訊,請參閱使用 Amazon RDS 上的 Performance Insights 監控資料庫負載。
Amazon RDS for MySQL
如果您的可用記憶體不足,請執行 SHOW FULL PROCESSLIST 以檢閱資料庫上執行的所有執行緒。SHOW FULL PROCESSLIST 輸出的程序 ID 不會與增強型監控顯示的程序 ID 相符。若要檢視正確的程序 ID,請將與資料庫關聯的資料庫參數群組修改為 Performance_Schema 參數。這是靜態參數,因此您必須重新啟動 RDS 資料庫執行個體。若要避免停機時間,請修改參數並在尖峰流量時數以外重新啟動資料庫。在記憶體達到所需的用量之後,請執行下列步驟:
1. 在「增強型監控」頁面中排序程序 ID,以便查看耗用 CPU 上限的程序 ID。
2. 以主要使用者身分執行下列查詢:
select * from performance_schema.threads where THREAD_OS_ID in (ID shown in the Enhanced Monitoring window)\G
例如,如果 Thread_OS_Id 10374 和 1432 耗用最大記憶體,請執行下列查詢:
select * from performance_schema.threads where THREAD_OS_ID in (10374, 1432)\G
如需詳細資訊,請參閱 MySQL 網站上的執行緒資料表。
3. 從此查詢的輸出中取得 PROCESSLIST_ID 資料欄。這為您提供了與 SHOW FULL PROCESSLIST 中的程序 ID 值相符的程序 ID。
取得正確的程序 ID 之後,您可以將程序 ID 與查詢映射。您可以使用 ID 來識別高記憶體和 CPU 用量的根本原因。您可以使用增強型監控來檢視作業系統程序。如需詳細資訊,請參閱在 RDS 主控台中檢視作業系統指標。
Amazon RDS for PostgreSQL
若要識別耗用大量記憶體的程序,請將增強型監控程序清單中的程序 ID 映射至確切的查詢。若要識別程序,請執行下列 pg_stat_activity 視圖:
select * from pg_stat_activity where pid=(the PID of your process);
然後,調校查詢以耗用較少的運算資源。
Amazon RDS for SQL Server
增強型監控可能會識別耗用大量記憶體的特定執行緒 ID。執行緒 ID 是 SQL Server 所說的核心程序 ID (KPID)。
透過 Amazon RDS for SQL Server,執行下列查詢以取得與 KPID 對應的伺服器程序 ID (SPID):
select * from sys.sysprocesses where kpid = '<Value of Thread ID from Enhanced Monitoring>' ;
取得伺服器程序 ID (例如 69) 之後,請執行下列命令,以檢閱 SPID 69 正在執行的動作:
dbcc inputbuffer(69)
Amazon RDS for Oracle
透過使用增強型監控中的作業系統程序 ID,您可以看到哪個程序耗用最多記憶體。然後,執行下列查詢以取得工作階段的程序地址:
select ADDR from v$process where SPID=OS_PID;
您可以使用程序地址,透過執行下列查詢來識別資料庫內的工作階段:
select sid,serial#,username, status from v$session where PADDR='<ADDR from above query>';
相關資訊
監控 Amazon RDS 概觀