Windows云服务器CPU使用率高的问题一例

简介: 大家好,今天跟大家分享一例Windows云服务器CPU使用率高的问题。

作者:声东

大家好,今天跟大家分享一例Windows云服务器CPU使用率高的问题。

问题症状

客户购买了一台Windows 2016云服务器,登录之后发现这台服务器的CPU使用率一直保持在90%以上。

问题分析

首先登录到服务器,打开任务管理器,切换到性能页面,确认问题确实存在。从下图可以看出,这台服务器有非常明显的CPU使用率高的症状。

1

然后,我们切换到任务管理器,详细信息页面,点击CPU使得进程以CPU使用率高低排序。我们看到CPU使用率最高的进程是svchost.exe。这个进程是Windows操作系统里的服务宿主进程,即service host进程。

2

接下来,我们打开资源管理器,切换到CPU页面,根据上边找到的进程PID,勾选对应的svchost.exe进程。我们发现使用CPU最高的服务是Schedule,也就是微软的计划任务服务。

3

总结上边发现的所有信息,我们可以确认,这台服务器中,计划任务这个服务,占用了系统大量的CPU资源,一般情况下,这是不合理的。进一步调试这个问题,我们需要抓取这个进程的转储文件。Windows里,转储文件可以简单分为两大类,一类是系统的转储文件,一类是某个进程的。系统的转储文件(有可能)包括整个系统的信息,而进程的转储文件,一般只包含这个特定进程的用户控件的信息。在Windows上,我们可以用任务管理器简单的抓取进程转储文件。

4

然后,我们用windbg打开转储文件。另外我这边推荐大家使用一个windbg的扩展,这个扩展在微软技术支持团队普遍使用,非常好用。这个扩展叫做mex。安装这个扩展很简单,只需要根据操作系统是x86或者amd64,把对应的dll拷贝到windbg安装目录下边winext子目录中即可。

https://www.microsoft.com/en-us/download/details.aspx?id=53304

我们使用!mex.us (unique stack)命令在命令行输出进程中所有的call stacks,发现正在运行的线程,基本都在处理 LRPC调用。LRPC调用在接到消息之后,唤起计划任务去查询某个任务相关的信息。

00007ffdffa271c4 ntdll!ZwAlpcSendWaitReceivePort+0x14
 00007ffdfd6db211 rpcrt4!LRPC_BASE_CCALL::DoSendReceive+0x111
 00007ffdfd77808e rpcrt4!NdrpClientCall3+0xa0e
 00007ffdfd775102 rpcrt4!NdrClientCall3+0xf2
 00007ffdff90692b sechost!LsaInternalClientLookupSids+0xa7
 00007ffdff90676e sechost!LsaLookupTranslateSids+0x4e
 00007ffdff90659a sechost!LookupAccountSidInternal+0xda
 00007ffdff9064b5 sechost!LookupAccountSidLocalW+0x25
 00007ffdf605d1c0 schedsvc!User::LookupUserSid+0xd0
 00007ffdf605cfa1 schedsvc!User::FromSidToDomainAccount+0x31
 00007ffdf6033531 schedsvc!User::StreamIn+0x1a1
 00007ffdf6042a69 schedsvc!JobBucket::StreamIn+0x189
 00007ffdf6038410 schedsvc!Triggers::Trigulator::ReadData+0xe0
 00007ffdf603960e schedsvc!Triggers::Trigulator::StreamIn+0x30e
 00007ffdf603eebb schedsvc!JobStore::LoadTaskXml+0x11b
 00007ffdf60500ce schedsvc!RpcServer::RetrieveTask+0x1ae
 00007ffdf604ddc8 schedsvc!SchRpcRetrieveTask+0x28
 00007ffdfd717de3 rpcrt4!Invoke+0x73
 00007ffdfd77bc6d rpcrt4!Ndr64StubWorker+0xbfd
 00007ffdfd6aa8dc rpcrt4!NdrServerCallAll+0x3c
 00007ffdfd6fa194 rpcrt4!DispatchToStubInCNoAvrf+0x24
 00007ffdfd6f90ad rpcrt4!RPC_INTERFACE::DispatchToStubWorker+0x1bd
 00007ffdfd6f995b rpcrt4!RPC_INTERFACE::DispatchToStub+0xcb
 00007ffdfd6d9afc rpcrt4!LRPC_SCALL::DispatchRequest+0x34c
 00007ffdfd6d9f7c rpcrt4!LRPC_SCALL::HandleRequest+0x2bc
 00007ffdfd6f426c rpcrt4!LRPC_ADDRESS::HandleRequest+0x36c
 00007ffdfd6f5acb rpcrt4!LRPC_ADDRESS::ProcessIO+0x91b
 00007ffdfd6e85ca rpcrt4!LrpcIoComplete+0xaa
 00007ffdff9b2bbe ntdll!RtlReleaseSRWLockExclusive+0x116e
 00007ffdff9b3699 ntdll!RtlReleaseSRWLockExclusive+0x1c49
 00007ffdff118364 kernel32!BaseThreadInitThunk+0x14
 00007ffdff9e70d1 ntdll!RtlUserThreadStart+0x21

