Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >调试 .NET Core 中的高 CPU 使用率

调试 .NET Core 中的高 CPU 使用率

作者头像
呆呆
发布于 2022-01-09 03:57:54
发布于 2022-01-09 03:57:54
1.3K0
举报
文章被收录于专栏:centosDaicentosDai

本文适用于: ✔️ .NET Core 3.1 SDK 及更高版本

本教程将介绍如何调试 CPU 使用率过高的情况。 使用提供的示例 ASP.NET Core Web 应用 源代码存储库,可以故意造成死锁。 终结点将停止响应并遇到线程累积问题。 你将了解如何使用各种工具,通过几条关键的诊断数据诊断此情况。

在本教程中,你将:

调查 CPU 使用率是否过高

使用 dotnet-counters 确定 CPU 使用率

使用 dotnet-trace 进行跟踪生成

PerfView 中的配置文件性能

诊断并解决 CPU 使用率过高的问题

先决条件

本教程使用:

.NET Core 3.1 SDK 或更高版本。

示例调试目标以触发场景。

dotnet-trace 以列出进程并生成配置文件。

dotnet-counters 以监视 CPU 使用率。

CPU 计数器

在尝试收集诊断数据之前,需要观察 CPU 状况是否过高。 使用以下命令从项目根目录运行示例应用程序。

dotnet run

若要查找该进程 ID,请使用以下命令:

dotnet-trace ps

注意命令输出中的进程 ID。 我们的进程 ID 是 22884,你的进程 ID 将不同。 若要检查当前的 CPU 使用率,请使用 dotnet counters 工具命令:

dotnet-counters monitor --refresh-interval 1 -p 22884

refresh-interval 是计数器轮询 CPU 值间隔的秒数。 输出应与以下内容类似:

Press p to pause, r to resume, q to quit.

Status: Running

[System.Runtime]

% Time in GC since last GC (%) 0

Allocation Rate / 1 sec (B) 0

CPU Usage (%) 0

Exception Count / 1 sec 0

GC Heap Size (MB) 4

Gen 0 GC Count / 60 sec 0

Gen 0 Size (B) 0

Gen 1 GC Count / 60 sec 0

Gen 1 Size (B) 0

Gen 2 GC Count / 60 sec 0

Gen 2 Size (B) 0

LOH Size (B) 0

Monitor Lock Contention Count / 1 sec 0

Number of Active Timers 1

Number of Assemblies Loaded 140

ThreadPool Completed Work Item Count / 1 sec 3

ThreadPool Queue Length 0

ThreadPool Thread Count 7

Working Set (MB) 63

在 Web 应用运行的情况下,CPU 根本不会在启动后就立即被消耗,且会在 0% 进行报告。 使用 60000 作为路由参数导航到 api/diagscenario/highcpu 路由:

https://localhost:5001/api/diagscenario/highcpu/60000

现在,重新运行 dotnet-counters 命令。 若要只监视 cpu-usage,请在命令中指定 System.Runtime[cpu-usage]。

dotnet-counters monitor --counters System.Runtime[cpu-usage] -p 22884 --refresh-interval 1

你将看到 CPU 使用率已增加,如下所示:

Press p to pause, r to resume, q to quit.

Status: Running

[System.Runtime]

CPU Usage (%) 25

在整个请求期间,CPU 使用率将徘徊在 25% 左右。 根据主机的不同,预期 CPU 使用率会有所不同。

提示

若要可视化更高的 CPU 使用率,可以在多个浏览器选项卡中同时使用此终结点。

此时,你可以放心地说 CPU 运行的速度比预期的要高。

跟踪生成

当分析速度较慢的请求时,需要一个诊断工具来提供代码正在执行的操作的见解。 常见的选择是探查器,并且有不同的探查器选项可供选择。

Linux

Windows

perf 工具可用于生成 .NET Core 应用配置文件。 退出示例调试目标的上一个实例。

设置 DOTNET_PerfMapEnabled 环境变量,使 .NET Core 应用在 /tmp 目录中创建 map 文件。 perf 使用此 map 文件按名称将 CPU 地址映射到 JIT 生成的函数。 有关详细信息,请参阅写入 Perf 映射。

备注

.NET 6 为用于配置 .NET 运行时行为的环境变量标准化前缀 DOTNET_ 而不是 COMPlus_。 但是,COMPlus_ 前缀仍将继续正常工作。 如果使用的是早期版本的 .NET 运行时,则环境变量仍应该使用 COMPlus_ 前缀。

在同一终端会话中运行示例调试目标。

export DOTNET_PerfMapEnabled=1

dotnet run

