惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Google DeepMind News
Google DeepMind News
WordPress大学
WordPress大学
S
SegmentFault 最新的问题
小众软件
小众软件
爱范儿
爱范儿
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
量子位
博客园_首页
T
Tailwind CSS Blog
The Cloudflare Blog
J
Java Code Geeks
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
U
Unit 42
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
人人都是产品经理
人人都是产品经理
N
Netflix TechBlog - Medium
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
腾讯CDC
P
Proofpoint News Feed
aimingoo的专栏
aimingoo的专栏
Recent Announcements
Recent Announcements
T
The Blog of Author Tim Ferriss
D
Docker
Microsoft Azure Blog
Microsoft Azure Blog

博客园 - jianyi

SpringBoot - open-in-view 机制分析 ShrePoint 迁移域控 SharePoint online 获取文件版本记录 SharePonit online 列表表单定制 VS2015 ionic 开发环境配置纪要 TFS online build change web.config SharePoint 2016 - 安装QuickFlow2013 EF Migrations error: No connection string named 'MpDb' could be found in the application config file. TFS online 自动部署配置 SharePoint Permission Extension SharePoint暂时禁用事件触发 视图xsl定制之嵌入服务器控件 自定义View字段表头 自定义母版页之列表过滤菜单位置issue fix ListDefinition Tips QuickFlow UI 控件之 NamedFormAttachment SharePoint 2010 GridView/SPGridView完全应用系统样式 QuickFlow-如何通过QFD and ExecuteCode获取其他列表数据 DLL嵌入exe中
w3wp CPU 100%问题解决
jianyi · 2019-05-30 · via 博客园 - jianyi

问题:

web服务器w3wp CPU占用率非常高,导致整个服务器CPU 100%占用,问题无法正常重现

解决方法:

--问题尚未解决,此处记录目前的解决状态

1)下载windbg  

参考https://blog.csdn.net/johnsonblog/article/details/8165861

最终的下载地址:

http://download.microsoft.com/download/A/6/A/A6AC035D-DA3F-4F0C-ADA4-37C8E5D34E3D/setup/WinSDKDebuggingTools_amd64/dbg_amd64.msi

这个版本无法自动下载调试符号,再win10上可以直接安装 Windbg Preview: https://www.microsoft.com/zh-cn/p/windbg-preview/9pgjgd53tn86#activetab=pivot:overviewtab

2)将windlb安装在服务器(本地也可以),内存转储文件可能很大(G级别),推荐直接安装在服务器,避免复制dmp文件

默认目录为:C:\Program Files\Debugging Tools for Windows (x64)

3)创建进程转储问题,找到cpu占用最高的w3wp,右键,创建转储文件,若成功,则会提示转储文件的地址,一般放在C:\Users\Administrator\AppData\Local\Temp\X

4)  用windbg打开转储文件分析,打开的菜单为Fille->Open Crash Dump 或者按Ctrl + D

5)  输入命令分析,找到正在执行的代码

 参考:https://improve.dk/debugging-in-production-part-1-analyzing-100-cpu-usage-using-windbg/

概要:

在打开的窗口下面的输入框中依次输入:

加载dotNet分析工具: !loadby sos clr
查到正在运行的线程:     !runaway
运行这个命令后,找到执行时间最长的线程,一般是第一个,找到线程的id
-----
:000> !runaway
 User Mode Time
  Thread       Time
   21:1e78     0 days 1:18:51.843
   22:1ff8     0 days 1:14:28.562
    9:1a98     0 days 0:05:40.046
   10:1f74     0 days 0:05:18.703
   30:1ff0     0 days 0:00:25.859

-----
选择线程,输入:~Xs 将X换成线程Id,  如 ~21s
加载线程的调用堆栈:!CLRStack
现在可以看到代码了。
---
服务器dump了一个,CLRStatck的时候报错:

PDB symbol for clr.dll not loaded,查看资料是 mscordacwks.dll版本不匹配,研究了半天,没搞定

https://blogs.msdn.microsoft.com/dougste/2009/02/18/failed-to-load-data-access-dll-0x80004005-or-what-is-mscordacwks-dll

https://github.com/Microsoft/WinObjC/wiki/Debugging-Stack-Traces-from-Crash-Dumps

最后,安装了Windbg Preview(直接在win10市场中安装),用其打开dump文件,输入几个命令后,它自己下载了符号文件,命令终于可以运行了。

 Windbg Preview安装: https://www.microsoft.com/zh-cn/p/windbg-preview/9pgjgd53tn86#activetab=pivot:overviewtab

最终发现问题是老代码有个地方用到了静态的Dictionary<>,Dictionary<>不是线程安全的,不应该作为静态字段用在web程序中。

000000397797d7c0 00007ffdabdb8d2e System.Collections.Generic.Dictionary`2[[System.__Canon, mscorlib],[System.__Canon, mscorlib]].FindEntry(System.__Canon)
000000397797d830 00007ffd519cca81 ModelBLL.GetModel(System.String)