分享 应用服务器 CPU 暴高事故分析

大概有2个月没写博客了,不是不想写哈??,关注公号的朋友应该知道我这两个月一直都在翻译文章,前前后后大概100篇左右吧,前几天看公号的 常读用户 降了好几十,心疼哈,还得回过神来继续写!

2. 讲故事

上周给 武汉同济 做项目升级,本以为一切顺利,结果捅娄子了,第二天上午高峰期运维说生产上两台 应用服务器 cpu 被打满,影响到所有客户使用,造成了大面积瘫痪,真尬尴,得先让运维抓一个 dump 下来再重启网站,还好,老板人可以,没有问责 ??。

二:CPU 爆高问题分析

1. 找思路

分析 dump,没什么比 windbg 更专业了,不过分析 dump 我还是比较拿手的,那怎么分析呢?最简单粗暴的做法就是看每一个线程当时都在做什么,进而推测一下就 八九不离十 了。

2. 查看所有线程栈

首先用 !t 和 !tp 看一下当前程序的 线程 和 线程池 的整体概况。


  1. 0:000> !t 
  2. ThreadCount:      60 
  3. UnstartedThread:  0 
  4. BackgroundThread: 38 
  5. PendingThread:    0 
  6. DeadThread:       22 
  7. Hosted Runtime:   no 
  8.                                                                          Lock   
  9.        ID OSID ThreadOBJ    State GC Mode     GC Alloc Context  Domain   nc">Count Apt Exception 
  10.   11    1 2c24 02487038     28220 Preemptive  00000000:00000000 010df4f8 0     Ukn  
  11.   28    2 2ca0 024bad90     2b220 Preemptive  00000000:00000000 010df4f8 0     MTA (Finalizer)  
  12.   30    3 2d04 024f1450   102a220 Preemptive  00000000:00000000 010df4f8 0     MTA (Threadpool Worker)  
  13.   31    4 2054 024fb188     21220 Preemptive  00000000:00000000 010df4f8 0     Ukn  
  14.   32    6 1128 02574400   1020220 Preemptive  00000000:00000000 010df4f8 0     Ukn (Threadpool Worker)  
  15.    2    5 27ac 02520da8     20220 Preemptive  00000000:00000000 010df4f8 0     Ukn  
  16.   35   17 2c44 1cc362c8   202b220 Preemptive  00000000:00000000 024fa838 1     MTA  
  17.   36   20 1740 1cccc748     21220 Preemptive  00000000:00000000 010df4f8 0     Ukn  
  18.   37   21 16c4 1cc08240     21220 Preemptive  00000000:00000000 010df4f8 0     Ukn  
  19.   38   22 16a8 1ccd28b8     21220 Preemptive  00000000:00000000 010df4f8 0     Ukn  
  20.  
  21. …. 
  22.  
  23. 0:000> !tp 
  24. CPU utilization: 97% 
  25. Worker Thread: Total: 21 Running: 21 Idle: 0 MaxLimit: 8191 MinLimit: 8 
  26. Work Request in Queue: 23 
  27.     Unknown Function: 6d92a17f  Context: 0109b5f0 
  28.     Unknown Function: 6d92a17f  Context: 0107ed90 
  29.     Unknown Function: 6d92a17f  Context: 0104e750 
  30.     Unknown Function: 6d92a17f  Context: 010a0200 
  31.     AsyncTimerCallbackCompletion TimerInfo@207f8008 
  32.     AsyncTimerCallbackCompletion TimerInfo@0251b418 
  33.     Unknown Function: 6d92a17f  Context: 01096c78 
  34.     Unknown Function: 6d92a17f  Context: 01081398 
  35.     AsyncTimerCallbackCompletion TimerInfo@024d0120 
  36.     Unknown Function: 6d92a17f  Context: 010a9a20 
  37.     Unknown Function: 6d92a17f  Context: 01057950 
  38.     Unknown Function: 6d92a17f  Context: 0104c2d0 
  39.     Unknown Function: 6d92a17f  Context: 010943d8 
  40.     Unknown Function: 6d92a17f  Context: 0107a180 
  41.     Unknown Function: 6d92a17f  Context: 010a7418 
  42.     Unknown Function: 6d92a17f  Context: 010839a0 
  43.     Unknown Function: 6d92a17f  Context: 010678d0 
  44.     Unknown Function: 6d92a17f  Context: 010a2808 
  45.     Unknown Function: 6d92a17f  Context: 0105c250 
  46.     Unknown Function: 6d92a17f  Context: 0108abb8 
  47.     Unknown Function: 6d92a17f  Context: 0108f7c8 
  48.     Unknown Function: 6d92a17f  Context: 0108d1c0 
  49.     Unknown Function: 6d92a17f  Context: 20896498 
  50. ————————————– 
  51. Number of Timers: 0 
  52. ————————————– 
  53. Completion Port Thread:Total: 1 Free: 1 MaxFree: 16 CurrentLimit: 1 MaxLimit: 1000 MinLimit: 8 

从上面的输出大概可以看到如下几点信息:

  • 当前程序有 60 个线程。
  • 当前 CPU 利用率为 97%,爆高无疑。
  • 线程池中有21个线程全部打满,还有23个任务在 任务队列 中排队等待处理。

总的来看,系统已经高负荷,不堪重负了,接下来的一个疑问就来了,所有的线程都被打满而且线程池中还有大量等待处理的任务在排队,现有的线程都在干嘛呢?难道不处理吗?

【声明】:芜湖站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

相关文章