LRPC机制是一种客户端服务器机制,也就是说,为了理解为什么作为LRPC的服务器端,计划任务会接到LRPC消息。我们可以尝试找出发送消息的客户端进程。下边这个微软官方博客中,提到了怎么在LRPC堆栈上找出客户端进程PID的方法。

https://blogs.msdn.microsoft.com/ntdebugging/2012/02/28/debugging-backwards-proving-root-cause/

具体的原理和方法请参考这篇文章。我们用同样的方式,在不同的调用栈上去找出客户端进程的PID。发现这个进程的PID是一致的。

0:037> .frame /r 0x1a; !mex.x
1a 000000be`ba77f870 00007ffd`fd6e85ca rpcrt4!LRPC_ADDRESS::ProcessIO+0x91b
rax=0006000000000000 rbx=000002739dfc7ed0 rcx=0000027380010000
rdx=00000000c48b6030 rsi=0000000000000001 rdi=0000027380018a80
rip=00007ffdfd6f5acb rsp=000000beba77f870 rbp=000000beba77f970
 r8=0000027380010000 r9=0000000000000000 r10=0000000000ffffff
r11=00000273bfbd9b20 r12=0000000000000000 r13=0000000000000002
r14=0000000000000001 r15=0000000000000001
iopl=0 nv up ei pl zr na po nc
cs=0033 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00000246
rpcrt4!LRPC_ADDRESS::ProcessIO+0x91b:
00007ffd`fd6f5acb 4533ff xor r15d,r15d
0:037> dd 0000027380018a80+8
00000273`80018a88 00001148 00000000 000012e8 00000000
00000273`80018a98 0000176c 00000000 7c9abb2f 00000000
00000273`80018aa8 00000000 00000000 00000000 c48b6036
00000273`80018ab8 00000001 00000002 00000000 00000001
00000273`80018ac8 00000000 00000000 00000000 00000000
00000273`80018ad8 11f97a48 00000000 0000000d 00000000
00000273`80018ae8 00000036 00000000 00000000 00000000
00000273`80018af8 00000036 00000000 004d005c 00630069
0:037> ? 00001148 
Evaluate expression: 4424 = 00000000`00001148

也就是说,LRPC客户端对应的进程PID是4424,可以看到它是客户在另外一个登录会话里的explorer进程。

5

为了了解explorer的行为,我们继续抓explorer的转储文件,我们发现所有与计划任务有关的线程,都来自msctf模块的调用,这个模块跟Text Framework Serivce相关。观察线程行为,可以大概看出,这个模块在通过task schedule去查询信息。

