2017服务器市场占有率CPU被占100%寻求帮助

一例并发导致网站cpu 占用100% 的处理
最近在早上更新公司网站的客户管理系统的程序代码,更新过后对网站的页面进行了简单的访问测试,都正常,没有问题。就没在管。可是过了会,有人反映网站打开很慢。我于是赶快检查,确实很慢,半天打不开。然后用远程桌面打开服务器,也是很慢,过了好一会才进到服务器,打开任务管理器,发觉客户管理系统所在的进程w3wp.exe cpu占用高达100% 。观察了一会,一直如此,因为并不清楚问题所在,但是这个问题必须马上解决。尝试结束此进程,结束后cpu 占用马上下来了。这个时候系统马上重新开启了一个客户管理系统所在网站的新进程。此时再访问客户管理系统网站,一切都正常。观察了一段时间,不再出现cpu
占用100% 的问题。
在windows 事件查看器中查看应用程序日志,发现了sqlserver大量超时信息。这说明不了什么,因为w3wp.exe 把cpu都占用了,自然超时。其他的就是发现了另一个网站 有关redis的操作出现了错误。难道是这里的问题?可又觉得不像,一个网站出现的问题怎么会影响另一个,又不是在一个进程中。只有先放放了。
第二天上午,由于客服管理系统有新内容更新,再次更新,这次更新过后,同样的问题又出现了,结束进程后,此问题又消失。看了windows 事件日志,还是和昨天差不多的样子。这次我查了下错误日志,发觉大致有3个错误比较多。第一个:服务器无法在已发送 HTTP 标头之后设置状态,因为这个错误其他网站MVC类的网站也有,应该不是cpu 占用100% 导致的。第二个错误是:未将对象引用设置到对象的实例,是在访问/service/GetReviewMode
出现的,查了下这个action 的写法,感觉没什么问题 。 第三个错误:
已添加了具有相同键的项 ,同样是在访问/service/GetReviewMode 出现的。也没看出什么问题。决定再放一放看。
第三天上午,再次更新网站,同样的问题又出现了。结束进程,问题消失。但这次却不能掉以轻心,第三次出现,而且是因为在更新时出现,前两次还可以解释为凑巧,这次却再不能这样解释了。而我看了错误日志,仍然是访问/service/GetReviewMode 导致两个错误,一个是未将对象引用设置到对象的实例,另一个是已添加了具有相同键的项。这次我仔细看了这两个错误的堆栈提示。
其中未将对象引用设置为对象实例的有两种,第一种:
在 SXF.Utils.EnumDescription.GetFieldTexts(Type enumType, SortType sortType)
在 SXF.Utils.EnumDescription.GetFieldTexts(Type enumType)
在 SXF.Utils.EnumDescription.GetFieldText(Object enumValue)
在 LMSoft.Web.Controllers.ServiceController.GetReviewMode(Int32 status)第二种:
在 System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
在 SXF.Utils.EnumDescription.GetFieldTexts(Type enumType, SortType sortType)
在 SXF.Utils.EnumDescription.GetFieldTexts(Type enumType)
在 SXF.Utils.EnumDescription.GetFieldText(Object enumValue)
在 LMSoft.Web.Controllers.ServiceController.GetReviewMode(Int32 status) 而已添加了具有相同键的项的堆栈提示是:在 System.ThrowHelper.ThrowArgumentException(ExceptionResource resource)
在 System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
在 SXF.Utils.EnumDescription.GetFieldTexts(Type enumType, SortType sortType)
在 SXF.Utils.EnumDescription.GetFieldTexts(Type enumType)
在 SXF.Utils.EnumDescription.GetFieldText(Object enumValue)
在 LMSoft.Web.Controllers.ServiceController.GetReviewMode(Int32 status)这三个错误都指向了一个action :GetReviewMode的同一个方法:GetFieldText ,难道这个方法有问题?于是百度,并没有搜索到可用的信息。于是我搜索:System.Collections.Generic.Dictionary`2.Insert, 这次搜索到一篇文章,介绍说在单线程的时候C# dictionary插入数据,不会出现问题,多线程的时候会出现未将对象引用设置为对象实例的错误。我这个方法确实是向dictionary中插入数据了,难道是这里的问题?于是我进行分析,此action 是我在分页中用ajax调用的,用来显示回访状态,并且每页显示10行,在加载的时候要调用10次,如果公司有多个人同时访问这个列表页面,确实可能导致并发问题。于是我分析GetFieldText 方法代码:/// &summary&
/// 获得指定枚举类型中,指定值的描述文本
/// &/summary&
/// &param name="enumValue"&枚举值,不要作任何类型转换&/param&
/// &returns&描述字符串&/returns&
public static string GetFieldText(object enumValue)
List&EnumDescription& fieldTexts = GetFieldTexts(enumValue.GetType()) as List&EnumDescription&;
if (CollectionHelper.IsNullOrEmpty&EnumDescription&(fieldTexts))
return string.E
EnumDescription description = fieldTexts.Find(item =& item.m_fieldIno.Name.Equals(enumValue.ToString()));
if (description == null)
return string.E
return description.D
}这个方法调用了GetFieldTexts 方法,而从堆栈输出上看,就是在这里出错的,此方法的原代码是这样写的:/// &summary&
/// 获取枚举类型定义的所有文本,按定义的顺序返回
/// &/summary&
/// &param name="enumType"&枚举类型&/param&
/// &returns&所有定义的文本&/returns&
public static IList&EnumDescription& GetFieldTexts(Type enumType)
return GetFieldTexts(enumType, SortType.Default);
/// &summary&
/// 获取枚举类型定义的所有文本
/// &/summary&
/// &param name="enumType"&枚举类型&/param&
/// &param name="sortType"&排序类型&/param&
/// &returns&枚举描述集合&/returns&
public static IList&EnumDescription& GetFieldTexts(Type enumType, SortType sortType)
if (!EnumDescriptionCache.ContainsKey(enumType.FullName))
FieldInfo[] fields = enumType.GetFields();
IList&EnumDescription& list = new List&EnumDescription&();
foreach (FieldInfo info in fields)
object[] customAttributes = info.GetCustomAttributes(typeof(EnumDescription), false);
if (customAttributes.Length == 1)
EnumDescription item = (EnumDescription) customAttributes[0];
item.m_fieldIno =
list.Add(item);
EnumDescriptionCache.Add(enumType.FullName, list);
IList&EnumDescription& list2 = EnumDescriptionCache[enumType.FullName];
if (list2.Count &= 0)
throw new NotSupportedException("枚举类型[" + enumType.Name + "]未定义属性EnumValueDescription");
if (sortType != SortType.Default)
for (int i = 0; i & list2.C i++)
for (int j = j & list2.C j++)
bool flag =
switch (sortType)
case SortType.DisplayText:
if (string.Compare(list2[i].Description, list2[j].Description) & 0)
case SortType.Rank:
if (list2[i].EnumRank & list2[j].EnumRank)
EnumDescription description2 = list2[i];
list2[i] = list2[j];
list2[j] = description2;
return list2;
}这里先判断:if (!EnumDescriptionCache.ContainsKey(enumType.FullName))然后在不包含的情况下,经过一系列处理插入:EnumDescriptionCache.Add(enumType.FullName, list);单线程下这样是没问题的,但是如果是多线程,则这样处理,没有锁定 EnumDescriptionCache 对象,却是可以导致重复插入的。我看了下 EnumDescriptionCache
的定义,此变量是静态的。private static IDictionary&string, IList&EnumDescription&& EnumDescriptionCache = new Dictionary&string, IList&EnumDescription&&();我们知道一个类的静态变量,是可以在不同线程间公用的。到这里,几乎可以确认就是这里的问题了。而为什么会在网站更新后才会出现这个问题,那是因为,静态变量在初始化后在整个应用程序域中一直存在,一旦dll 文件更新,才会重新初始化。知道是这里的问题,因此对GetFieldTexts 方法在更新 EnumDescriptionCache 静态变量时使用锁来进行处理,防止在处理工程中其他用户改变这个静态变量的值。代码如下:/// &summary&
/// 获取枚举类型定义的所有文本
/// &/summary&
/// &param name="enumType"&枚举类型&/param&
/// &param name="sortType"&排序类型&/param&
/// &returns&枚举描述集合&/returns&
public static IList&EnumDescription& GetFieldTexts(Type enumType, SortType sortType)
Monitor.Enter(EnumDescriptionCache);
if (!EnumDescriptionCache.ContainsKey(enumType.FullName))
FieldInfo[] fields = enumType.GetFields();
IList&EnumDescription& list = new List&EnumDescription&();
foreach (FieldInfo info in fields)
object[] customAttributes = info.GetCustomAttributes(typeof(EnumDescription), false);
if (customAttributes.Length == 1)
EnumDescription item = (EnumDescription)customAttributes[0];
item.m_fieldIno =
list.Add(item);
EnumDescriptionCache.Add(enumType.FullName, list);
IList&EnumDescription& list2 = EnumDescriptionCache[enumType.FullName];
if (list2.Count &= 0)
throw new NotSupportedException("枚举类型[" + enumType.Name + "]未定义属性EnumValueDescription");
if (sortType != SortType.Default)
for (int i = 0; i & list2.C i++)
for (int j = j & list2.C j++)
bool flag =
switch (sortType)
case SortType.DisplayText:
if (string.Compare(list2[i].Description, list2[j].Description, StringComparison.Ordinal) & 0)
case SortType.Rank:
if (list2[i].EnumRank & list2[j].EnumRank)
EnumDescription description2 = list2[i];
list2[i] = list2[j];
list2[j] = description2;
return list2;
Monitor.Exit(EnumDescriptionCache);
在try 之前加入了Monitor.Enter(EnumDescriptionCache); 进行加锁,在finally 中进行解锁:Monitor.Exit(EnumDescriptionCache); 至于为什么不使用 lock 进行加锁和解锁,是因为我看到一篇文章介绍 Lock 与 Monitor 的区别,解释说:Lock关键字实际上是一个语法糖,它将Monitor对象进行封装,给object加上一个互斥锁 。也就是说 Lock 实际最终使用的仍然是Monitor 。更改代码后在本地进行了测试,然后上传到服务器,对服务器进行监控,这次更新代码,未出现客户管理系统网站cpu 占用 100% 的情况。上线,经过两天观察,没有再出现cpu 占用100% 的情况,可以肯定这个问题就是此方法中静态变量在修改的时候没有考虑到并发情况导致本篇文章参考的资料:http://www.cnblogs.com/chengxingliang/p/3150731.html
http://blog.csdn.net/gaobobo138968/article/details/
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!ECS服务器CPU使用率异常100%时_你需要了解的一些事情
服务器莫名其妙的出现了CPU使用率100%,而且top、htop等一些命令,都无法查询到消耗CPU,这时会陷入到困境,是什么消耗了CPU资源?
可以参考以下的方式,进行分析排查,确定问题原因。
1、在ECS控制台上,查询服务器的CPU使用监控数据,检查CPU是从什么时候开始出现使用率100%。
现象是不是从某一刻起,CPU突然100%,而且一直没有下降。
2、查看系统命令在最近时间是否有修改过。
stat /usr/bin/top
stat /bin/ps
查看命令的 Change时间,是否是和CPU使用率出现100%的时间点吻合。
3、rpm 验证一下命令是否有被修改。
正常情况应该是查看不到修改信息的
rpm -Vf /bin/ps
rpm -Vf /usr/bin/top
4、观察服务器对外的网络连接情况。
iftop -i eth1 -n -P
是否对外连接一些异常的地址,例如 crypto-pool.fr 之类的异常域名地址
总结:符合以上几个特征,基本可以判定,服务器系统已经中招,中毒了。
尽快备份一下服务器的数据,考虑重装系统,然后加强服务器系统的安全防护。
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!服务器CPU占用100%_百度知道
服务器CPU占用100%
请问大家有没有什么好办法查找CPU占用过高的问题?我是个菜鸟,做了个服务器,运行一段时间CPU就会100%。
从代码上直接看, 没看出来哪里的问题。。
我有更好的答案
服务器CPU占用100%,有以下几种原因:1,系统服务占用,例如自动更新等;这种情况稍作等待,系统更新完即可。2,木马病毒入侵电脑,感染病毒后,CPU占用率明显不正常;这种情况要开启杀毒软件进行电脑查杀。3,一些流氓程序后台自动运行,导致CPU占用率高;这种情况电脑可以用百度卫士等安全软件进行系统优化,禁用自启动程序。4、同时开启的程序过多,导致cpu使用率过高;这种情况可以先关闭其他程序。5、cpu性能太差,已经无法负荷太多程序运行;考虑更换cpu。
上网下载个进程查看器。
为您推荐:
其他类似问题
您可能关注的内容
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。而且服务器突然CPU100%怎么解决_百度知道
而且服务器突然CPU100%怎么解决
进服务器看了发现进程有很多cmd.exe*32和conhost.exe进程,结束了,一会又有很多怎么办
如图100%以后卡的要死,网站基本打不开,救急用安全狗扫了C盘没发现病毒
我有更好的答案
你的任务管理器 里面查不到是哪个进程占用100%吗。单从你说的情况来看可能是中毒了。但是还要进一步分析。
为您推荐:
其他类似问题
您可能关注的内容
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。我们的服务器在使用操作系统的时候,用着用着系统就变慢了,打开& 任务管理器 &一看,才发现CPU使用率达到80%以上。这是怎么回事情呢?遇到病毒了吗?硬件有问题?还是系统设置有问题呢?在本文中将从硬件,系统进程,应用软件和病毒木马四个方面来介绍CPU资源使用率为什么会达到那么高,以帮助大家排除服务器CPU使用率高的种种疑惑。
一、硬件因素
以下分别从CPU温度,CPU超线程,硬件配置,硬件驱动和待机方面分析。
情况1. CPU温度过高如果CPU风扇散热不好,会导致CPU温度太高(CPU温度多少正常?),使CPU自动降频,从而使CPU的性能降低。总之高温时CPU会自动将降低工作效率。
情况2. 超线程超线程导致CPU使用率占用高,这类故障的共同原因就是都使用了具有超线程功能的P4 CPU。据一些网友总结超线程似乎和天网防火墙有冲突,可以通过卸载天网并安装其它防火墙解决,也可以通过在BIOS中关闭超线程功能解决
情况3. 硬件配置不合理例如内存不足,当运行一些大型软件时,CPU的资源大部分耗在了虚拟内存的交换处理上。而电源功率不足,也会使CPU的性能难以发挥。还有,在购买CPU时,选的CPU核心频率不足是导致CPU的使用率高的最直接原因。
情况4. 不完善的驱动程序硬件的驱动程序没有经过认证或者是不合法的认证,会造成CPU资源占用率高。因大量的测试版的驱动在网上泛滥,造成了难以发现的故障原因。处理方式:尤其是显卡驱动特别要注意,建议使用微软认证的或由官方发布的驱动,并且严格核对型号、版本。
情况5. 待机经常使用待机功能,也会造成系统自动关闭硬盘DMA模式。这不仅会使系统性能大幅度下降,系统启动速度变慢,也会使是系统在运行一些大型软件时CPU使用率高。
二、系统进程因素
相对于硬件因素的影响,系统进程的异常也多为CPU资源使用率高的征兆。以下分别以Dllhost进程和Services进程的分析来剖析异常的原因以及解决办法。
情况1. Dllhost进程特征:服务器正常CPU消耗应该在75%以下,而且CPU消耗应该是上下起伏的,出现这种问题的服务器,CPU会突然一直处100%的水平,而且不会下降。查看任务管理器,可以发现是DLLHOST.EXE消耗了所有的CPU空闲时间,管理员在这种情况下,只好重新启动IIS服务,奇怪的是,重新启动IIS服务后一切正常,但可能过了一段时间后,问题又再次出现了。
直接原因:有一个或多个ACCESS数据库在多次读写过程中损坏,微软的MDAC系统在写入这个损坏的ACCESS文件时,ASP线程处于BLOCK状态,结果其它线程只能等待,IIS被死锁了,全部的CPU时间都消耗在DLLHOST中。
解决办法:安装&一流信息监控拦截系统&,使用其中的&首席文件检查官IIS健康检查官&软件,启用&查找死锁模块&,设置:&wblock=yes监控的目录,请指定您的主机的文件所在目录:&wblockdir=d:\test,监控生成的日志的文件保存位置在安装目录的log目录中,文件名为:logblock.htm
停止IIS,再启动&首席文件检查官IIS健康检查官&,再启动IIS,&首席文件检查官IIS健康检查官&会在logblock.htm中记录下最后写入的ACCESS文件的。
过了一段时间后,当问题出来时,例如CPU会再次一直处100%的水平,可以停止IIS,检查logblock.htm所记录的最后的十个文件,注意,最有问题的往往是计数器类的ACCESS文件,例如:&**COUNT.MDB&,&**COUNT.ASP&,可以先把最后十个文件或有所怀疑的文件删除到回收站中,再启动IIS,看看问题是否再次出现。我们相信,经过仔细的查找后,您肯定可以找到这个让您操心了一段时间的文件的。
找到这个文件后,可以删除它,或下载下来,用ACCESS2000修复它,问题就解决了。
情况2.Services进程症状:在基于 Windows 2000 的计算机上,Services.exe 中的 CPU 使用率可能间歇性地达到100 %,并且计算机可能停止响应(挂起)。出现此问题时,连接到该计算机(如果它是文件服务器或域控制器)的用户会被断开连接。您可能还需要重新启动计算机。如果 Esent.dll 错误地处理将文件刷新到磁盘的方式,则会出现此症状。
解决方案Service Pack 信息:要解决此问题,请获取最新的 Microsoft Windows 2000 Service Pack。有关其它信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:260910 如何获取最新的 Windows 2000 Service Pack修复程序信息:Microsoft 提供了受支持的修补程序,但该程序只是为了解决本文所介绍的问题。只有计算机遇到本文提到的特定问题时才可应用此修补程序。此修补程序可能还会接受其它一些测试。因此,如果这个问题没有对您造成严重的影响,Microsoft 建议您等待包含此修补程序的下一个 Windows 2000 Service Pack。要立即解决此问题,请与&Microsoft 产品支持服务&联系,以获取此修补程序。有关&Microsoft 产品支持服务&电话号码和支持费用信息的完整列表,请访问 Microsoft Web 站点:
注意 :特殊情况下,如果 Microsoft 支持专业人员确定某个特定的更新程序能够解决您的问题,可免收通常情况下收取的电话支持服务费用。对于特定更新程序无法解决的其它支持问题和事项,将正常收取支持费用。
下表列出了此修补程序的全球版本的文件属性(或更新的属性)。这些文件的日期和时间按协调通用时间 (UTC) 列出。查看文件信息时,它将转换为本地时间。要了解 UTC 与本地时间之间的时差,请使用&控制面板&中的&日期和时间&工具中的 时区 选项卡。状态:Microsoft 已经确认这是在本文开头列出的 Microsoft 产品中存在的问题。此问题最初是在 Microsoft Windows 2000 Service Pack 4 中更正的。
三、应用软件因素
一般大型的应用软件的运行会耗CPU和内存大量的资源,有时也会因一些网络配置不当从而使这些应用软件的性能得不到充分的发挥,从而导致的是耗资源而不见功效的现象。以下分别从杀毒软件,AVI视频文件,WORD文件以及网络配置方面讲述一些解决办法。
情况1.杀毒软件由于新版的KV、金山、瑞星都加入了对网页、插件、邮件的随机监控,无疑增大了系统负担。处理方式:基本上没有合理的处理方式,尽量使用最少的监控服务。而关闭这些相应的监控服务是解决这类问题的最直接办法。
情况2. AVI视频文件在Windows XP中,单击一个较大的AVI视频文件后,可能会出现系统假死现象,并且造成exploere.exe进程的使用率100%,这是因为系统要先扫描该文件,并检查文件所有部分,建立索引。如果文件较大就会需要较长时间并造成CPU占用率100%。解决方法:右键单击保存视频文件的文件夹,选择&属性&&常规&&高级&,去掉&为了快速搜索,允许索引服务编制该文件夹的索引&前面复选框的对钩即可。
情况3. WORD文件处理较大的Word文件时CPU使用率过高,这个问题一般还会造成电脑假死,这些都是因为WORD的拼写和语法检查造成的,只要打开WORD的&工具&选项&,进入&拼写和语法&选项卡,将其中的&键入时检查拼写&和&键入时检查语法&两项前面的复选框中的钩去掉即可。
情况4. 网络配置当你的Windows2000/xp作为服务器时,收到来自端口445上的连接请求后,系统将分配内存和少量CPU资源来为这些连接提供服务,当负荷过重,就会出现上述情况。要解决这个问题可以通过修改注册表来解决,打开注册表,找到HKEY&LOCAL&MACHNE\SYSTEM\CurrentControlSet\Services\lanmanserver,在右面新建一个名为&;maxworkitems&;的DWORD值.然后双击该值,如果你的电脑有512以上内存,就设置为&;1024&P;,如果小于512,就设置为256.总之,将这个值设置大一点能提高服务器的性能发挥。
四、病毒木马因素
出现CPU使用率高的故障经常是因为病毒木马造成的,比如大量的蠕虫病毒,它们会在系统内部迅速复制,造成CPU占用资源率居高不下。以下分别从震荡波蠕虫病毒和bride病毒介绍一些对应的解决办法。
情况1. 震荡波蠕虫病毒利用微软操作系统的LSASS缓冲区溢出漏洞进行远程主动攻击和传染,导致系统异常和网络严重拥塞,具有极强的危害性,病毒如果攻击成功,则会占用大量系统资源,使CPU占用率达到100%,出现电脑运行异常缓慢的现象。如果中了这种病毒可采用下面的四种方法进行清除。
1、断网打补丁如果不给系统打上相应的漏洞补丁,则连网后依然会遭受到该病毒的攻击,用户应该先下载相应的漏洞补丁程序,然后断开网络,运行补丁程序,当补丁安装完成后再上网。
2、清除内存中的病毒进程要想彻底清除该病毒,应该先清除内存中的病毒进程,用户可以按CTRL+SHIFT+ESC三或者右键单击任务栏,在弹出菜单中选择&任务管理器&打开任务管理器界面,然后在内存中查找名为&avserve.exe&的进程,找到后直接将它结束。
3、删除病毒文件病毒感染系统时会在系统安装目录(默认为C:\WINNT)下产生一个名为avserve.exe的病毒文件,并在系统目录下(默认为C:\WINNT\System32)生成一些名为&;随机字符串&;_UP.exe的病毒文件,用户可以查找这些文件,找到后删除,如果系统提示删除文件失败,则用户需要到安全模式下或DOS系统下删除这些文件。
4、删除注册表键值该病毒会在电脑注册表的HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\Currentversion\Run项中建立名为&avserve.exe&,内容为:&%Windows%\avserve.exe&的病毒键值,为了防止病毒下次系统启动时自动运行,用户应该将该键值删除,方法是在&运行&菜单中键入&REGEDIT& 然后调出注册表编辑器,找到该病毒键值,然后直接删除。
情况2. bride病毒此病毒可以在Windows 2000、Windows XP等操作系统环境下正常运行,病毒运行时会释放出一个FUNLOVE病毒并将之执行,而FUNLOVE病毒会在计算机中大量繁殖,造成系统变慢,网络阻塞。病毒清除方法:此病毒可以用趋势、诺顿、瑞星、金山和江民等杀毒软件进行清除。
总之,用可靠的杀毒软件彻底清理系统内存和本地硬盘,并且打开系统设置软件,察看有无异常启动的程序。经常性更新升级杀毒软件和防火墙,加强防毒意识,掌握正确的防杀毒知识,能有效地防止病毒和木马的入侵。
阅读(...) 评论()

我要回帖

更多关于 dcom服务器进程占cpu 的文章

 

随机推荐