我在 Amazon Relational Database Service (Amazon RDS) for Microsoft SQL Server 資料庫執行個體上遇到高 CPU 使用率。如何針對高 CPU 使用率進行疑難排解和解決?
簡短描述
CPU 使用率增加的常見原因包括下列各項:
- 使用者啟動的繁重工作負載、多個並行查詢或長時間執行的交易
- 針對工作負載使用佈建不足的執行個體類別
- 過期的統計資料和索引分散化或遺失的索引
- 有改善範圍的查詢
- 封鎖和鎖死
- 平行處理
- 頻繁編譯和重新編譯
- 參數嗅探
- 執行緒耗盡
若要識別您的 Amazon RDS for SQL Server 執行個體中的 CPU 使用率來源,請使用下列工具:
- Amazon RDS 的 Amazon CloudWatch 指標
- 增強型監控
- Performance Insights
- SQL Server 原生工具
識別來源之後,您可以分析並最佳化工作負載,以降低 CPU 使用率。
解決方案
Amazon RDS 的 Amazon CloudWatch 指標
您可以使用 CloudWatch 指標來識別長時間的 CPU 模式。比較 WriteIOPS、ReadIOPS、ReadThroughput 和 WriteThroughput 以及 CPU 使用率的圖表,以找出工作負載造成高 CPU 的時間。如需詳細資訊,請參閱 Amazon RDS 的 Amazon CloudWatch 指標。
如果您使用 t2 或 t3 執行個體類別的執行個體,請檢查執行個體是否佈建不足。如果您發現 CPU 積分餘額持續下降,且 CPU 積分使用率持續增加,則 CPU 核心不足以滿足您的工作負載。
識別時間範圍之後,您可以檢閱與資料庫執行個體相關聯的增強型監控資料。您可以設定增強型監控,以 1、5、10、15、30 或 60 秒的間隔收集資料。這樣做可讓您以比 CloudWatch 更精細的等級收集資料。
增強型監控
如果您已設定增強型監控,則可以使用它來監控資料庫執行個體上執行的作業系統。若要使用增強型監控來檢查 CPU 使用率,請執行下列動作:
- 在 RDS 主控台中,選取 Databases (資料庫),然後選擇您的資料庫。
- 在 Monitoring (監控) 標籤上,從Monitoring (監控) 下拉式功能表中選取 OS process list (作業系統程序清單)。確認高 CPU 是否由作業系統、RDS 處理序、SQL Server 處理序或 SQL 代理程式處理序所造成。您也可以檢查 CPU 的百分比和這些處理序使用的記憶體百分比。
- 從 Enhanced monitoring (增強型監控) 下拉式清單中選取指標,以檢查效能監控資料。這些指標包括 CPU 閒置、核心和使用者。這些指標會告訴您 CPU 是否花費大部分時間在閒置狀態、執行核心或執行使用者處理序。
- 選取 Manage Graphs (管理圖形) 以檢視其他指標。然後,您可以選取與 I/O 和磁碟輸送量相關的指標。這些指標包括「讀取/秒」、「寫入/秒」、「讀取 Kb/秒」和「寫入 Kb/秒」。您也可以檢視記憶體相關參數,包括可用記憶體、SQL Server 記憶體和總記憶體。這些指標很有幫助,因為如果您的 CPU 花費大量時間等待資源,您可能會看到高 CPU 使用率。
如需詳細資訊,請參閲在 RDS 主控台中檢視作業系統指標。
Performance Insights
您可以使用 Amazon RDS Performance Insights 來識別負責資料庫負載的查詢。若要完成此操作,
- 請勾選與您想要分析之時間範圍對應的 SQL 標籤。
- 識別執行時間最長的查詢。
- 檢查資源密集型查詢,以及在此期間觀察到的等待事件。以下是與高 CPU 使用率相關聯的等待事件:
**SOS_SCHEDULER_YIELD:**此等待表示工作者讓其他人先執行。等待時間較低的高等待計數通常表示有 CPU 限制的查詢。這裡的高等待時間可能是由於讓步問題引起的。如果您在這裡看到很長的等待時間,則必須進一步檢閱工作負載。
如果 SOS_SCHEDULER_YIELD 是普遍的等待類型,則可能表示 CPU 壓力是問題所在。檢閱工作負載類型並執行其他調整。
**CXPACKET 和 CXCONSUMER:**平行處理相關的等待事件通常不是考量。但是,如果等待事件頻繁且會影響效能,請檢閱查詢並針對平行處理的成本閾值設定適當的值。請確定 SQL Server 在參數群組中選擇成本較低的平行處理參數。
您也可以根據您的使用案例,在查詢或執行個體層級將 MAXDOP (最大程度平行處理) 增加為 1。
**ThreadPool:**此等待事件表示執行緒耗盡。如果您的執行個體類別能夠處理它,請增加最大工作者執行緒參數。ThreadPool 等待可能是由於使用過多執行緒而發生。由於封鎖、高工作負載或大量平行查詢,而使用過多執行緒。或者,此等待可能是因為最大工作者執行緒參數設定錯誤所造成。
- 檢查資料庫指標是否有批次請求、SQL 編譯和 SQL 重新編譯。檢查查詢是否編譯多次,表示即興查詢。同時檢查查詢是否針對指定批次頻繁重新編譯,表示在查詢程式碼中使用 with recompile。這兩者都會導致高 CPU 使用率。
SQL Server 原生工具
**CPU 特定查詢疑難排解:**如需詳細資訊,請參閱 Microsoft 文件網站上的針對 SQL Server 中的高 CPU 使用率問題進行疑難排解。專注於 CPU 密集型查詢、更新統計資料、遺失索引和參數嗅探。
檢查執行計劃是否有效能不佳的查詢並執行其他調整。 如需詳細資訊,請參閱 Microsoft 文件網站上的顯示實際執行計畫。
使用查詢和擴充事件針對過多鎖定、封鎖和鎖死相關的問題進行疑難排解。 如需詳細資訊,請參閱 Microsoft 文件網站上的了解和解決 SQL Server 封鎖問題。
**注意:**在 RDS for SQL Server 中設定擴充事件時,您無法使用一般方法來儲存 XEL 檔案。如需有關如何設定擴充事件的指示,請參閱在 Amazon RDS for SQL Server 中設定擴充事件。
您可以使用 SQL Server 報告取得 SQL Server 中原生可用的效能報告。 使用這些報告來微調您的工作負載。如需詳細資訊,請參閱 Microsoft 文件網站上的效能儀表板。