{"id":54356,"date":"2025-12-04T08:08:52","date_gmt":"2025-12-04T08:08:52","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=54356"},"modified":"2026-02-21T08:29:38","modified_gmt":"2026-02-21T08:29:38","slug":"top-10-best-net-performance-tools","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/top-10-best-net-performance-tools\/","title":{"rendered":"Top 10 Best .NET performance tools"},"content":{"rendered":"\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th><strong>Tool<\/strong><\/th><th><strong>Category \/ Purpose<\/strong><\/th><th><strong>What Problem It Solves<\/strong><\/th><th><strong>Why Use This Tool (Key Strengths)<\/strong><\/th><th><strong>When to Use (Training\/Capstone Flow)<\/strong><\/th><\/tr><\/thead><tbody><tr><td><strong>dotnet-counters<\/strong><\/td><td>Live runtime diagnostics<\/td><td>Check CPU, GC, allocations, thread pool health<\/td><td>Lightweight, real-time, safe for production<\/td><td>Baseline analysis \u2192 during load test (k6)<\/td><\/tr><tr><td><strong>dotTrace<\/strong><\/td><td>CPU profiling<\/td><td>Identify slow functions, hot paths, loops, LINQ, EF hotspots<\/td><td>Best UI, deep code-level insight, widely used<\/td><td>After load \u2192 find hot paths &amp; optimize<\/td><\/tr><tr><td><strong>dotMemory<\/strong><\/td><td>Memory profiling<\/td><td>Detect leaks, excessive allocations, LOH pressure<\/td><td>Best-in-class memory graphs &amp; retention analysis<\/td><td>Before\/after optimization \u2192 memory validation<\/td><\/tr><tr><td><strong>dotnet-trace<\/strong><\/td><td>Runtime event tracing<\/td><td>Capture GC, JIT, Kestrel, exceptions, EF events<\/td><td>Low overhead, works with PerfView<\/td><td>For deep investigation or converting trace into PerfView<\/td><\/tr><tr><td><strong>dotnet-gcdump<\/strong><\/td><td>Heap snapshotting<\/td><td>See object counts, sizes, leaked objects<\/td><td>Safe in production, simple heap capture<\/td><td>When memory leak or steadily growing heap suspected<\/td><\/tr><tr><td><strong>PerfView<\/strong><\/td><td>Deep CPU + GC + allocation analysis<\/td><td>Low-level .NET internals analysis<\/td><td>The \u201ctruth machine\u201d; industry standard for internals<\/td><td>Validate final optimizations \u2192 GC &amp; CPU deep dive<\/td><\/tr><tr><td><strong>BenchmarkDotNet<\/strong><\/td><td>Micro-benchmarks<\/td><td>Compare LINQ vs loops, serializers, algorithms<\/td><td>Official .NET benchmarking standard<\/td><td>Benchmark isolated methods before optimization<\/td><\/tr><tr><td><strong>PerfMon<\/strong><\/td><td>OS-level performance<\/td><td>CPU, disk, memory, network baselines<\/td><td>Excellent for historical baselining<\/td><td>Before load test \u2192 during load \u2192 after load<\/td><\/tr><tr><td><strong>Windows Resource Monitor<\/strong><\/td><td>Quick triage<\/td><td>Identify per-process CPU, disk, memory hotspots<\/td><td>Very visual, instant insights<\/td><td>Initial troubleshooting before deeper profiling<\/td><\/tr><tr><td><strong>Visual Studio Profiler<\/strong> <em>(Optional)<\/em><\/td><td>Basic built-in profiler<\/td><td>Quick look at CPU\/memory without external tools<\/td><td>Beginner-friendly, no install needed<\/td><td>Quick local checks before dotTrace\/dotMemory<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h1 class=\"wp-block-heading\">\ud83d\udcd8 <strong>MASTERING .NET PERFORMANCE TOOLING (2026 EDITION)<\/strong><\/h1>\n\n\n\n<h3 class=\"wp-block-heading\"><em>A Complete End-to-End Guide for Developers, SREs &amp; Performance Engineers<\/em><\/h3>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h1 class=\"wp-block-heading\"><strong>1. dotnet-counters<\/strong><\/h1>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Recommended Title:<\/strong><\/h3>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u201cdotnet-counters: Real-Time Diagnostics for .NET Applications\u201d<\/strong><\/h2>\n\n\n\n<p>dotnet-counters is a <strong>lightweight, real-time performance monitoring<\/strong> tool built into the .NET SDK. It provides immediate feedback on CPU usage, GC behavior, thread pool saturation, allocations, and ASP.NET Core request metrics.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\"><strong>1.1 Why dotnet-counters?<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Minimal overhead \u2192 safe to use in production.<\/li>\n\n\n\n<li>Works locally, in containers, and in Windows\/Linux servers.<\/li>\n\n\n\n<li>Captures live health signals:\n<ul class=\"wp-block-list\">\n<li>CPU<\/li>\n\n\n\n<li>GC Heap Size<\/li>\n\n\n\n<li>Gen 0\/1\/2 Collections<\/li>\n\n\n\n<li>Allocations\/sec<\/li>\n\n\n\n<li>ThreadPool queues\/threads<\/li>\n\n\n\n<li>Kestrel request metrics<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Ideal for <strong>first responder diagnostics.<\/strong><\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\"><strong>1.2 Install<\/strong><\/h2>\n\n\n\n<p>Already included in .NET 6+.<\/p>\n\n\n\n<p>To update:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">dotnet tool update -g dotnet-counters\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\"><strong>1.3 Common Commands<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>List running .NET processes<\/strong><\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">dotnet-counters ps\n<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\"><strong>Real-time monitoring<\/strong><\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">dotnet-counters monitor --process-id 1234\n<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\"><strong>Filter by provider<\/strong><\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">dotnet-counters<\/span> <span class=\"hljs-selector-tag\">monitor<\/span> <span class=\"hljs-selector-tag\">--process-id<\/span> 1234 <span class=\"hljs-selector-tag\">System<\/span><span class=\"hljs-selector-class\">.Runtime<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\"><strong>Collect 60-second metrics snapshot<\/strong><\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">dotnet-counters<\/span> <span class=\"hljs-selector-tag\">collect<\/span> <span class=\"hljs-selector-tag\">--process-id<\/span> 1234 <span class=\"hljs-selector-tag\">--duration<\/span> 60 <span class=\"hljs-selector-tag\">--output<\/span> <span class=\"hljs-selector-tag\">counters<\/span><span class=\"hljs-selector-class\">.json<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\"><strong>1.4 Key Metrics to Watch<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>CPU %<\/strong>: &gt;70% sustained = CPU pressure.<\/li>\n\n\n\n<li><strong>GC Heap Size<\/strong> continuously growing \u2192 memory leak suspicion.<\/li>\n\n\n\n<li><strong>Gen 2 collections<\/strong> too frequent \u2192 LOH pressure.<\/li>\n\n\n\n<li><strong>ThreadPool Queue Length<\/strong> rising \u2192 request overload.<\/li>\n\n\n\n<li><strong>Requests\/sec<\/strong> vs <strong>Failures\/sec<\/strong> for ASP.NET Core apps.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\"><strong>1.5 Practical Use Case<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>You run k6 load test.<\/li>\n\n\n\n<li>dotnet-counters shows:\n<ul class=\"wp-block-list\">\n<li>High allocations<\/li>\n\n\n\n<li>Many Gen 2 collections<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>You investigate using dotMemory\/PerfView.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h1 class=\"wp-block-heading\"><strong>2. JetBrains dotTrace<\/strong><\/h1>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Recommended Title:<\/strong><\/h3>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u201cdotTrace: CPU Profiling &amp; Hot Path Analysis for .NET\u201d<\/strong><\/h2>\n\n\n\n<p>dotTrace is the most widely adopted profiler for .NET. It helps locate slow functions, high CPU usage, blocking calls, inefficient LINQ queries, and expensive EF queries.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\"><strong>2.1 Why dotTrace?<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Extremely intuitive UI.<\/li>\n\n\n\n<li>Supports:\n<ul class=\"wp-block-list\">\n<li>Sampling<\/li>\n\n\n\n<li>Tracing<\/li>\n\n\n\n<li>Line-by-line performance<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Shows call trees, flame graphs, and hot paths.<\/li>\n\n\n\n<li>Works brilliantly with ASP.NET Core apps under real traffic.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\"><strong>2.2 How to Profile an Application<\/strong><\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Open dotTrace.<\/li>\n\n\n\n<li>Choose <strong>\u201cProfile .NET Application\u201d<\/strong>.<\/li>\n\n\n\n<li>Select your executable or <strong>attach to running process<\/strong>.<\/li>\n\n\n\n<li>Select profiling mode:\n<ul class=\"wp-block-list\">\n<li><strong>Sampling<\/strong> \u2192 fastest for CPU<\/li>\n\n\n\n<li><strong>Timeline<\/strong> \u2192 holistic<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Generate load on target app (browser or k6).<\/li>\n\n\n\n<li>Stop session.<\/li>\n\n\n\n<li>Analyze \u201cHot Spots.\u201d<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\"><strong>2.3 What to Look For<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Methods with <strong>high inclusive time<\/strong>.<\/li>\n\n\n\n<li>Excessive LINQ allocations.<\/li>\n\n\n\n<li>Repeated EF queries (N+1 pattern).<\/li>\n\n\n\n<li>Lock\/contention hotspots.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\"><strong>2.4 Common Optimizations Identified<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Add <strong>AsNoTracking()<\/strong> to EF queries.<\/li>\n\n\n\n<li>Replace LINQ with optimized loops.<\/li>\n\n\n\n<li>Avoid unnecessary AutoMapper mappings.<\/li>\n\n\n\n<li>Cache repeated DB queries.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h1 class=\"wp-block-heading\"><strong>3. JetBrains dotMemory<\/strong><\/h1>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Recommended Title:<\/strong><\/h3>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u201cdotMemory: Memory Leak Detection &amp; Allocation Optimization\u201d<\/strong><\/h2>\n\n\n\n<p>dotMemory is the gold-standard memory profiler for .NET, used to identify leaks, excessive allocations, LOH problems, and object retention paths.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\"><strong>3.1 Why dotMemory?<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Detects:\n<ul class=\"wp-block-list\">\n<li>Memory leaks<\/li>\n\n\n\n<li>Unbounded collections<\/li>\n\n\n\n<li>LOH pressure<\/li>\n\n\n\n<li>Excessive allocations<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Visualizes object graphs &amp; references.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\"><strong>3.2 Typical Workflow<\/strong><\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Start dotMemory.<\/li>\n\n\n\n<li>Attach to your app.<\/li>\n\n\n\n<li>Generate load.<\/li>\n\n\n\n<li>Take memory snapshot.<\/li>\n\n\n\n<li>Locate:\n<ul class=\"wp-block-list\">\n<li>Largest object types<\/li>\n\n\n\n<li>LOH usage<\/li>\n\n\n\n<li>Retention paths<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\"><strong>3.3 Key Indicators<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Growing heap<\/strong> \u2192 leak or caching bug.<\/li>\n\n\n\n<li><strong>LargeObjectHeap (LOH)<\/strong>: large arrays, strings, JSON deserialization.<\/li>\n\n\n\n<li>Unreleased static fields retaining objects.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\"><strong>3.4 Why It\u2019s Essential<\/strong><\/h2>\n\n\n\n<p>Most performance issues are not CPU\u2014they are <strong>allocation pressure causing GC storms<\/strong>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h1 class=\"wp-block-heading\"><strong>4. dotnet-trace<\/strong><\/h1>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Recommended Title:<\/strong><\/h3>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u201cdotnet-trace: Deep Runtime Event Tracing Using EventPipe\u201d<\/strong><\/h2>\n\n\n\n<p>dotnet-trace captures <strong>low-level runtime events<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>GC<\/li>\n\n\n\n<li>JIT<\/li>\n\n\n\n<li>ThreadPool<\/li>\n\n\n\n<li>Exceptions<\/li>\n\n\n\n<li>Kestrel<\/li>\n\n\n\n<li>EF Core<\/li>\n\n\n\n<li>ASP.NET Core metrics<\/li>\n\n\n\n<li>Custom <code>EventSource<\/code> logs<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\"><strong>4.1 Record a trace<\/strong><\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">dotnet-trace<\/span> <span class=\"hljs-selector-tag\">collect<\/span> <span class=\"hljs-selector-tag\">--process-id<\/span> 1234 <span class=\"hljs-selector-tag\">--output<\/span> <span class=\"hljs-selector-tag\">trace<\/span><span class=\"hljs-selector-class\">.nettrace<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\"><strong>4.2 Analyze With<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>PerfView<\/strong><\/li>\n\n\n\n<li><strong>Visual Studio<\/strong><\/li>\n\n\n\n<li><strong>SpeedScope<\/strong><\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\"><strong>4.3 When to Use<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Investigating:\n<ul class=\"wp-block-list\">\n<li>GC pauses<\/li>\n\n\n\n<li>Excessive exceptions<\/li>\n\n\n\n<li>ThreadPool starvation<\/li>\n\n\n\n<li>Slow EF queries<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h1 class=\"wp-block-heading\"><strong>5. dotnet-gcdump<\/strong><\/h1>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Recommended Title:<\/strong><\/h3>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u201cdotnet-gcdump: Lightweight Heap Dump Capture for .NET\u201d<\/strong><\/h2>\n\n\n\n<p>dotnet-gcdump captures a <strong>heap snapshot<\/strong> without needing a full process dump.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\"><strong>5.1 Capture dump<\/strong><\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">dotnet-gcdump<\/span> <span class=\"hljs-selector-tag\">collect<\/span> <span class=\"hljs-selector-tag\">--process-id<\/span> 1234 <span class=\"hljs-selector-tag\">--output<\/span> <span class=\"hljs-selector-tag\">dump<\/span><span class=\"hljs-selector-class\">.gcdump<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\"><strong>5.2 Open in PerfView or Visual Studio<\/strong><\/h2>\n\n\n\n<p>Useful when:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Memory leak suspected<\/li>\n\n\n\n<li>High memory usage in production<\/li>\n\n\n\n<li>You want to inspect object counts and sizes<\/li>\n<\/ul>\n\n\n\n<p>Low overhead \u2192 safe for production.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h1 class=\"wp-block-heading\"><strong>6. PerfView<\/strong><\/h1>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Recommended Title:<\/strong><\/h3>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u201cPerfView: The Ultimate .NET GC &amp; CPU Investigation Tool\u201d<\/strong><\/h2>\n\n\n\n<p>PerfView is created by <strong>Vance Morrison<\/strong>, .NET Architect.<br>It is the authoritative tool for low-level analysis.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\"><strong>6.1 Why PerfView?<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Deep GC analysis.<\/li>\n\n\n\n<li>Allocation tracking.<\/li>\n\n\n\n<li>CPU sampling.<\/li>\n\n\n\n<li>Thread &amp; blocking visualization.<\/li>\n\n\n\n<li>Understands ETW\/EventPipe trace logs.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\"><strong>6.2 Typical Workflow<\/strong><\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Open PerfView.<\/li>\n\n\n\n<li><strong>Collect<\/strong> \u2192 CPU, GC, Allocations.<\/li>\n\n\n\n<li>Generate load.<\/li>\n\n\n\n<li>Analyze:\n<ul class=\"wp-block-list\">\n<li><strong>CallTree<\/strong> (CPU hotspots)<\/li>\n\n\n\n<li><strong>GCStats<\/strong> (GC cycles, pause time)<\/li>\n\n\n\n<li><strong>Events<\/strong> (GC\/AllocationTick)<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<p>PerfView is the <strong>truth machine<\/strong>\u2014it confirms all findings discovered via dotTrace\/dotMemory.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h1 class=\"wp-block-heading\"><strong>7. BenchmarkDotNet<\/strong><\/h1>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Recommended Title:<\/strong><\/h3>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u201cBenchmarkDotNet: Microbenchmarking &amp; Code Optimization Framework\u201d<\/strong><\/h2>\n\n\n\n<p>BenchmarkDotNet is used by Microsoft teams and OSS maintainers.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\"><strong>7.1 Why BenchmarkDotNet?<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Scientific, controlled measurement<\/li>\n\n\n\n<li>Warmup + multiple iterations<\/li>\n\n\n\n<li>GC + allocations metrics<\/li>\n\n\n\n<li>Helps decide:\n<ul class=\"wp-block-list\">\n<li>LINQ vs loop<\/li>\n\n\n\n<li>Regex vs manual parsing<\/li>\n\n\n\n<li>JSON serializers<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\"><strong>7.2 Example Benchmark<\/strong><\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">&#91;MemoryDiagnoser]\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">MyBench<\/span>\n<\/span>{\n    &#91;Benchmark]\n    <span class=\"hljs-keyword\">public<\/span> int UsingLinq() =&gt; Enumerable.Range(<span class=\"hljs-number\">1<\/span>,<span class=\"hljs-number\">100000<\/span>).Where(x =&gt; x%<span class=\"hljs-number\">2<\/span>==<span class=\"hljs-number\">0<\/span>).Count();\n\n    &#91;Benchmark]\n    <span class=\"hljs-keyword\">public<\/span> int UsingFor()\n    {\n        int c = <span class=\"hljs-number\">0<\/span>;\n        <span class=\"hljs-keyword\">for<\/span>(int i=<span class=\"hljs-number\">1<\/span>;i&lt;=<span class=\"hljs-number\">100000<\/span>;i++)\n            <span class=\"hljs-keyword\">if<\/span>(i%<span class=\"hljs-number\">2<\/span>==<span class=\"hljs-number\">0<\/span>) c++;\n        <span class=\"hljs-keyword\">return<\/span> c;\n    }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Run:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">dotnet run -c Release\n<\/code><\/span><\/pre>\n\n\n<p>Outputs:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Mean execution time<\/li>\n\n\n\n<li>Std deviation<\/li>\n\n\n\n<li>Allocations<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\"><strong>7.3 Why It\u2019s Essential<\/strong><\/h2>\n\n\n\n<p>You cannot optimize code blindly.<br>BenchmarkDotNet gives repeatable, measurable results.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h1 class=\"wp-block-heading\"><strong>8. Windows Performance Monitor (PerfMon)<\/strong><\/h1>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Recommended Title:<\/strong><\/h3>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u201cPerfMon: Windows OS-Level Metrics &amp; Capacity Baselines\u201d<\/strong><\/h2>\n\n\n\n<p>PerfMon is the traditional Windows tool to record processor, memory, disk, and network metrics over time.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\"><strong>8.1 Why PerfMon?<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Provides historical logs<\/li>\n\n\n\n<li>Lightweight<\/li>\n\n\n\n<li>Excellent for baseline creation<\/li>\n\n\n\n<li>Combines OS + .NET counters<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\"><strong>8.2 Useful Counters<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>CPU<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Processor \u2192 % Processor Time<\/li>\n\n\n\n<li>.NET CLR \u2192 % Time in GC<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Memory<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Available MB<\/li>\n\n\n\n<li>Pages\/sec<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Disk<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Avg Disk sec\/Read<\/li>\n\n\n\n<li>Avg Disk sec\/Write<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Network<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Bytes Total\/sec<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>ASP.NET Core<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>If using hosting bundle: request rate, queue length<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\"><strong>8.3 Use Cases<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Detecting machine-level bottlenecks<\/li>\n\n\n\n<li>Correlating app slowdown with CPU\/Disk spikes<\/li>\n\n\n\n<li>Long-term trending for capacity planning<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h1 class=\"wp-block-heading\"><strong>9. Windows Resource Monitor<\/strong><\/h1>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Recommended Title:<\/strong><\/h3>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u201cResource Monitor: Quick Process-Level Diagnostics in Windows\u201d<\/strong><\/h2>\n\n\n\n<p>Resource Monitor is a more visual tool than PerfMon, ideal for quick triage.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\"><strong>9.1 Tabs to Use<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>CPU<\/strong> \u2192 per-thread CPU usage<\/li>\n\n\n\n<li><strong>Memory<\/strong> \u2192 working sets, faults<\/li>\n\n\n\n<li><strong>Disk<\/strong> \u2192 processes causing heavy I\/O<\/li>\n\n\n\n<li><strong>Network<\/strong> \u2192 active connections and bandwidth<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\"><strong>9.2 When to Use<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>When you need <strong>fast visual confirmation<\/strong> of:\n<ul class=\"wp-block-list\">\n<li>Which process is consuming CPU<\/li>\n\n\n\n<li>Which process is hitting disk<\/li>\n\n\n\n<li>Whether the machine is I\/O bound<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p>Use Resource Monitor for triage \u2192 then deeper tools (PerfView, dotTrace).<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h1 class=\"wp-block-heading\"><strong>10. Visual Studio Profiler (Optional)<\/strong><\/h1>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Recommended Title:<\/strong><\/h3>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>\u201cVisual Studio Profiler: Fast, Built-In Performance Analysis\u201d<\/strong><\/h2>\n\n\n\n<p>VS Profiler is a baseline CPU and memory profiler included with Visual Studio.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\"><strong>10.1 Pros<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>No install<\/li>\n\n\n\n<li>Easy to use<\/li>\n\n\n\n<li>Good for newcomers<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\"><strong>10.2 Cons<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Less powerful than dotTrace\/dotMemory<\/li>\n\n\n\n<li>No advanced investigation capabilities<\/li>\n\n\n\n<li>Not ideal for complex performance labs<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h2 class=\"wp-block-heading\"><strong>10.3 When to Use<\/strong><\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Early learning modules<\/li>\n\n\n\n<li>Quick local CPU profiling<\/li>\n\n\n\n<li>Initial \u201csmoke test\u201d before deeper analysis<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h1 class=\"wp-block-heading\">\u2705 <strong>Final Recommendation for Your Capstone<\/strong><\/h1>\n\n\n\n<p>Use <strong>ALL tools above<\/strong>, but categorize like this:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Primary Tools<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>dotnet-counters<\/li>\n\n\n\n<li>dotTrace<\/li>\n\n\n\n<li>dotMemory<\/li>\n\n\n\n<li>PerfView<\/li>\n\n\n\n<li>BenchmarkDotNet<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Supporting Tools<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>dotnet-trace<\/li>\n\n\n\n<li>dotnet-gcdump<\/li>\n\n\n\n<li>PerfMon<\/li>\n\n\n\n<li>Resource Monitor<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Optional<\/strong><\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Visual Studio Profiler<\/li>\n<\/ul>\n\n\n\n<p>This mapping gives a <strong>complete, world-class performance engineering toolkit<\/strong> aligned with modern .NET practices used by top companies and training programs.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h1 class=\"wp-block-heading\">\ud83d\udcd8 <strong>Category Overview Table (Tool-by-Tool Classification)<\/strong><\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th><strong>Category<\/strong><\/th><th><strong>Primary Tools<\/strong><\/th><th><strong>Supporting Tools<\/strong><\/th><th><strong>Optional Tools<\/strong><\/th><\/tr><\/thead><tbody><tr><td><strong>Live Monitoring<\/strong><\/td><td>dotnet-counters<\/td><td>PerfMon, Resource Monitor<\/td><td>\u2013<\/td><\/tr><tr><td><strong>CPU Profiling<\/strong><\/td><td>dotTrace<\/td><td>PerfView (advanced CPU)<\/td><td>Visual Studio Profiler<\/td><\/tr><tr><td><strong>Memory Profiling<\/strong><\/td><td>dotMemory<\/td><td>dotnet-gcdump, PerfView allocations<\/td><td>Visual Studio Profiler<\/td><\/tr><tr><td><strong>Deep Runtime Internals<\/strong><\/td><td>PerfView<\/td><td>dotnet-trace<\/td><td>\u2013<\/td><\/tr><tr><td><strong>Microbenchmarking<\/strong><\/td><td>BenchmarkDotNet<\/td><td>\u2013<\/td><td>\u2013<\/td><\/tr><tr><td><strong>Production Diagnostics<\/strong><\/td><td>dotnet-counters, dotnet-gcdump<\/td><td>PerfView<\/td><td>\u2013<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\">\n\n\n\n<h1 class=\"wp-block-heading\">\ud83d\udee0\ufe0f <strong>Training Use Case Alignment Table<\/strong><\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th><strong>Scenario \/ Problem<\/strong><\/th><th><strong>Best Tool<\/strong><\/th><th><strong>Secondary Tools<\/strong><\/th><th><strong>Outcome<\/strong><\/th><\/tr><\/thead><tbody><tr><td>High CPU under load<\/td><td>dotTrace<\/td><td>PerfView<\/td><td>Identify hot methods, inefficient loops, expensive LINQ<\/td><\/tr><tr><td>Memory leaking or growing<\/td><td>dotMemory<\/td><td>dotnet-gcdump, PerfView<\/td><td>Find retention paths, static caches, LOH pressure<\/td><\/tr><tr><td>ThreadPool starvation<\/td><td>dotnet-counters<\/td><td>dotnet-trace<\/td><td>Solve slow request handling \/ blocked threads<\/td><\/tr><tr><td>Excessive allocations<\/td><td>dotMemory<\/td><td>PerfView allocations<\/td><td>Reduce pressure \u2192 fewer GCs \u2192 better latency<\/td><\/tr><tr><td>Slow API endpoints<\/td><td>dotTrace<\/td><td>PerfView, dotnet-counters<\/td><td>Optimize EF queries, caching, business logic<\/td><\/tr><tr><td>Poor GC performance<\/td><td>PerfView<\/td><td>dotnet-counters<\/td><td>Reduce Gen2 GCs, lower pause time<\/td><\/tr><tr><td>Compare algorithm performance<\/td><td>BenchmarkDotNet<\/td><td>\u2013<\/td><td>Measure LINQ vs loops, serializers, sorting algos<\/td><\/tr><tr><td>OS bottlenecks (disk, CPU, memory)<\/td><td>PerfMon<\/td><td>Resource Monitor<\/td><td>Capacity planning, environment tuning<\/td><\/tr><tr><td>Quick triage on Windows<\/td><td>Resource Monitor<\/td><td>PerfMon<\/td><td>Identify which process is causing trouble<\/td><\/tr><tr><td>Fast \u201cfirst look\u201d profiling<\/td><td>Visual Studio Profiler<\/td><td>dotTrace<\/td><td>Quick smoke test of performance<\/td><\/tr><\/tbody><\/table><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Tool Category \/ Purpose What Problem It Solves Why Use This Tool (Key Strengths) When to Use (Training\/Capstone Flow) dotnet-counters Live runtime diagnostics Check CPU, GC, allocations, thread pool health Lightweight, real-time, safe for production Baseline analysis \u2192 during load test (k6) dotTrace CPU profiling Identify slow functions, hot paths, loops, LINQ, EF hotspots Best&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","_joinchat":[],"footnotes":""},"categories":[11138],"tags":[],"class_list":["post-54356","post","type-post","status-publish","format-standard","hentry","category-best-tools"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/54356","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=54356"}],"version-history":[{"count":2,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/54356\/revisions"}],"predecessor-version":[{"id":59908,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/54356\/revisions\/59908"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=54356"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=54356"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=54356"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}