來看看是什麼緣由致使生產服上的系統CPU高的?

咱們可能會遇到生產服務器CPU很高的問題,有時候能肯定是哪一個進程,可是不知道這個進程都在幹什麼,因此也無從下手,沒法解決問題。只能不斷的重啓,重啓等。
最近也看了【一線碼農】的一些教程,以爲都很不錯,也試着照着作了一下,可是中間老是有一些小問題,花費了一個多星期,終於摸索出來了。記錄下來給其餘須要學習的同窗。
因爲生產服的問題也不是想遇就能遇到的,並且遇到的時候,也必定是在救火中,哪有時間整理文檔,因此這裏本身造了一個小事故現場來分析一下,步驟是同樣的。
服務器

環境說明

image.png
image.png
image.png
由於個人練習程序是用vs2019 .net 4.0開發的,選的是any cpu,個人系統恰好是64位的,因此這裏使用64位的windbg,一開始我卡了很久,大概就是由於windbg的工具錯誤形成的。
工具

事故模擬

使用我提供的程序,運行一下,能夠看到CPU立刻漲到100%了。
image.png
學習

保存調試信息

設定 連續 5s 內 CPU 超過 70% 抓取 dump,直到 2 個爲止
procdump WindbgDemo -s 5 -n 2 -c 70
調試信息就存在procdump文件中
image.png
image.png
這兩個文件,就是咱們轉存的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行是看看是什麼?
image.png
原來這裏有一個死循環。至此咱們大概找到問題了。
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教程

相關文章
相關標籤/搜索