问题描述
云服务(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
参考资料