💡
原文中文,约1300字,阅读约需3分钟。
📝
内容提要
使用 WinDbg 和 SOS 扩展分析 .NET 应用程序的高 CPU 占用时,首先加载 SOS.dll,查看高 CPU 占用线程及其调用栈,以识别忙线程、阻塞线程和 GC 线程。通过调用栈分析,判断是否因锁等因素导致异常 CPU 占用。掌握宏观视角、线程类型识别和深入分析技巧,有助于高效诊断问题。
🎯
关键要点
- 使用 WinDbg 和 SOS 扩展分析 .NET 应用程序的高 CPU 占用问题。
- 首先加载 SOS.dll,针对不同 .NET 版本使用不同的模块名。
- 使用 !runaway 命令查看 CPU 占用高的线程。
- 查看每个线程的调用栈是分析的关键,使用 ~* k 命令列出所有线程的原生调用堆栈。
- 关注持续执行的线程、阻塞状态的线程和 GC 线程。
- 分析具体线程时,使用 ~28s !clrstack 命令聚焦于特定线程的托管调用栈。
- 总结时要宏观查看所有线程调用栈,识别忙线程、等待线程和 GC 线程。
- 掌握这些分析技巧有助于高效诊断高 CPU 占用问题。
❓
延伸问答
如何使用 WinDbg 分析 .NET 应用程序的高 CPU 占用问题?
首先加载 SOS.dll,然后使用 !runaway 命令查看高 CPU 占用线程,接着分析每个线程的调用栈,识别忙线程、阻塞线程和 GC 线程。
在 WinDbg 中如何加载 SOS 扩展?
使用 .loadby sos clr 命令加载 SOS.dll,具体模块名根据 .NET 版本不同而异。
如何识别高 CPU 占用的线程?
使用 !runaway 命令查看 CPU 占用高的线程,并通过 ~* k 命令列出所有线程的调用栈,关注持续执行的线程和阻塞状态的线程。
分析线程调用栈时需要关注哪些线程特征?
需要关注持续执行的线程、阻塞状态的线程和 GC 线程,特别是栈顶函数是否为业务逻辑方法或等待锁的函数。
如何进一步分析特定线程的托管调用栈?
使用 ~28s !clrstack 命令聚焦于特定线程,查看其托管调用栈以确认是否存在死循环或锁等待等问题。
在高 CPU 占用的排查中,应该掌握哪些关键点?
应宏观查看所有线程调用栈,识别忙线程、等待线程和 GC 线程,并使用 !clrstack 进一步分析托管调用栈。
➡️