咱们可能会遇到生产服务器CPU很高的问题,有时候能肯定是哪一个进程,可是不知道这个进程都在干什么,因此也无从下手,没法解决问题。只能不断的重启,重启等。
最近也看了【一线码农】的一些教程,以为都很不错,也试着照着作了一下,可是中间老是有一些小问题,花费了一个多星期,终于摸索出来了。记录下来给其余须要学习的同窗。
因为生产服的问题也不是想遇就能遇到的,并且遇到的时候,也必定是在救火中,哪有时间整理文档,因此这里本身造了一个小事故现场来分析一下,步骤是同样的。
服务器
由于个人练习程序是用vs2019 .net 4.0开发的,选的是any cpu,个人系统恰好是64位的,因此这里使用64位的windbg,一开始我卡了很久,大概就是由于windbg的工具错误形成的。
工具
使用我提供的程序,运行一下,能够看到CPU立刻涨到100%了。
学习
设定 连续 5s 内 CPU 超过 70% 抓取 dump,直到 2 个为止
。
procdump WindbgDemo -s 5 -n 2 -c 70
调试信息就存在procdump文件中
这两个文件,就是咱们转存的dmp文件。
spa
使用windbg打开文件,先加载symbol文件,.net
.load C:\Windows\Microsoft.NET\Framework64\v4.0.30319\sos.dll .load C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll
接下来执行!runaway线程
0:025> !runaway User Mode Time Thread Time 9:2088 0 days 0:03:19.046 10:46c4 0 days 0:03:18.687 5:1804 0 days 0:03:18.500 13:640 0 days 0:03:17.906 14:6be0 0 days 0:03:10.718 18:48f0 0 days 0:02:46.671 11:69f0 0 days 0:02:41.046 0:6b44 0 days 0:02:40.953 8:12b0 0 days 0:02:40.593 7:4fe0 0 days 0:02:40.515 12:56bc 0 days 0:02:40.218 15:1334 0 days 0:02:27.656 21:439c 0 days 0:02:21.031 16:4de0 0 days 0:02:20.406 22:964 0 days 0:02:12.500 19:f30 0 days 0:02:08.437 20:6b8c 0 days 0:02:02.234 25:458 0 days 0:01:46.593 23:4da8 0 days 0:01:43.046 26:6514 0 days 0:01:37.171 24:5f20 0 days 0:01:36.359 27:652c 0 days 0:01:16.343 29:580c 0 days 0:01:13.078 28:6304 0 days 0:01:09.109 30:540c 0 days 0:01:04.218 31:657c 0 days 0:00:48.218 32:5678 0 days 0:00:41.015 33:11a4 0 days 0:00:38.828 34:6570 0 days 0:00:30.468 35:57f8 0 days 0:00:19.187 36:348c 0 days 0:00:11.984 37:62d4 0 days 0:00:05.546 2:5388 0 days 0:00:00.015 17:5c60 0 days 0:00:00.000 6:6b18 0 days 0:00:00.000 4:68e4 0 days 0:00:00.000 3:5f08 0 days 0:00:00.000 1:60b0 0 days 0:00:00.000
咱们看到线程9跑了3分钟,用时最长,那它它在干什么呢?
咱们切换到线程9调试
0:025> ~9s 00007ffb`17210a61 90 nop
查看线程堆栈code
0:009> !clrstack OS Thread Id: 0x2088 (9) Child SP IP Call Site 000000001ba0eab0 00007ffb17210a61 WindbgDemo.Program+<>c.<main>b__0_0(Int32) [C:\Users\Administrator\source\repos\WindbgDemo\WindbgDemo\Program.cs @ 14] 000000001ba0eaf0 00007ffb76172058 System.Threading.Tasks.Parallel+<>c__DisplayClass17_0`1[[System.__Canon, mscorlib]].<forworker>b__1() 000000001ba0ebd0 00007ffb7609fe20 System.Threading.Tasks.Task.InnerInvokeWithArg(System.Threading.Tasks.Task) 000000001ba0ec00 00007ffb76174216 System.Threading.Tasks.Task+<>c__DisplayClass176_0.<executeselfreplicating>b__0(System.Object) 000000001ba0ec70 00007ffb7575af27 System.Threading.Tasks.Task.Execute() 000000001ba0ecb0 00007ffb756edf12 System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) 000000001ba0ed80 00007ffb756edd95 System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) 000000001ba0edb0 00007ffb7575b1e1 System.Threading.Tasks.Task.ExecuteWithThreadLocal(System.Threading.Tasks.Task ByRef) 000000001ba0ee60 00007ffb7575a8c1 System.Threading.Tasks.Task.ExecuteEntry(Boolean) 000000001ba0eea0 00007ffb756b8e46 System.Threading.ThreadPoolWorkQueue.Dispatch() 000000001ba0f340 00007ffb76766953 [DebuggerU2MCatchHandlerFrame: 000000001ba0f340]
看互生一行,提示咱们的程序C:\Users\Administrator\source\repos\WindbgDemo\WindbgDemo\Program.cs @ 14行。
咱们到14行是看看是什么?
原来这里有一个死循环。至此咱们大概找到问题了。
blog
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace WindbgDemo { class Program { static void Main(string[] args) { Parallel.For(0, int.MaxValue, (i) => { while (true) { } }); Console.ReadLine(); } } }
连接:https://pan.baidu.com/s/1NSLzpS2DfxAtiHdKtkUikQ 提取码:c5ey教程