• 来看看是什么原因导致生产服上的系统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文件。

    分析文件

    使用windbg打开文件,先加载symbol文件,

     .load C:WindowsMicrosoft.NETFramework64v4.0.30319sos.dll
     .load C:WindowsMicrosoft.NETFramework64v4.0.30319clr.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
    
    

    查看线程堆栈

    0:009> !clrstack
    OS Thread Id: 0x2088 (9)
            Child SP               IP Call Site
    000000001ba0eab0 00007ffb17210a61 WindbgDemo.Program+<>c.<main>b__0_0(Int32) [C:UsersAdministratorsource
    eposWindbgDemoWindbgDemoProgram.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:UsersAdministratorsource eposWindbgDemoWindbgDemoProgram.cs @ 14行。
    我们到14行是看看是什么?
    image.png
    原来这里有一个死循环。至此我们大概找到问题了。

    附录

    示例源码

    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

    作者:朱鹏飞 加我个人微信(zhupengfeivip)进入郑州IT微信交流群
    个人博客:https://zhupengfeivip.github.io/
    image.png
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    xp系统
    如何进去bios设置
    MySQL快捷键
    显示数据库中的所有表和所有数据库
    Codeforces Round #375 (Div. 2) B
    Codeforces Round #375 (Div. 2) A
    2015 AlBaath Collegiate Programming Contest B
    2015 AlBaath Collegiate Programming Contest A
    AIM Tech Round 3 (Div. 2) B
    AIM Tech Round 3 (Div. 2) A
  • 原文地址:https://www.cnblogs.com/zhupengfei/p/15128313.html
Copyright © 2020-2023  润新知