問題描述
雲服務(Cloud Services)在使用期間,頻繁發生崩潰事件,在崩潰期間,檢視CPU負載為100%,而且同時伴随以下情況:
- 部署在雲服務上的應用無法通路
- 遠端連接配接雲服務執行個體(RDP)通路黑屏,無法加載或Busy狀态
排查方案
在問題的關鍵點中,CPU負載達到了100%。是以首先需要排查如下幾點:
- 目前雲服務是單執行個體還是多執行個體?
- 執行個體的機型是小還是大?是什麼型号的機器呢?
- 執行個體中運作的服務是不是非常耗費CPU?
- CPU出現滿負載的情況是否有時間規律?
- 部署在雲服務上的應用請求量是否與CPU100%的規律一緻?
針對以上每一點,采用不同的解決方案。
一:修改雲服務的執行個體數量
有多種方式修改雲服務執行個體的數量。在門戶中直接修改或修改雲服務配置檔案ServiceConfiguration.Cloud.cscfg中<Instances count="1" />數量
- 雲服務門戶 -> 配置
- 修改ServiceConfiguration.Cloud.cscfg後重新釋出
二:修改雲服務中執行個體機型的大小和型号
ServiceDefinition.csdef 檔案指定 Azure 用于配置雲服務的設定,在其中可以指定A,D,E等不同的系列機型。修改完成後重新打包雲服務并進行部署。
- A系列:https://docs.azure.cn/zh-cn/cloud-services/cloud-services-sizes-specs#a-series
- D系列:https://docs.azure.cn/zh-cn/cloud-services/cloud-services-sizes-specs#d-series
- E系列:https://docs.azure.cn/zh-cn/cloud-services/cloud-services-sizes-specs#ev3-series
修改方式如下:
三:檢視執行個體中具體是那個程序消耗CPU最高及時間規律
在CPU高的情況下RDP到目前執行個體上,打開任務管理器,到程序選項,看一下是哪個程序占用的CPU比較高,這是目前直覺的方式之一。其他方式還包含:
- 開啟Performance Monitor并設定抓取程序,詳細步驟參考文章:【Azure微服務 Service Fabric 】在SF節點中開啟Performance Monitor及設定抓取程序的方式
- 在Azure中開啟Application Insights收集 Azure 雲服務的性能計數器, 詳細步驟參考文章:Application Insights
Performance Monitor 配置頁面:
四:當CPU消耗與部署在雲服務中的應用相關時,通過擷取應用DUMP檔案來判斷CPU的具體消耗
當判斷出是由于某個程序而引起的CPU消耗過高,但是需要進一步分析改程序為何會占用如此多資源時。就需要借助抓取dump和分析dump的工具,如:Procdump(抓取),DebugDiag(分析)
Procdump抓取Dump的運作下面的指令如下:
procdump.exe -ma 9332 -c 90 -s 30 -n 3
參數說明:
-ma: 表示抓full dump
-c: 設定CPU的門檻值,比如例子中門檻值是90%
-s: CPU 連續超過門檻值的時間長度,比如例子中是30s,即隻有在這個程序連續占用CPU 超多90%且持續30s才會抓dump;
-n: 抓dump的數量,比如3
9332 是程序id
參考資料
配置雲服務的大小: https://docs.azure.cn/zh-cn/cloud-services/cloud-services-sizes-specs#configure-sizes-for-cloud-services
當在複雜的環境中面臨問題,格物之道需:濁而靜之徐清,安以動之徐生。 雲中,恰是如此!