再次使用高 CPU API (https://localhost:5001/api/diagscenario/highcpu/60000) 终结点。 当它在 1 分钟请求内运行时,对进程 ID 运行 perf 命令:

sudo perf record -p 2266 -g

perf 命令将启动性能收集过程。 让它运行大约 20-30 秒,然后按 Ctrl+C 退出收集过程。 可以使用相同的 perf 命令来查看跟踪的输出。

sudo perf report -f

还可以使用以下命令生成 flame-graph:

git clone --depth=1 https://github.com/BrendanGregg/FlameGraph

sudo perf script | FlameGraph/stackcollapse-perf.pl | FlameGraph/flamegraph.pl > flamegraph.svg

此命令生成 flamegraph.svg,你可以在浏览器中查看 flamegraph.svg 以调查性能问题:

在 Windows 上,可以使用 dotnet-trace 工具作为探查器。 使用之前的示例调试目标,再次使用高 CPU (https://localhost:5001/api/diagscenario/highcpu/60000) 终结点。 当它在 1 分钟请求内运行时,使用 collect 命令,如下所示:

dotnet-trace collect -p 22884 --providers Microsoft-DotNETCore-SampleProfiler

让 dotnet-trace 运行大约 20-30 秒,然后按 Enter 退出收集。 结果是位于同一文件夹中的 nettrace 文件。 nettrace 文件是在 Windows 上使用现有分析工具的好方法。

使用 PerfView 打开 nettrace,如下所示。

请参阅

用于列出进程的 dotnet-trace

用于检查托管内存使用情况的 dotnet-counters

用于收集和分析转储文件的 dotnet-dump

dotnet/diagnostics

后续步骤

调试 .NET Core 中的死锁

本文系外文翻译,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系外文翻译,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
.NET Core CLI 的性能诊断工具介绍
开发人员的.NET Core项目上线后,经常会出现各种问题,内存泄漏,CPU 100%,处理时间长等, 这个时候就需要快速并准确的发现问题,并解决问题, 除了项目本身的日志记录外,NET Core 为我们开发人员提供了一系列功能强大并且无侵入的诊断工具,本文主要介绍的是 .NET Core dotnet 诊断全局工具
梁规晓
2020/11/05
1K0
.NET Core CLI 的性能诊断工具介绍
调试 .NET Core 中的内存泄漏
当应用引用不再需要执行所需任务的对象时,可能会发生内存泄漏。 引用上述对象会使垃圾回收器无法回收所使用的内存,这通常会导致性能降低,并可能最终引发 OutOfMemoryException。
呆呆
2022/01/09
1.8K0
.NET Core 调试 CPU 爆高问题
在实际开发和生产环境中,.NET Core 应用程序遇到 CPU 使用率飙升的问题并不少见。CPU 高负载会直接影响应用程序的性能,进而影响用户体验。因此,及时识别并解决 CPU 爆高问题是开发者需要掌握的关键技能。
Michel_Rolle
2024/12/24
1.6K0
教程:使用 .NET Core 中的 EventCounters 衡量性能
本教程将介绍如何使用 EventCounter 衡量高频率事件的性能。 可以使用由各种官方 .NET Core 包或第三方提供者发布的可用的计数器,或创建自己的监视指标。
呆呆
2022/01/07
5080
.NET 中的 EventCounters
EventCounters 是 .NET API,用于轻量级、跨平台、准实时性能指标收集。 EventCounters 作为 Windows 上 .NET 框架的“性能计数器”的跨平台替代项添加。 本文将介绍什么是 EventCounters,如何实现它们,以及如何使用它们。
呆呆
2022/01/07
1.5K0
《快来为你的 .NET 应用加个监控吧!》更新版本啦
CZGL.ProcessMetrics 是一个 Metrics 库,能够将程序的 GC、CPU、内存、机器网络、磁盘空间等信息记录下来,使用 Prometheus 采集信息,然后使用 Grafana 显示。
痴者工良
2021/07/20
5130
《快来为你的 .NET 应用加个监控吧!》更新版本啦
【翻译】.NET 6 中的 dotnet monitor
我们在 2020 年 6 月首次推出了dotnet monitor 作为实验工具,并在去年(2020年)努力将其转变为生产级工具。今天,我很高兴地的宣布 dotnet monitor 的第一个正式版将和 .NET 6 一起发布,作为 .NET 6 的一部分。
晓晨
2021/12/09
5860
【翻译】.NET 6 中的 dotnet monitor
dotnet-trace 性能分析实用工具
若要安装最新版 dotnet-trace NuGet 包,请使用 dotnet tool install 命令:
呆呆
2022/01/09
1.2K0
浅入 .NET Core 中的内存和GC知识
【1】https://docs.microsoft.com/zh-cn/dotnet/standard/managed-code
痴者工良
2021/04/26
7060
当 dotnet-monitor 遇上 Prometheus, 是种什么样的体验?
对于开发和运维人员来说, 监控大屏很棒, 让我们来做一个 Dashboard 吧!大家可能听说过一些 CLI 诊断工具, 比如 dotnet-counters,dotnet-dump 和 dotnet-trace, 那 dotnet-monitor 又是什么呢?简单理解就是把上面的几种诊断工具进行了包装, 并且暴露了 对应的 REST API, 让诊断变的更容易, 在去年, dotnet-monitor 还是一个实验性的诊断工具, 当时我也写了一篇文章介绍 dotnet-monitor,使用 dotnet-monitor 分析.NET 应用程序 , 而最近, .NET 团队宣布第一个 release 版本的 dotnet-monitor, 同时它也是 .NET 6 的内容, 也就是 dotnet-monitor 6.0.0 !
全球技术精选
2021/12/07
6030
当 dotnet-monitor 遇上 Prometheus, 是种什么样的体验?
译 | .NET Core 3.0 对诊断的改进
在 .NET Core 3.0 中,我们将引入一套工具,这些工具利用 .NET 运行时中的新功能,使诊断和解决性能问题变得更加容易。
Edi Wang
2019/07/09
1.6K0
使用 dotnet-monitor 分析.NET 应用程序
dotnet-monitor 是 .NET Core 命令行接口 (CLI) 工具, 可以很方便的在dotnet环境中分析我们的应用程序,需要注意的是,目前它还只是一个实验性的工具
全球技术精选
2021/01/09
6610
使用 dotnet-monitor 分析.NET 应用程序
.NET 9 中的 RuntimeMetrics
.NET 9 中引入了 RuntimeMetrics,基于 dotnet 里的 metrics 实现 System.Diagnostic.Metrics.Meter 来生成 metrics 数据,包含了 CPU、内存、GC、JIT 以及线程等信息
JusterZhu
2025/01/23
450
.NET 9 中的 RuntimeMetrics
记一次 JVM CPU 使用率飙高问题的排查过程
如上图所示,在 下午3:45 分之前,CPU 的使用率明显飙高,最高飙到近 100%,为什么会出现这样的现象呢?
CG国斌
2020/04/14
5.3K0
记一次 JVM CPU 使用率飙高问题的排查过程
揭秘.NET Core应用中的十大性能陷阱与优化实战
.NET Core 以高性能、可扩展性和灵活性著称,但即使是最优秀的框架,若忽视了潜藏的“性能杀手”,应用也会陷入低效泥潭。这些“沉默的刺客”会降低执行效率、增加响应时间,甚至导致资源浪费。
郑子铭
2025/04/14
1000
揭秘.NET Core应用中的十大性能陷阱与优化实战
收集指标
本文适用范围:✔️ .NET Core 3.1 及更高版本 ✔️ .NET Framework 4.6.1 及更高版本
呆呆
2022/01/07
6200
.NET GC 实时监控工具 dotnet gcmon 介绍
今天介绍一个新的诊断工具 dotnet-gcmon, 也是全局 .NET CLI 工具, 它可以监控到 .NET 程序的 GC, 能获取到的信息也很详细, 另外 maoni 大佬也是其中的开发者之一。
全球技术精选
2021/11/30
4880
.NET GC 实时监控工具 dotnet gcmon 介绍
动手实现一个适用于.NET Core 的诊断工具
大家可能对诊断工具并不陌生,从大名鼎鼎的 dotTrace,到 .NET CLI 推出的一系列的高效诊断组件(dotnet trace,dotnet sos,dotnet dump)等, 这些工具提升了对程序Debug的能力和效率,可以让开发人员从更高层次的维度来发现程序中的问题。
全球技术精选
2021/05/18
5750
动手实现一个适用于.NET Core 的诊断工具
某个应用的 CPU 使用率居然达到 100%,我该怎么办?
通过前两节对平均负载和 CPU 上下文切换的学习,我相信你对 CPU 的性能已经有了初步了解。不过我还是想问一下,在学这个专栏前,你最常用什么指标来描述系统的 CPU 性能呢?我想你的答案,可能不是平均负载,也不是 CPU 上下文切换,而是另一个更直观的指标—— CPU 使用率。
米开朗基杨
2019/08/29
2.3K0
某个应用的 CPU 使用率居然达到 100%,我该怎么办?
.NET 中的已知 EventCounters
.NET 运行时和库实现并发布几个 EventCounters,可用于识别和诊断各种性能问题。 通过本文,你可了解可用于监视这些计数器的提供程序及其描述。
呆呆
2022/01/07
5010
相关推荐
.NET Core CLI 的性能诊断工具介绍
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档