我们可能会遇到生产服务器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文件。

分析文件

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

 .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

查看线程堆栈

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行是看看是什么?



原来这里有一个死循环。至此我们大概找到问题了。

附录

示例源码

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

来看看是什么原因导致生产服上的系统CPU高的?的更多相关文章

  1. 记一次网络原因导致的mysql连接中断问题(druid)

    date: 2018-04-19 21:00 tag: java,mysql,exception,mat,调试,jvm 工具: gceasy.io, MAT 线上系统出现一个诡异的bug,通过heap ...

  2. java.net.MalformedURLException: unknown protocol: c 这个错一般有两种原因导致: 1、URL协议、格式或者路径错误,

    java.net.MalformedURLException: unknown protocol: c这个错一般有两种原因导致:1.URL协议.格式或者路径错误, 好好检查下你程序中的代码如果是路径问 ...

  3. 阿里短信回持.net sdk的bug导致生产服务cpu 100%排查

    一:背景 1. 讲故事 去年阿里聚石塔上的所有isv短信通道全部对接阿里通信,我们就做了对接改造,使用阿里提供的.net sdk. 网址:https://help.aliyun.com/documen ...

  4. ASP.Net WebAPI HttpDelete/PUT方法运行或发布到生产服务器上后出现405(Method Not Allowed)错误的解决办法

    原文:ASP.Net WebAPI HttpDelete/PUT方法运行或发布到生产服务器上后出现405(Method Not Allowed)错误的解决办法 本文只是个人的理解和学习记录,如果觉得本 ...

  5. .net core 和 WPF 开发升讯威在线客服与营销系统:(插曲)一次端口攻击行为的分析与应对

    本系列文章详细介绍使用 .net core 和 WPF 开发 升讯威在线客服与营销系统 的过程.本产品已经成熟稳定并投入商用. 在线演示环境:https://kf.shengxunwei.com 注意 ...

  6. 如何一步步在生产环境上部署django和vue

    本文由云+社区发表 本文主要讲述了如何一步步在生产环境上部署django和vue,操作系统默认为centos 说明:后文中出现的以下字符串均表示具体的路径或者名称,含义如下: DJANGO_DIR-- ...

  7. Linux运维一:生产环境CentOS6.6系统的安装

    CentOS 6.6 x86_64官方正式版系统(64位)下载地址 系统之家:http://www.xitongzhijia.net/linux/201412/33603.html 百度网盘:http ...

  8. FAQ | 是什么导致MySQL数据库服务器磁盘I/O高(本文章来自知数堂)

    FAQ | 是什么导致MySQL数据库服务器磁盘I/O高 2016-12-26 叶金荣 老叶茶馆 0.导读 有个MySQL服务器的磁盘I/O总有过高报警,怎么回事? 本文约1500字,阅读时间约10分 ...

  9. 生产环境碰到系统CPU飙高和频繁GC系统反应慢,你要怎么排查?(转)

    处理过线上问题的同学基本上都会遇到系统突然运行缓慢,CPU 100%,以及Full GC次数过多的问题.当然,这些问题的最终导致的直观现象就是系统运行缓慢,并且有大量的报警.本文主要针对系统运行缓慢这 ...

随机推荐

  1. 我用段子讲.NET之依赖注入其一

    <我用段子讲.NET之依赖注入其一> 1) 西城的某个人工湖畔,湖水清澈见底,湖畔柳树成荫.人工湖往北,坐落着两幢写字楼,水晶大厦靠近地铁站,由于为了与湖面天际线保持一致,楼层只有26层高 ...

  2. 20201123 《python程序设计》实验四报告

    20201123 2020-2021-2 <python程序设计>实验三报告 课程:<Python程序设计>班级:2011姓名:晏鹏捷学号:20201123实验教师:王志强实验 ...

  3. jwt-在asp.net core中的使用jwt

    JWT学习文章: 第一篇:JWT原理 第二篇:JWT原理实现代码 第三篇:在asp.net core中的使用JWT 前两篇文章中我写了jwt的原理,并且也用原理实现了jwt的验证.如果要看前两篇文章, ...

  4. uniapp 打包IOS 更新AppStore版本

    Hello 你好,我是大粽子. 最近随着新版本UI的发布APP也随之更新,随之而来的也就是IOS程序提审步骤,这次我详细的截图了每一个步骤,如果你正好也需要那么跟着我的节奏一步步来肯定是没问题的. 提 ...

  5. 1、SpringBoot整合之SpringBoot整合JSP

    SpringBoot整合JSP 一.创建SpringBoot项目,仅选择Web模块即可 二.在POM文件中添加依赖 <!-- 添加servlet依赖模块 --> <dependenc ...

  6. 深入学习Netty(3)——传统AIO编程

    前言 之前已经整理过了BIO.NIO两种I/O的相关博文,每一种I/O都有其特点,但相对开发而言,肯定是要又高效又简单的I/O编程才是真正需要的,在之前的NIO博文(深入学习Netty(2)--传统N ...

  7. vue中输入框事件监听 v-on:input

    <van-field v-model="inputVal" v-on:input="search" />

  8. Java程序设计(2021春)——第一章续笔记与思考

    Java程序设计(2021春)--第一章续笔记与思考 目录 Java程序设计(2021春)--第一章续笔记与思考 Java数据类型 基本数据类型 引用类型 基本数据类型--整数类型的细节 基本数据类型 ...

  9. CentOS-Docker安装Elasticsearch(单点)

    下载镜像 $ docker pull elasticsearch:7.6.0 运行镜像 $ docker run --restart=always --name elasticsearch -d -p ...

  10. 合并N个长度为M的有序数组为一个N*M的有序数组

    题目:合并N个有序数组,每个数组的长度为M,合并为N*M的有序数组.时间复杂度要求最低 解法:N个数组进行两两合并,合并后的数组再继续执行合并过程,最后合成N*M的有序数组.可以认为合并这个递归过程发 ...