Windbg 分析CPU上涨

症状:

下班前,收到报警邮件。一个应用的两台服务器CPU 过高。打开监控一看CPU都100了。没找到原因之前,先抓好DUMP 然后重启应用程序池。

!threadpool 可以看到CPU 利用率

!runaway 查看运行的线程和运行时间

解决CPU 高的问题,应该从运行的线程上分析。分析它们都在干什么,哪个线程一直占用CPU运行时间

~threadid s  切换到运行时间最长的几个线程

k   显示当前线程的call stack

发现都是在GC线程(SVR::gc_heap::gc_thread_stub) ,难道是它们造成了CPU 高?

但已经运行了十几个小时,CPU是突然升高的。应该不是这几个线程的问题。

然后,我把所有线程都切换一下,查看线程的调用堆栈

发现很多线程都是再等待GC 完成(SVR::GCHeap::WaitUntilGCComplete)

应该是某个线程,正在触发GC函数­——从网上找到的方法。

~* kb  得到所有的本地调用堆栈寻找线程中触发GC的函数

(mscorwks!SVR::GCHeap::GarbageCollectGeneration

 

搜索后找到是102这个线程正在触发GC,调用System.String.InternalSubString(Int32, Int32, Boolean) 字符串截取的时候。需要收集大对象(clr!SVR::gc_heap::allocate_large_object,clr!SVR::gc_heap::allocate_more_space),分配更多的空间。显然因为字符串很大才会造成GC大对象。

!dumpstackobjects  打印当前线程保存的托管对象。

通过这个找到一些线索。如下图

这是根据国家查找的请求,将会返回很大的数据量。序列化将产生很大的字符串。

再查找代码,返回结果前会执行return xml.TrimEnd(‘\0‘); 难怪会调用InternalSubString 字符串截取的方法。这会第二次分配一个很大的空间来存储转换后的字符串。

 

另外查找其它线程后发现有八个线程都在调用同一个方法:

!clrstack –p  查看参数地址

!do 0x0000000120ec8fc8  查看对象

都是同样的请求,这样将造成频繁的GC,导致CPU 升高。

最后通过查看监控发现,这个接口的调用量有突然上升和CPU 升高的时间点是一致的。联系调用方确认下原因,他们的memcached 那段时间失效,造成每次都直接调用接口拉取数据。服务器的负载均衡不完美,大量请求都映射到同两台机器上,使得两台机器CPU 一百。

Windbg 分析CPU上涨

时间: 2024-11-09 04:49:46

Windbg 分析CPU上涨的相关文章

Windbg 分析内存上涨

症状: 上次一站点发布后,发现服务器内存持续上涨.正常本地缓存占了4-5个G ,使用内存直接涨到20G后应用程序池重启. 检查代码后发现,没有什么内存泄漏的地方.最后还是找来DUMP文件排查原因. !dumpheap –stat       查看当前所有托管类型的统计信息 System.Threading.ReaderWriterCount 占了七个G.这是个读写锁, 有一亿多个对象. !dumpheap –mt  000007fef32fa770        查看函数表地址中的各个对象信息

Windbg 分析线程堵塞

症状: 端午发布后,服务器出现大量报错日志,并且平均响应时间不断上升.重启机器后立刻恢复正常,但还是运行一段时间后,响应时间又开始上升. 从报错日志中发现很多DB连接池满的错误.导致这种错误一般有两个原因: 1:SQL 执行完后,DbConnection 及时没有释放. 2:SQL 执行慢,占用了大量 DbConnection . 通过对代码彻底扫描,发现有几个 DataReader 没有显示关闭的地方.但这些都是运行很久老代码应该不是引用这次现象的原因.修改代码重新上线后的确没有得到改善. 继

Windbg分析高内存占用问题

1. 问题简介 最近产品发布大版本补丁更新,一商超客户升级后,反馈系统经常奔溃,导致超市的收银系统无法正常收银,现场排队付款的顾客更是抱怨声声.为了缓解现场的情况, 客户都是手动回收IIS应用程序池才能解决. 这样的后果是很严重的,接到反馈,第一时间想到的是加内存吧,这样最快.但是客户从8G-->16G-->32G,只是延长了每次奔溃的时间,但是并没有解决系统卡顿的问题.到这里,也基本猜测了问题所在了,肯定是什么东西一直在吃内存且得不到释放.这种问题,也就只能打Dump分析了. 2. 打Dum

WinDbg调试CPU占用高的问题 试验+实战 《第七篇》

一.High CPU试验 1.示例代码 static void Main(string[] args) { Console.Clear(); Console.WriteLine("到命令行下,切换到windbg目录,执行adplus -hang -pn highcpu.exe -o c:\\dumps"); Console.WriteLine("如果要停止,按Ctrl+C结束程序"); Console.WriteLine("================

WinDbg分析DMP文件方法完全攻略

前言:在C++实际开发过程中,开发出来的程序,一般情况下由开发人员进行单元测试,然后移交给测试人员进行测试.在开发人员测试出现的bug,我们可以直接在本地进行调试.如果测试人员测试出崩溃级别的bug,如果我们需要调试往往借助于vs提供的Remote Debugger工具进行远程调试(关于vs2010远程调试的方法,请参考http://blog.sina.com.cn/s/blog_a459dcf5010153o7.html),然是当程序在用户手中出现崩溃此时我们可以采用Remote Debugg

揪出“凶手”——实战WinDbg分析电脑蓝屏原因

http://www.appinn.com/blue-screen-search-code/ 蓝屏代码查询器 – 找出蓝屏的元凶 11 文章标签: windows / 系统 / 蓝屏. 蓝屏代码查询器可以帮你查出引起蓝屏的故障原因并可以到微软知识库中查询解决方案,和之前的 BlueScreenView 配合是很好的蓝屏故障排除组合.@Appinn 使用时只需填入错误代码的简写即可,另外在支持中心中有关于蓝屏原因分析的文章链接,有兴趣的童鞋可以去看看..  官方网站 | 来自小众软件 http:/

【转】如何用WINDBG分析64位机上32位程序的DUMP文件

将dump拖入到windbg中后,在command输入栏输入 .load wow64exts 回车 !sw 回车,就将windbg的dump,从64位模式切换到了32位模式,否则看到的call stack 对我们分析dump是没有帮助的.然后就可以使用其它的命令来分析了.比如:使用kb命令,查看所有线程的调用堆栈,找出出错的线程,~*kb,就是查看所有线程的调用堆栈. http://www.cnblogs.com/suiyingjie/archive/2012/12/07/2807504.htm

Python脚本分析CPU使用情况

在这篇文章中,我将讨论一个工具,用以分析Python中CPU使用情况.CPU分析是通过分析CPU执行代码的方式来测量代码的性能,以此找到代码中的不妥之处,然后处理它们. 接下来我们将看看如何跟踪Python脚本使用时CPU使用情况,重点关注以下几个方面: 1.cProfile 2.line_profiler 3.pprofile 4.vprof 测量CPU使用率 对于这篇文章,我将主要使用与内存分析中使用脚本相同的脚本,具体如下: 另外,请记住,在PyPy2中,您需要使用与之配合的pip版本:

使用Windbg分析蓝屏原因

序言:     当电脑频繁蓝屏时我们需要软件来查找蓝屏原因,此时可以使用Windbg软件对蓝屏文件进行分析查找原因. 工具:     1.WinDbg软件,有两种版本,可以参考我的上一篇文章:安装与配置windbg的symbol(符号) 方法/步骤:     1.首先我们要保证我们设置了蓝屏转储,这样当电脑蓝屏时,系统会以.dmp文件方式保留蓝屏故障原因,我们需要查询是否设置内存转储和蓝屏文件存放位置.右键单击桌面计算机图标--选择属性,单击高级系统设置,在启动和故障恢复栏中单击设置,在写入调试