為什麼我的 EC2 Linux 執行個體由於資源過度使用而沒有回應?

2 分的閱讀內容
0

我的 Amazon Elastic Compute Cloud (Amazon EC2) Linux 執行個體由於資源過度使用而沒有回應。如何才能防止這種情況?

簡短說明

執行個體沒有回應的常見原因有以下幾種:

  • **記憶體:**EC2 執行個體在預設情況下沒有配置交換空間。記憶體不足會叫用 Linux 記憶體不足 (OOM) 管理員。OOM 管理員會終止流程,例如資料庫、Web 伺服器或 SSH 服務。
  • **聯網:**在未聯網時,您的系統無法回應狀態檢查的 ARP 請求。發生這種情況時,您的執行個體無法與其他主機通訊。
  • **I/O 操作:**在沒有磁碟 I/O 的情況下,讀取或寫入指示會卡住。例如,建立暫時檔案,從系統庫或資料庫讀取。
  • **CPU:**所有上述任務都需要 CPU 時間才能工作。長時間 100% CPU 使用率會阻止核心執行正常的作業系統操作。

這些問題也可能積累成滾雪球效應。例如,記憶體不足時,OOM 管理員會終止重要的流程。現在,依賴已停止的第一個流程的第二個流程可啟動更多的 CPU 週期。如果此任務與磁碟相關,則此週期也可能會耗盡 Amazon Elastic Block Store (Amazon EBS) 磁碟區。此外,問題可能會轉移至需要與無回應執行個體進行通訊的其他執行個體。

解決方法

如果您的系統 CPU 使用率較高,或者由於資源過度使用而經常沒有回應,請執行下列操作:

收集資訊

使用 Amazon CloudWatch 監控 CPU 使用率

使用監控工具 (例如 Amazon CloudWatch) 來觀察資源使用率較高的趨勢和模式

使用系統監控工具

如果您具有多個服務且不確定哪個服務過度使用了資源,則請安裝 atop 之類的公用程式。您還可以使用 htoptopsar 之類的工具。所有這些工具都有助於識別耗用最高 CPU 使用率的流程。如需詳細資訊,請參閱下列內容:

取得有關 CPU 使用率較高的流程的詳細資訊

使用 pidstatps 命令來取得有關此流程的更多詳細資訊。命令輸出中提供的資訊可協助您判斷此流程是系統流程還是使用者流程。如需有關如何設定和使用執行這些命令所需工具的詳細資訊,請參閱下列內容:

檢查系統日誌

檢查與 CPU 使用率較高相關的錯誤或警告。例如,使用 dmesg 命令來檢視核心訊息,並檢視 /var/log/syslog/var/log/messages 檔案中是否有系統訊息。命令輸出和日誌檔案內容有助於識別造成問題的系統或應用程式問題。

檢閱命令歷史記錄

檢閱命令的歷史記錄,以查看是否存在人為錯誤。命令歷史記錄通常位於 ~/.bash_history 檔案中。

檢查已排程的任務

檢查 EC2 執行個體上是否正在執行任何可能導致 CPU 使用率較高的排程任務或 cron 任務。首先,確認 CPU 使用率較高的時間戳記。然後執行下列命令以列出 cron 任務:

sudo crontab -l
sudo cat /etc/crontab
sudo cat crontab -l -u <username>

上述命令會列出根使用者的 crontab 組態。在命令中包含 -u 選項,以檢查特定使用者的 cron。然後,尋找您註意到問題的時間。檢查您的日誌,包括以下內容:

/var/log/messages
/var/log/syslog
/var/log/dmesg
/var/log/cron.log

使用 grep 命令來篩選您要調查的特定 cron 任務的相關項目。確認是否發生與其中一個已識別 cron 相關的錯誤。

檢查記憶體用量

由於交換空間使用量,記憶體使用率較高可能會導致 CPU 使用率較高。使用 free 命令檢查記憶體用量。如需有關如何設定和使用必要工具的詳細資訊,請參閱 redhat.com 網站上的剖析 free 命令

檢查網路流量

網路流量較高可能會導致 CPU 使用率較高,尤其是執行個體正在處理大量網路請求時。使用 iftop 命令監控網路流量,並考慮優化網路組態或視需要升級執行個體類型。如需有關如何設定和使用必要工具的詳細資訊,請參閱 redhat.com 網站上的使用 iftop 隨需進行 Linux 介面分析

檢查磁碟 I/O

磁碟 I/O 較高可能會導致 CPU 使用率較高。使用 iostat 命令監控磁碟 I/O,並識別任何可能導致 I/O 較高的流程。如需詳細資訊,請參閱 redhat.com 網站上的 Linux 命令列中的 I/O 報告

根據取得的資料採取行動

優化代碼

如果您的應用程式導致 CPU 使用率較高,則請優化您的程式碼。若要這樣做,請識別並消除效能瓶頸。效能分析工具 (例如 perfstrace) 有助於識別有問題的程式碼。如需有關如何設定和使用必要工具的詳細資訊,請參閱下列內容:

升級執行個體

如果您的流程因正當理由而使用大量資源 (例如接收大量使用者),則請考慮升級執行個體

AWS Compute Optimizer 可以協助您決定要使用的適當執行個體類型和大小。您也可以考慮使用 Amazon EC2 Auto Scaling 進行水平擴展。

設定 Linux 稽核規則

如果想要更清楚地了解使用者命令和組態變更,則您可以設定 Linux 稽核系統以追蹤變更

防止未來過度使用

  1. 在生產中部署新的應用程式之前,先建立測試環境和基準,以判斷必要的運算、記憶體、EBS 和網路。根據您的基準進行部署,同時針對容錯能力進行建置。如需詳細資訊,請參閱下列內容: 
    在分散式系統中設計互動以防止故障
    教學: 設定可擴展且負載平衡的應用程式
  2. 確保執行個體上執行的應用程式已針對效能進行優化。優化涉及調整組態檔案,優化資料庫查詢或優化程式碼。
  3. 如果您的應用程式具有大量資料庫,則請考慮實作快取以減少對資料庫的查詢次數。
  4. 確保您的軟體是最新的,具有最新的安全修補程式和錯誤修正程式。過時的軟體可能會導致效能問題和漏洞,從而導致 CPU 使用率較高。
  5. 如果您的應用程式接收的流量較高,則請考慮使用負載平衡器將流量分配到多個 EC2 執行個體。負載平衡器可降低任何一個執行個體上的 CPU 使用率。
  6. 繼續監控執行個體,並針對特定資源用量閾值建立警報
AWS 官方
AWS 官方已更新 10 個月前