CS dnfcpu使用率高怎么办办

君,已阅读到文档的结尾了呢~~
案例分析一次C交换机CPU利用率过高的处理过程(精品),交换机利用率,交换机端口利用率,磁盘利用率过高,cpu利用率过高,交换机cpu过高,内存利用率过高,交换机温度过高,win10磁盘利用率过高,h3c交换机配置案例
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
案例分析一次C交换机CPU利用率过高的处理过程(精品)
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer--144.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口当一个.net应用在生产环境CPU突然居高不下,如何快速准确的定位问题所在,并且对实时业务影响最小化?如何不抓Dump也不用live debug就可以知道你的应用在做什么?如何确认你的应用是由于哪个线程的执行造成的CPU升高,该线程正在执行什么代码?
分析:CPU升高的原因有很多,&1、有时候应用的负载大了,CPU自然会受业务请求的增加和增高;&2、有时候因为GC回收使用了过高的CPU资源;&3、有时候是某个线程执行的代码在某种情况下陷入了死循环;&4、有时候是因为锁争用太激烈,某资源上的锁释放后,等待的线程去抢锁引起的;&5、有时候是因为线程太多,上下文切换太频繁引起的。&6、每秒抛出太多的Exception。我们一一分析&1、我们一般会用一些计数器来观察实际的应用的负载情况和并发请求量,比如每秒接受多少请求等,所以业务量增大引起的CPU高,很容易确定。&2、GC使用的CPU百分比有专门的计数器,一看便知。&3、如果某段代码陷入了死循环引起的CPU高,只抓Dump看~*e!clrstack和!runaway还是不太好定位问题,&&a)、一般都是连续抓几个dump,然后用!runaway来看哪些线程的用户态时间的差很大,然后再去看该线程的调用栈。&&b)、录制Thread\Thread Id和Thread\% Processor Time计数器,同时抓dump,从计数器里找到CPU消耗高的线程ID,然后从dump里看调用栈和调用栈的参数本地变量等。&4、锁争用也有相关的.NET计数器可以直接看。&5、每个进程的线程数,每秒上下文切换次数也可以有直接的计数器可看。&6、每秒抛出的异常也有直接的计数器可看。
思路:1、从上面看到也就是第3种地排查比较费劲,而且抓DUMP有时候容易把服务抓S,如果是一个有状态的服务,抓死服务后果很严重,所以我们得想出一种更轻量级的方法去获取服务的每个线程的调用栈。其实CLR本身有一些用于支持调试的接口,都是Com的,但.NET对此有一些包装,可以用c#来使用这些调试API,其中当然包括附加到进程,获取所有线程调用栈的功能。该DLL在.net sdk里,叫MdbgCore.dll。2、另外获取计数器.NET也有现成的类,上篇帖子介绍过了。3、.NET对进程的管理也有一些API,可以获取一个进程的线程数,每个线程的启动时间,用户态时间,线程状态,优先级等信息。
有了以上几个知识点,我们就可以综合起来写一个比较智能化定位高CPU问题的工具。
CPU高的DEMO我们先写一个CPU高的DEMO,A方法因为有sleep所以不会太消耗CPU,而B方法没有Sleep,执行一个浮点运算,所以会造成CPU升高(占用一个CPU的资源)。
using&Susing&System.Tnamespace&HightCPUDemo{&&&&internal&class&Program&&&&{&&&&&&&&private&static&void&Main(string[]&args)&&&&&&&&{&&&&&&&&&&&&new&Thread(A).Start();&&&&&&&&&&&&new&Thread(B).Start();&&&&&&&&&&&&Console.ReadKey();&&&&&&&&}&&&&&&&&private&static&void&A(object&state)&&&&&&&&{&&&&&&&&&&&&while&(true)&&&&&&&&&&&&{&&&&&&&&&&&&&&&&Thread.Sleep( 单元测试找出HeightCPUDemo的进程ID,比如是8724,然后执行PrintStack.exe 8724,输出结果如下E:\study\ThreadStack\PrintStack\bin\Debug&PrintStack.exe 87241、正在收集计数器...2、正在收集线程信息...3、正在附加到进程8724获取调用栈...4、正在生成报表...
最终会在当前目录生成一个HightCPUDemo.htm的报表,其中哪个线程耗费了很多的CPU,及其托管调用栈一目了然,很快就能定位问题。
% Processor Time
UserProcessorTime
00:00:20.2187500
System.Random.Sample (source line information unavailable)System.Random.NextDouble (source line information unavailable)HightCPUDemo.Program.B (Program.cs:27)System.Threading.ThreadHelper.ThreadStart_Context (source line information unavailable)System.Threading.ExecutionContext.Run (source line information unavailable)System.Threading.ThreadHelper.ThreadStart (source line information unavailable)
How the .NET Debugger WorksWorking on managed wrappers for Native Debugging APIRuntime Call Stack Analysis with .NETMDbg LinkfestTool to get snapshot of managed callstacks
阅读(...) 评论()

参考资料

 

随机推荐