0:057> !us -a taskschd
-a is only for Kernel analysis. Ignoring option.
1 thread [stats]: 52
 00007ffdffa27024 ntdll!NtAlpcCreateSecurityContext+0x14
 00007ffdfd6d5e0a rpcrt4!LRPC_CASSOCIATION::OpenSecurityContextWorker+0xd2
 00007ffdfd6ef9ca rpcrt4!LRPC_BASE_BINDING_HANDLE::DriveStateForward+0x51a
 00007ffdfd6de5e9 rpcrt4!LRPC_BINDING_HANDLE::NegotiateTransferSyntax+0xa79
 00007ffdfd777f11 rpcrt4!NdrpClientCall3+0x891
 00007ffdfd775102 rpcrt4!NdrClientCall3+0xf2
 00007ffdfd6bd9e3 rpcrt4!EP_LOOKUP_DATA::LookupNextChunk+0x10f
 00007ffdfd6bdcd2 rpcrt4!EP_LOOKUP_DATA::ResolveEndpoint+0x186
 00007ffdfd6bb2cd rpcrt4!ResolveEndpointWithEpMapper+0x95
 00007ffdfd6bad1c rpcrt4!ResolveEndpointIfNecessary+0xa8
 00007ffdfd6edb97 rpcrt4!LRPC_BASE_BINDING_HANDLE::SubmitResolveEndpointRequest+0xe3
 00007ffdfd6edd08 rpcrt4!LRPC_BASE_BINDING_HANDLE::ResolveEndpoint+0x100
 00007ffdfd6efa26 rpcrt4!LRPC_BASE_BINDING_HANDLE::DriveStateForward+0x576
 00007ffdfd6de5e9 rpcrt4!LRPC_BINDING_HANDLE::NegotiateTransferSyntax+0xa79
 00007ffdfd777f11 rpcrt4!NdrpClientCall3+0x891
 00007ffdfd775102 rpcrt4!NdrClientCall3+0xf2
 00007ffdf72c7940 taskschd!RpcSession::HighestVersion+0x24
 00007ffdf72c5d2d taskschd!?Connect@?QITaskService@@TaskServiceImpl@@UEAAJUtagVARIANT@@000@Z+0x27d
 00007ffdfd4e793c msctf!DllUnregisterServer+0x118c
 00007ffdfd4871bf msctf+0x71bf
 00007ffdff118364 kernel32!BaseThreadInitThunk+0x14
 00007ffdff9e70d1 ntdll!RtlUserThreadStart+0x21

1 thread [stats]: 53
 00007ffdffa271c4 ntdll!ZwAlpcSendWaitReceivePort+0x14
 00007ffdfd6db211 rpcrt4!LRPC_BASE_CCALL::DoSendReceive+0x111
 00007ffdfd77808e rpcrt4!NdrpClientCall3+0xa0e
 00007ffdfd775102 rpcrt4!NdrClientCall3+0xf2
 00007ffdfba677a3 sspicli!SspipGetUserName+0x123
 00007ffdfba675c0 sspicli!GetUserNameExW+0x50
 00007ffdf72c5bff taskschd!?Connect@?QITaskService@@TaskServiceImpl@@UEAAJUtagVARIANT@@000@Z+0x14f
 00007ffdfd4e793c msctf!DllUnregisterServer+0x118c
 00007ffdfd4871bf msctf+0x71bf
 00007ffdff118364 kernel32!BaseThreadInitThunk+0x14
 00007ffdff9e70d1 ntdll!RtlUserThreadStart+0x21

2 threads [stats]: 54 56
 00007ffdffa271c4 ntdll!ZwAlpcSendWaitReceivePort+0x14
 00007ffdfd6db211 rpcrt4!LRPC_BASE_CCALL::DoSendReceive+0x111
 00007ffdfd77808e rpcrt4!NdrpClientCall3+0xa0e
 00007ffdfd775102 rpcrt4!NdrClientCall3+0xf2
 00007ffdf72c752e taskschd!RpcSession::Enumerate+0xbe
 00007ffdf72c53eb taskschd!?GetFolder@?QITaskService@@TaskServiceImpl@@UEAAJPEAGPEAPEAUITaskFolder@@@Z+0x15b
 00007ffdfd4e7960 msctf!DllUnregisterServer+0x11b0
 00007ffdfd4871bf msctf+0x71bf
 00007ffdff118364 kernel32!BaseThreadInitThunk+0x14
 00007ffdff9e70d1 ntdll!RtlUserThreadStart+0x21

