来看看是什么原因导致生产服上的系统CPU高的?
我們可能會(huì)遇到生產(chǎn)服務(wù)器CPU很高的問題,有時(shí)候能確定是哪個(gè)進(jìn)程,但是不知道這個(gè)進(jìn)程都在干什么,所以也無從下手,無法解決問題。只能不斷的重啟,重啟等。
最近也看了【一線碼農(nóng)】的一些教程,覺得都很不錯(cuò),也試著照著做了一下,但是中間總是有一些小問題,花費(fèi)了一個(gè)多星期,終于摸索出來了。記錄下來給其他需要學(xué)習(xí)的同學(xué)。
?
環(huán)境說明
因?yàn)槲业木毩?xí)程序是用vs2019 .net 4.0開發(fā)的,選的是any cpu,我的系統(tǒng)剛好是64位的,所以這里使用64位的windbg,一開始我卡了好久,大概就是因?yàn)閣indbg的工具錯(cuò)誤造成的。
?
事故模擬
使用我提供的程序,運(yùn)行一下,可以看到CPU馬上漲到100%了。
?
?
保存調(diào)試信息
設(shè)定 連續(xù) 5s 內(nèi) CPU 超過 70% 抓取 dump,直到 2 個(gè)為止 。
procdump WindbgDemo -s 5 -n 2 -c 70
調(diào)試信息就存在procdump文件中
這兩個(gè)文件,就是我們轉(zhuǎn)存的dmp文件。
?
分析文件
使用windbg打開文件,先加載symbol文件,
.load C:\Windows\Microsoft.NET\Framework64\v4.0.30319\sos.dll
.load C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll
接下來執(zhí)行!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分鐘,用時(shí)最長,那它它在干什么呢?
我們切換到線程9
0:025> ~9s
00007ffb`17210a61 90 nop
查看線程堆棧
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行是看看是什么?
原來這里有一個(gè)死循環(huán)。至此我們大概找到問題了。
?
附錄
示例源碼
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
總結(jié)
以上是生活随笔為你收集整理的来看看是什么原因导致生产服上的系统CPU高的?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2018-2019-2 20165235
- 下一篇: PyQt(Python+Qt)学习随笔: