Complete a 3 Question Survey and Earn a re:Post Badge
Help improve AWS Support Official channel in re:Post and share your experience - complete a quick three-question survey to earn a re:Post badge!
為什麼 Amazon RDS 資料庫執行個體在具有足夠的記憶體時使用交換記憶體?
我正在執行 Amazon Relational Database Service (Amazon RDS) 資料庫執行個體。即使我已配置足夠的可用記憶體,執行個體仍在使用大量交換記憶體。我想對此問題進行疑難排解。
簡短描述
執行 Linux 的 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體會在系統需要的記憶體超過配置的記憶體時使用交換記憶體。如需詳細資訊,請參閱啟用 M1 和 C1 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 以檢閱資料庫上執行的所有執行緒。如需詳細資訊,請參閱 MySQL 網站上的 SHOW PROCESSLIST 陳述式。SHOW FULL PROCESSLIST 輸出的程序 ID 不會與增強型監控顯示的程序 ID 相符。若要檢視正確的程序 ID,請將與資料庫關聯的資料庫參數群組修改為 Performance_Schema 參數。這是靜態參數,因此您必須重新啟動 RDS 資料庫執行個體。
**注意:**若要避免停機時間,請修改參數並在尖峰流量時數以外重新啟動資料庫。
在記憶體達到所需的用量之後,請完成下列步驟:
- 在「增強型監控」頁面中排序程序 ID,以便查看耗用 CPU 上限的程序 ID。
- 以主要使用者身分執行下列查詢:
例如,如果 Thread_OS_Id 10374 和 1432 耗用最大記憶體,請執行下列查詢:select * from performance_schema.threads where THREAD_OS_ID in (ID shown in the Enhanced Monitoring window)\G
如需詳細資訊,請參閱 MySQL 網站上的執行緒資料表。select * from performance_schema.threads where THREAD_OS_ID in (10374, 1432)\G
- 從此查詢的輸出中取得 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 是 RDS for SQL Server 所說的核心程序 ID (KPID)。
透過 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>';
當您啟用增強型監控時,請比較 FreeMemory 和 FreeableMemory 指標。如果這些指標不同,則可能表示快取或非作用中記憶體使用大量記憶體。這種記憶體使用可能會導致更高的交換用量。您可能需要清除快取。如需如何清除快取的更多資訊,請參閱清除緩衝區快取。
**注意:**清除緩衝區快取可能會對您的資料庫效能產生負面影響。
相關資訊

相關內容
- 已提問 7 個月前lg...
- 已提問 2 年前lg...
- 已提問 9 個月前lg...
- 已提問 2 年前lg...
- 已提問 2 年前lg...