4 threads [stats]: 50 51 55 57
 00007ffdffa271c4 ntdll!ZwAlpcSendWaitReceivePort+0x14
 00007ffdfd6db211 rpcrt4!LRPC_BASE_CCALL::DoSendReceive+0x111
 00007ffdfd77808e rpcrt4!NdrpClientCall3+0xa0e
 00007ffdfd775102 rpcrt4!NdrClientCall3+0xf2
 00007ffdf72cf106 taskschd!RpcSession::GetTaskInfo+0x4e
 00007ffdf72cf053 taskschd!UniSession::GetTaskInfo+0x47
 00007ffdf72fd55e taskschd!?get_State@?QIRegisteredTask@@RegisteredTaskImpl@@UEAAJPEAW4_TASK_STATE@@@Z+0x7e
 00007ffdfd4e79a3 msctf!DllUnregisterServer+0x11f3
 00007ffdfd4871bf msctf+0x71bf
 00007ffdff118364 kernel32!BaseThreadInitThunk+0x14
 00007ffdff9e70d1 ntdll!RtlUserThreadStart+0x21

基于以上信息,很难在没有微软msctf模块private symbol和代码的情况下,进一步深入研究这个模块的行为,建议客户把系统升级到最新的Rollup,之后问题不能重现。

结论

基本上来说,微软会很快修复Windows中明显的问题,所以强烈建议经常保持Windows系统安装了最新的补丁,这样可以避免很多问题。

了解更多请微博关注阿里云客户满意中心

相关实践学习
快速体验PolarDB开源数据库
本实验环境已内置PostgreSQL数据库以及PolarDB开源数据库:PolarDB PostgreSQL版和PolarDB分布式版,支持一键拉起使用,方便各位开发者学习使用。
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
存储 Java 数据库
windows server2016搭建AD域服务器
windows server2016搭建AD域服务器
169 72
|
8天前
|
安全 数据库 Windows
解决Windows云服务器带宽和CPU利用率高的问题
本文针对Windows Server 2019 ×64系统,介绍如何排查云服务器带宽和CPU利用率过高的问题。通过任务管理器、性能监视器等工具定位高资源占用的进程,并根据进程是否正常采取相应措施。对于正常进程,建议优化或升级配置;对于异常进程,建议关闭进程并进行系统备份或还原。详细步骤包括使用“perfmon -res”查看资源使用情况,结合PID查找具体进程,分析处理后台任务、杀毒软件及应用程序的影响。
32 1
|
15天前
|
Linux 虚拟化 Docker
Linux服务器部署docker windows
在当今软件开发中,Docker成为流行的虚拟化技术,支持在Linux服务器上运行Windows容器。流程包括:1) 安装Docker;2) 配置支持Windows容器;3) 获取Windows镜像;4) 运行Windows容器;5) 验证容器状态。通过这些步骤,你可以在Linux环境中顺利部署和管理Windows应用,提高开发和运维效率。
73 1
|
1月前
|
人工智能 运维 监控
2025年阿里云服务器配置选择全攻略:CPU、内存、带宽与系统盘详解
在2025年,阿里云服务器以高性能、灵活扩展和稳定服务助力数字化转型,提供轻量应用服务器、通用型g8i实例等多样化配置,满足个人博客至企业级业务需求。针对不同场景(如计算密集型、内存密集型),推荐相应实例类型与带宽规划,强调成本优化策略,包括包年包月节省成本、ESSD云盘选择及地域部署建议。文中还提及安全设置、监控备份的重要性,并指出未来可关注第九代实例g9i支持的新技术。整体而言,阿里云致力于帮助用户实现性能与成本的最优平衡。 以上简介共计238个字符。
|
8天前
|
Windows
Windows系统云服务器配置多用户登录
本教程介绍了在Windows云服务器上配置远程桌面服务的详细步骤,包括安装桌面会话主机和远程桌面授权、允许多用户远程连接以及配置新用户并加入远程桌面用户组。通过添加角色和功能、设置组策略以及管理用户权限,实现多用户同时登录和远程访问。按照指引操作,可顺利完成服务器的远程访问配置,提升管理和使用效率。
26 0
|
24天前
|
监控 关系型数据库 MySQL
如何解决 MySQL 数据库服务器 CPU 飙升的情况
大家好,我是 V 哥。当 MySQL 数据库服务器 CPU 飙升时,如何快速定位和解决问题至关重要。本文整理了一套实用的排查和优化套路,包括使用系统监控工具、分析慢查询日志、优化 SQL 查询、调整 MySQL 配置参数、优化数据库架构及检查硬件资源等步骤。通过一个电商业务系统的案例,详细展示了从问题发现到解决的全过程,帮助你有效降低 CPU 使用率,提升系统性能。关注 V 哥,掌握更多技术干货。
118 0
|
12天前
|
弹性计算 运维 监控
【阿里云】控制台使用指南:从创建ECS到系统诊断测评
本文介绍了如何通过阿里云获取ECS云服务器并进行操作系统配置与组件安装,以实现高效的资源管理和系统监控。阿里云凭借强大的基础设施和丰富的服务成为用户首选。文中详细描述了获取ECS、RAM授权、开通操作系统控制台及组件安装的步骤,并展示了如何利用控制台实时监控性能指标、诊断系统问题及优化性能。特别针对idle进程进行了深入分析,提出了优化建议。最后,建议定期进行系统健康检查,并希望阿里云能推出更友好的低成本套餐,满足学生等群体的需求。
75 17
【阿里云】控制台使用指南:从创建ECS到系统诊断测评
|
8天前
|
人工智能 运维 数据可视化
玩转云服务器——阿里云操作系统控制台体验测评
在云服务器日益普及的背景下,运维人员对操作系统管理工具的要求不断提高。我们需要一款既能直观展示系统状态,又能智能诊断问题,提供专业指导的控制台。阿里云操作系统管理平台正是基于API、SDK、CLI等多种管理方式,致力于提升操作效率,为用户带来全新的系统运维体验。阿里云操作系统控制台凭借便捷易用的设计和高效的管理功能,成为云服务器运维的强力助手。本次测评基于真实体验截图,对其整体表现进行了深入探索。
67 33
|
2天前
|
域名解析 人工智能 弹性计算
DeepSeek服务器繁忙解决方法:使用阿里云一键部署DeepSeek个人网站!
通过阿里云一键部署DeepSeek个人网站,解决服务器繁忙问题。学生用户可领取300元代金券实现0成本部署,普通用户则可用99元/年的服务器。教程涵盖从选择套餐、设置密码到获取百炼API-KEY的全流程,助您快速搭建专属大模型主页,体验DeepSeek、Qwen-max、Llama等多款模型,无需代码,最快5分钟完成部署。支持绑定个人域名,共享亲友使用,日均成本仅约1元。
32 10
|
12天前
|
弹性计算 Linux 数据安全/隐私保护
阿里云幻兽帕鲁联机服务器搭建全攻略,速来抄作业!2025新版教程
阿里云提供2025年最新幻兽帕鲁服务器申请购买及一键开服教程。4核16G配置支持8人,70元/月;8核32G配置支持20人,160元/月。选择配置、地域、操作系统后,点击【一键购买及部署】,约3分钟完成创建。本地安装STEAM客户端并登录,进入游戏选择多人模式,输入服务器IP和端口(8211),即可开始游戏。详细教程及更多问题解答请参考阿里云幻兽帕鲁游戏专区。
61 20