From 50f2342e5e00521426464f374330c17cd3ccd44b Mon Sep 17 00:00:00 2001 From: Kunal Pathak Date: Mon, 12 Oct 2020 13:49:44 -0700 Subject: [PATCH 1/9] Display Allocated Heap Size --- src/PerfView/JitStats.cs | 32 +++++++++++------ .../Computers/TraceManagedProcess.cs | 35 ++++++++++++++++++- 2 files changed, 55 insertions(+), 12 deletions(-) diff --git a/src/PerfView/JitStats.cs b/src/PerfView/JitStats.cs index 4dc91f352..11180217c 100644 --- a/src/PerfView/JitStats.cs +++ b/src/PerfView/JitStats.cs @@ -160,6 +160,7 @@ public static void ToHtml(TextWriter writer, TraceProcess stats, TraceLoadedDotN "Num Compilations" + "IL Size" + "Native Size" + + "Allocated Heap Size" + "" + GetLongNameForThreadClassification(CompilationThreadKind.Foreground) + "
msec" + "" + GetLongNameForThreadClassification(CompilationThreadKind.MulticoreJitBackground) + "
msec" + "" + GetLongNameForThreadClassification(CompilationThreadKind.TieredCompilationBackground) + "
msec" + @@ -171,9 +172,10 @@ public static void ToHtml(TextWriter writer, TraceProcess stats, TraceLoadedDotN "{2:n0}" + "{3:n0}" + "{4:n0}" + - "{5:n1}" + + "{5:n0}" + "{6:n1}" + "{7:n1}" + + "{8:n1}" + ""; writer.WriteLine(moduleTableRow, "TOTAL", @@ -181,6 +183,7 @@ public static void ToHtml(TextWriter writer, TraceProcess stats, TraceLoadedDotN runtime.JIT.Stats().Count, runtime.JIT.Stats().TotalILSize, runtime.JIT.Stats().TotalNativeSize, + runtime.JIT.Stats().TotalAllocatedHeapSize, runtime.JIT.Stats().TotalForegroundCpuTimeMSec, runtime.JIT.Stats().TotalBackgroundMultiCoreJitCpuTimeMSec, runtime.JIT.Stats().TotalBackgroundTieredCompilationCpuTimeMSec); @@ -193,6 +196,7 @@ public static void ToHtml(TextWriter writer, TraceProcess stats, TraceLoadedDotN info.Count, info.TotalILSize, info.TotalNativeSize, + info.TotalAllocatedHeapSize, info.TotalForegroundCpuTimeMSec, info.TotalBackgroundMultiCoreJitCpuTimeMSec, info.TotalBackgroundTieredCompilationCpuTimeMSec); @@ -224,7 +228,8 @@ public static void ToHtml(TextWriter writer, TraceProcess stats, TraceLoadedDotN "Start
(msec)" + "Jit Time
(msec)" + "IL
Size" + - "Native
Size"); + "Native
Size" + + "Allocated
Heap Size"); if (showOptimizationTiers) { writer.Write("Optimization
Tier"); @@ -248,11 +253,13 @@ public static void ToHtml(TextWriter writer, TraceProcess stats, TraceLoadedDotN "{0:n3}" + "{1:n1}" + "{2:n0}" + - "{3:n0}", + "{3:n0}" + + "{4:n0}", _event.StartTimeMSec, _event.CompileCpuTimeMSec, _event.ILSize, - _event.NativeSize); + _event.NativeSize, + _event.AllocatedHeapSize); if (showOptimizationTiers) { writer.Write( @@ -377,7 +384,7 @@ public static void ToCsv(string filePath, TraceLoadedDotNetRuntime runtime) bool showOptimizationTiers = ShouldShowOptimizationTiers(runtime); using (var writer = File.CreateText(filePath)) { - writer.Write("Start MSec{0}JitTime MSec{0}ThreadID{0}IL Size{0}Native Size", listSeparator); + writer.Write("Start MSec{0}JitTime MSec{0}ThreadID{0}IL Size{0}Native Size{0}Allocated Heap Size", listSeparator); if (showOptimizationTiers) { writer.Write("{0}OptimizationTier", listSeparator); @@ -390,13 +397,14 @@ public static void ToCsv(string filePath, TraceLoadedDotNetRuntime runtime) var csvMethodName = _event.MethodName.Replace(",", " "); // Insure there are no , in the name writer.Write( - "{1:f3}{0}{2:f3}{0}{3}{0}{4}{0}{5}", + "{1:f3}{0}{2:f3}{0}{3}{0}{4}{0}{5}{0}{6}", listSeparator, _event.StartTimeMSec, _event.CompileCpuTimeMSec, _event.ThreadID, _event.ILSize, - _event.NativeSize); + _event.NativeSize, + _event.AllocatedHeapSize); if (showOptimizationTiers) { writer.Write( @@ -478,8 +486,8 @@ public static void ToXml(TextWriter writer, TraceProcess stats, TraceLoadedDotNe JITStatsEx statsEx = JITStatsEx.Create(runtime); // TODO pay attention to indent; - writer.Write(" "); - writer.WriteLine(" ", - statsEx.TotalModuleStats.Count, runtime.JIT.Stats().Count, runtime.JIT.Stats().TotalCpuTimeMSec, runtime.JIT.Stats().TotalILSize, runtime.JIT.Stats().TotalNativeSize); + writer.WriteLine(" ", + statsEx.TotalModuleStats.Count, runtime.JIT.Stats().Count, runtime.JIT.Stats().TotalCpuTimeMSec, runtime.JIT.Stats().TotalILSize, runtime.JIT.Stats().TotalNativeSize, runtime.JIT.Stats().TotalAllocatedHeapSize); // Sort the module list by Jit Time; List moduleNames = new List(statsEx.TotalModuleStats.Keys); @@ -528,6 +536,7 @@ public static void ToXml(TextWriter writer, TraceProcess stats, TraceLoadedDotNe writer.Write(" Count={0}", StringUtilities.QuotePadLeft(info.Count.ToString(), 7)); writer.Write(" ILSize={0}", StringUtilities.QuotePadLeft(info.TotalILSize.ToString(), 9)); writer.Write(" NativeSize={0}", StringUtilities.QuotePadLeft(info.TotalNativeSize.ToString(), 9)); + writer.Write(" AllocatedHeapSize={0}", StringUtilities.QuotePadLeft(info.TotalAllocatedHeapSize.ToString(), 9)); writer.Write(" Name=\"{0}\"", moduleName); writer.WriteLine("/>"); } @@ -543,6 +552,7 @@ private static void ToXml(TextWriter writer, TraceJittedMethod info, bool showOp writer.Write(" JitTimeMSec={0}", StringUtilities.QuotePadLeft(info.CompileCpuTimeMSec.ToString("n3"), 8)); writer.Write(" ILSize={0}", StringUtilities.QuotePadLeft(info.ILSize.ToString(), 10)); writer.Write(" NativeSize={0}", StringUtilities.QuotePadLeft(info.NativeSize.ToString(), 10)); + writer.Write(" AllocatedHeapSize={0}", StringUtilities.QuotePadLeft(info.AllocatedHeapSize.ToString(), 10)); if (showOptimizationTiers) { writer.Write( diff --git a/src/TraceEvent/Computers/TraceManagedProcess.cs b/src/TraceEvent/Computers/TraceManagedProcess.cs index cf7ad2378..0bce85910 100644 --- a/src/TraceEvent/Computers/TraceManagedProcess.cs +++ b/src/TraceEvent/Computers/TraceManagedProcess.cs @@ -1301,6 +1301,15 @@ internal static void SetupCallbacks(TraceEventDispatcher source) } }; + clrPrivate.LoaderHeapAllocRequest += delegate(LoaderHeapAllocRequestTraceData data) + { + var process = data.Process(); + var stats = currentManagedProcess(data); + var _method = JITStats.JitAllocComplete(stats, data); + //TODO: What to do here of _method?? + + }; + clrPrivate.ClrMulticoreJitCommon += delegate (MulticoreJitPrivateTraceData data) { var process = data.Process(); @@ -3776,6 +3785,10 @@ public class JITStats /// public long TotalNativeSize; /// + /// Total allocated heap size for all JITT'd methods + /// + public long TotalAllocatedHeapSize; + /// /// Indication if this is running on .NET 4.x+ /// [Obsolete("This is experimental, you should not use it yet for non-experimental purposes.")] @@ -3848,6 +3861,7 @@ public void AddMethodToStatistics(TraceJittedMethod method) TotalCpuTimeMSec += method.CompileCpuTimeMSec; TotalILSize += method.ILSize; TotalNativeSize += method.NativeSize; + TotalAllocatedHeapSize += method.AllocatedHeapSize; if (method.CompilationThreadKind == CompilationThreadKind.MulticoreJitBackground) { CountBackgroundMultiCoreJit++; @@ -3867,7 +3881,7 @@ public void AddMethodToStatistics(TraceJittedMethod method) #region private /// - /// Legacgy + /// Legacy /// internal static TraceJittedMethod MethodComplete(TraceLoadedDotNetRuntime stats, MethodLoadUnloadTraceDataBase data, string methodName, int rejitID, out bool createdNewMethod) { @@ -3912,6 +3926,21 @@ internal static TraceJittedMethod MethodComplete(TraceLoadedDotNetRuntime stats, return _method; } + /// + /// Handles AllocRequest event for JIT + /// + internal static TraceJittedMethod JitAllocComplete(TraceLoadedDotNetRuntime stats, LoaderHeapAllocRequestTraceData data) + { + TraceJittedMethod _method = stats.JIT.m_stats.FindIncompleteJitEventOnThread(stats, data.ThreadID); + if (_method != null) + { + _method.AllocatedHeapSize = data.RequestSize; + } + + stats.JIT.m_stats.TotalAllocatedHeapSize += data.RequestSize; + return _method; + } + /// /// Uniquely represents a method within a process. /// Used as a lookup key for data structures. @@ -4116,6 +4145,10 @@ public class TraceJittedMethod /// public int NativeSize; /// + /// Heap size allocated for JIT code of method + /// + public int AllocatedHeapSize; + /// /// Relative start time of JIT'd method /// public double StartTimeMSec; From 63959233ab8642570e1b9a4e31c448ea2de5ce9c Mon Sep 17 00:00:00 2001 From: Kunal Pathak Date: Wed, 14 Oct 2020 09:40:45 -0700 Subject: [PATCH 2/9] Accumulate allocation size at method level --- src/TraceEvent/Computers/TraceManagedProcess.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/TraceEvent/Computers/TraceManagedProcess.cs b/src/TraceEvent/Computers/TraceManagedProcess.cs index 0bce85910..3bedc803b 100644 --- a/src/TraceEvent/Computers/TraceManagedProcess.cs +++ b/src/TraceEvent/Computers/TraceManagedProcess.cs @@ -3934,10 +3934,10 @@ internal static TraceJittedMethod JitAllocComplete(TraceLoadedDotNetRuntime stat TraceJittedMethod _method = stats.JIT.m_stats.FindIncompleteJitEventOnThread(stats, data.ThreadID); if (_method != null) { - _method.AllocatedHeapSize = data.RequestSize; + _method.AllocatedHeapSize += data.RequestSize; + stats.JIT.m_stats.TotalAllocatedHeapSize += data.RequestSize; } - stats.JIT.m_stats.TotalAllocatedHeapSize += data.RequestSize; return _method; } From ef5860d199c839a016a6aa162e053feacfea862d Mon Sep 17 00:00:00 2001 From: Kunal Pathak Date: Wed, 14 Oct 2020 13:33:02 -0700 Subject: [PATCH 3/9] Rename some variables and methods --- src/PerfView/JitStats.cs | 20 +++++++++---------- .../Computers/TraceManagedProcess.cs | 19 ++++++++---------- 2 files changed, 18 insertions(+), 21 deletions(-) diff --git a/src/PerfView/JitStats.cs b/src/PerfView/JitStats.cs index 11180217c..1c3c854f0 100644 --- a/src/PerfView/JitStats.cs +++ b/src/PerfView/JitStats.cs @@ -160,7 +160,7 @@ public static void ToHtml(TextWriter writer, TraceProcess stats, TraceLoadedDotN "Num Compilations" + "IL Size" + "Native Size" + - "Allocated Heap Size" + + "LoaderHeap Allocation Size" + "" + GetLongNameForThreadClassification(CompilationThreadKind.Foreground) + "
msec" + "" + GetLongNameForThreadClassification(CompilationThreadKind.MulticoreJitBackground) + "
msec" + "" + GetLongNameForThreadClassification(CompilationThreadKind.TieredCompilationBackground) + "
msec" + @@ -183,7 +183,7 @@ public static void ToHtml(TextWriter writer, TraceProcess stats, TraceLoadedDotN runtime.JIT.Stats().Count, runtime.JIT.Stats().TotalILSize, runtime.JIT.Stats().TotalNativeSize, - runtime.JIT.Stats().TotalAllocatedHeapSize, + runtime.JIT.Stats().TotalLoaderHeapAllocSize, runtime.JIT.Stats().TotalForegroundCpuTimeMSec, runtime.JIT.Stats().TotalBackgroundMultiCoreJitCpuTimeMSec, runtime.JIT.Stats().TotalBackgroundTieredCompilationCpuTimeMSec); @@ -196,7 +196,7 @@ public static void ToHtml(TextWriter writer, TraceProcess stats, TraceLoadedDotN info.Count, info.TotalILSize, info.TotalNativeSize, - info.TotalAllocatedHeapSize, + info.TotalLoaderHeapAllocSize, info.TotalForegroundCpuTimeMSec, info.TotalBackgroundMultiCoreJitCpuTimeMSec, info.TotalBackgroundTieredCompilationCpuTimeMSec); @@ -259,7 +259,7 @@ public static void ToHtml(TextWriter writer, TraceProcess stats, TraceLoadedDotN _event.CompileCpuTimeMSec, _event.ILSize, _event.NativeSize, - _event.AllocatedHeapSize); + _event.LoaderHeapAllocSize); if (showOptimizationTiers) { writer.Write( @@ -384,7 +384,7 @@ public static void ToCsv(string filePath, TraceLoadedDotNetRuntime runtime) bool showOptimizationTiers = ShouldShowOptimizationTiers(runtime); using (var writer = File.CreateText(filePath)) { - writer.Write("Start MSec{0}JitTime MSec{0}ThreadID{0}IL Size{0}Native Size{0}Allocated Heap Size", listSeparator); + writer.Write("Start MSec{0}JitTime MSec{0}ThreadID{0}IL Size{0}Native Size{0}LoaderHeap Allocation Size", listSeparator); if (showOptimizationTiers) { writer.Write("{0}OptimizationTier", listSeparator); @@ -404,7 +404,7 @@ public static void ToCsv(string filePath, TraceLoadedDotNetRuntime runtime) _event.ThreadID, _event.ILSize, _event.NativeSize, - _event.AllocatedHeapSize); + _event.LoaderHeapAllocSize); if (showOptimizationTiers) { writer.Write( @@ -487,7 +487,7 @@ public static void ToXml(TextWriter writer, TraceProcess stats, TraceLoadedDotNe // TODO pay attention to indent; writer.Write(" "); writer.WriteLine(" ", - statsEx.TotalModuleStats.Count, runtime.JIT.Stats().Count, runtime.JIT.Stats().TotalCpuTimeMSec, runtime.JIT.Stats().TotalILSize, runtime.JIT.Stats().TotalNativeSize, runtime.JIT.Stats().TotalAllocatedHeapSize); + statsEx.TotalModuleStats.Count, runtime.JIT.Stats().Count, runtime.JIT.Stats().TotalCpuTimeMSec, runtime.JIT.Stats().TotalILSize, runtime.JIT.Stats().TotalNativeSize, runtime.JIT.Stats().TotalLoaderHeapAllocSize); // Sort the module list by Jit Time; List moduleNames = new List(statsEx.TotalModuleStats.Keys); @@ -536,7 +536,7 @@ public static void ToXml(TextWriter writer, TraceProcess stats, TraceLoadedDotNe writer.Write(" Count={0}", StringUtilities.QuotePadLeft(info.Count.ToString(), 7)); writer.Write(" ILSize={0}", StringUtilities.QuotePadLeft(info.TotalILSize.ToString(), 9)); writer.Write(" NativeSize={0}", StringUtilities.QuotePadLeft(info.TotalNativeSize.ToString(), 9)); - writer.Write(" AllocatedHeapSize={0}", StringUtilities.QuotePadLeft(info.TotalAllocatedHeapSize.ToString(), 9)); + writer.Write(" AllocatedHeapSize={0}", StringUtilities.QuotePadLeft(info.TotalLoaderHeapAllocSize.ToString(), 9)); writer.Write(" Name=\"{0}\"", moduleName); writer.WriteLine("/>"); } @@ -552,7 +552,7 @@ private static void ToXml(TextWriter writer, TraceJittedMethod info, bool showOp writer.Write(" JitTimeMSec={0}", StringUtilities.QuotePadLeft(info.CompileCpuTimeMSec.ToString("n3"), 8)); writer.Write(" ILSize={0}", StringUtilities.QuotePadLeft(info.ILSize.ToString(), 10)); writer.Write(" NativeSize={0}", StringUtilities.QuotePadLeft(info.NativeSize.ToString(), 10)); - writer.Write(" AllocatedHeapSize={0}", StringUtilities.QuotePadLeft(info.AllocatedHeapSize.ToString(), 10)); + writer.Write(" AllocatedHeapSize={0}", StringUtilities.QuotePadLeft(info.LoaderHeapAllocSize.ToString(), 10)); if (showOptimizationTiers) { writer.Write( diff --git a/src/TraceEvent/Computers/TraceManagedProcess.cs b/src/TraceEvent/Computers/TraceManagedProcess.cs index 3bedc803b..9cfbccd2f 100644 --- a/src/TraceEvent/Computers/TraceManagedProcess.cs +++ b/src/TraceEvent/Computers/TraceManagedProcess.cs @@ -1305,9 +1305,7 @@ internal static void SetupCallbacks(TraceEventDispatcher source) { var process = data.Process(); var stats = currentManagedProcess(data); - var _method = JITStats.JitAllocComplete(stats, data); - //TODO: What to do here of _method?? - + JITStats.LogJitMethodAllocation(stats, data); }; clrPrivate.ClrMulticoreJitCommon += delegate (MulticoreJitPrivateTraceData data) @@ -3787,7 +3785,7 @@ public class JITStats /// /// Total allocated heap size for all JITT'd methods /// - public long TotalAllocatedHeapSize; + public long TotalLoaderHeapAllocSize; /// /// Indication if this is running on .NET 4.x+ /// @@ -3861,7 +3859,7 @@ public void AddMethodToStatistics(TraceJittedMethod method) TotalCpuTimeMSec += method.CompileCpuTimeMSec; TotalILSize += method.ILSize; TotalNativeSize += method.NativeSize; - TotalAllocatedHeapSize += method.AllocatedHeapSize; + TotalLoaderHeapAllocSize += method.LoaderHeapAllocSize; if (method.CompilationThreadKind == CompilationThreadKind.MulticoreJitBackground) { CountBackgroundMultiCoreJit++; @@ -3905,6 +3903,7 @@ internal static TraceJittedMethod MethodComplete(TraceLoadedDotNetRuntime stats, } } _method.NativeSize = data.MethodSize; + Console.WriteLine("MethodName= {0}, Size= {1}", methodName, data.MethodSize); _method.CompileCpuTimeMSec = data.TimeStampRelativeMSec - _method.StartTimeMSec; _method.SetOptimizationTier(data.OptimizationTier, stats); _method.VersionID = rejitID; @@ -3929,16 +3928,14 @@ internal static TraceJittedMethod MethodComplete(TraceLoadedDotNetRuntime stats, /// /// Handles AllocRequest event for JIT /// - internal static TraceJittedMethod JitAllocComplete(TraceLoadedDotNetRuntime stats, LoaderHeapAllocRequestTraceData data) + internal static void LogJitMethodAllocation(TraceLoadedDotNetRuntime stats, LoaderHeapAllocRequestTraceData data) { TraceJittedMethod _method = stats.JIT.m_stats.FindIncompleteJitEventOnThread(stats, data.ThreadID); if (_method != null) { - _method.AllocatedHeapSize += data.RequestSize; - stats.JIT.m_stats.TotalAllocatedHeapSize += data.RequestSize; + _method.LoaderHeapAllocSize += data.RequestSize; + stats.JIT.m_stats.TotalLoaderHeapAllocSize += data.RequestSize; } - - return _method; } /// @@ -4147,7 +4144,7 @@ public class TraceJittedMethod /// /// Heap size allocated for JIT code of method /// - public int AllocatedHeapSize; + public int LoaderHeapAllocSize; /// /// Relative start time of JIT'd method /// From eabad25120c9960fe045629752697d0e379d5cce Mon Sep 17 00:00:00 2001 From: Kunal Pathak Date: Wed, 14 Oct 2020 13:33:49 -0700 Subject: [PATCH 4/9] Display N/A if LoaderHeap event is not enabled --- src/PerfView/JitStats.cs | 22 +++++++++---------- .../Computers/TraceManagedProcess.cs | 11 ++++++++++ 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/src/PerfView/JitStats.cs b/src/PerfView/JitStats.cs index 1c3c854f0..786ebcd29 100644 --- a/src/PerfView/JitStats.cs +++ b/src/PerfView/JitStats.cs @@ -160,7 +160,7 @@ public static void ToHtml(TextWriter writer, TraceProcess stats, TraceLoadedDotN "Num Compilations" + "IL Size" + "Native Size" + - "LoaderHeap Allocation Size" + + "LoaderHeap Allocation Size" + "" + GetLongNameForThreadClassification(CompilationThreadKind.Foreground) + "
msec" + "" + GetLongNameForThreadClassification(CompilationThreadKind.MulticoreJitBackground) + "
msec" + "" + GetLongNameForThreadClassification(CompilationThreadKind.TieredCompilationBackground) + "
msec" + @@ -183,7 +183,7 @@ public static void ToHtml(TextWriter writer, TraceProcess stats, TraceLoadedDotN runtime.JIT.Stats().Count, runtime.JIT.Stats().TotalILSize, runtime.JIT.Stats().TotalNativeSize, - runtime.JIT.Stats().TotalLoaderHeapAllocSize, + runtime.JIT.Stats().TotalLoaderHeapAllocSizeIfAvailable, runtime.JIT.Stats().TotalForegroundCpuTimeMSec, runtime.JIT.Stats().TotalBackgroundMultiCoreJitCpuTimeMSec, runtime.JIT.Stats().TotalBackgroundTieredCompilationCpuTimeMSec); @@ -196,7 +196,7 @@ public static void ToHtml(TextWriter writer, TraceProcess stats, TraceLoadedDotN info.Count, info.TotalILSize, info.TotalNativeSize, - info.TotalLoaderHeapAllocSize, + info.TotalLoaderHeapAllocSizeIfAvailable, info.TotalForegroundCpuTimeMSec, info.TotalBackgroundMultiCoreJitCpuTimeMSec, info.TotalBackgroundTieredCompilationCpuTimeMSec); @@ -259,7 +259,7 @@ public static void ToHtml(TextWriter writer, TraceProcess stats, TraceLoadedDotN _event.CompileCpuTimeMSec, _event.ILSize, _event.NativeSize, - _event.LoaderHeapAllocSize); + _event.LoaderHeapAllocSizeIfAvailable); if (showOptimizationTiers) { writer.Write( @@ -404,7 +404,7 @@ public static void ToCsv(string filePath, TraceLoadedDotNetRuntime runtime) _event.ThreadID, _event.ILSize, _event.NativeSize, - _event.LoaderHeapAllocSize); + _event.LoaderHeapAllocSizeIfAvailable); if (showOptimizationTiers) { writer.Write( @@ -486,8 +486,8 @@ public static void ToXml(TextWriter writer, TraceProcess stats, TraceLoadedDotNe JITStatsEx statsEx = JITStatsEx.Create(runtime); // TODO pay attention to indent; - writer.Write(" "); - writer.WriteLine(" ", - statsEx.TotalModuleStats.Count, runtime.JIT.Stats().Count, runtime.JIT.Stats().TotalCpuTimeMSec, runtime.JIT.Stats().TotalILSize, runtime.JIT.Stats().TotalNativeSize, runtime.JIT.Stats().TotalLoaderHeapAllocSize); + writer.WriteLine(" ", + statsEx.TotalModuleStats.Count, runtime.JIT.Stats().Count, runtime.JIT.Stats().TotalCpuTimeMSec, runtime.JIT.Stats().TotalILSize, runtime.JIT.Stats().TotalNativeSize, runtime.JIT.Stats().TotalLoaderHeapAllocSizeIfAvailable); // Sort the module list by Jit Time; List moduleNames = new List(statsEx.TotalModuleStats.Keys); @@ -536,7 +536,7 @@ public static void ToXml(TextWriter writer, TraceProcess stats, TraceLoadedDotNe writer.Write(" Count={0}", StringUtilities.QuotePadLeft(info.Count.ToString(), 7)); writer.Write(" ILSize={0}", StringUtilities.QuotePadLeft(info.TotalILSize.ToString(), 9)); writer.Write(" NativeSize={0}", StringUtilities.QuotePadLeft(info.TotalNativeSize.ToString(), 9)); - writer.Write(" AllocatedHeapSize={0}", StringUtilities.QuotePadLeft(info.TotalLoaderHeapAllocSize.ToString(), 9)); + writer.Write(" LoaderHeapAllocSize={0}", StringUtilities.QuotePadLeft(info.TotalLoaderHeapAllocSizeIfAvailable, 9)); writer.Write(" Name=\"{0}\"", moduleName); writer.WriteLine("/>"); } @@ -552,7 +552,7 @@ private static void ToXml(TextWriter writer, TraceJittedMethod info, bool showOp writer.Write(" JitTimeMSec={0}", StringUtilities.QuotePadLeft(info.CompileCpuTimeMSec.ToString("n3"), 8)); writer.Write(" ILSize={0}", StringUtilities.QuotePadLeft(info.ILSize.ToString(), 10)); writer.Write(" NativeSize={0}", StringUtilities.QuotePadLeft(info.NativeSize.ToString(), 10)); - writer.Write(" AllocatedHeapSize={0}", StringUtilities.QuotePadLeft(info.LoaderHeapAllocSize.ToString(), 10)); + writer.Write(" LoaderHeapAllocSize={0}", StringUtilities.QuotePadLeft(info.LoaderHeapAllocSizeIfAvailable, 10)); if (showOptimizationTiers) { writer.Write( diff --git a/src/TraceEvent/Computers/TraceManagedProcess.cs b/src/TraceEvent/Computers/TraceManagedProcess.cs index 9cfbccd2f..1461b1489 100644 --- a/src/TraceEvent/Computers/TraceManagedProcess.cs +++ b/src/TraceEvent/Computers/TraceManagedProcess.cs @@ -3849,6 +3849,8 @@ public class JITStats ///
public HashSet SymbolsMissing = new HashSet(); + public string TotalLoaderHeapAllocSizeIfAvailable => TotalLoaderHeapAllocSize > 0 ? TotalLoaderHeapAllocSize.ToString() : "N/A"; + /// /// Aggregate a method to be included in the statistics /// @@ -3933,6 +3935,7 @@ internal static void LogJitMethodAllocation(TraceLoadedDotNetRuntime stats, Load TraceJittedMethod _method = stats.JIT.m_stats.FindIncompleteJitEventOnThread(stats, data.ThreadID); if (_method != null) { + _method.IsLoaderHeapAllocSizePresent = true; _method.LoaderHeapAllocSize += data.RequestSize; stats.JIT.m_stats.TotalLoaderHeapAllocSize += data.RequestSize; } @@ -4231,6 +4234,14 @@ public string BlockedReason public bool IsDefaultVersion { get { return VersionID == 0; } } + internal bool IsLoaderHeapAllocSizePresent + { + get; + set; + } + + public string LoaderHeapAllocSizeIfAvailable => IsLoaderHeapAllocSizePresent ? LoaderHeapAllocSize.ToString() : "N/A"; + #region private internal void SetOptimizationTier(OptimizationTier optimizationTier, TraceLoadedDotNetRuntime stats) { From 9b7924f1c9a084862e651ed9466caf86ff7352fb Mon Sep 17 00:00:00 2001 From: Kunal Pathak Date: Tue, 27 Oct 2020 00:12:11 -0700 Subject: [PATCH 5/9] Add parsing logic for new event --- src/PerfView/JitStats.cs | 127 ++++++++++++++---- .../Computers/TraceManagedProcess.cs | 61 ++++++--- src/TraceEvent/Parsers/ClrTraceEventParser.cs | 106 ++++++++++++++- 3 files changed, 253 insertions(+), 41 deletions(-) diff --git a/src/PerfView/JitStats.cs b/src/PerfView/JitStats.cs index 786ebcd29..737d241fe 100644 --- a/src/PerfView/JitStats.cs +++ b/src/PerfView/JitStats.cs @@ -160,11 +160,18 @@ public static void ToHtml(TextWriter writer, TraceProcess stats, TraceLoadedDotN "Num Compilations" + "IL Size" + "Native Size" + - "LoaderHeap Allocation Size" + "" + GetLongNameForThreadClassification(CompilationThreadKind.Foreground) + "
msec" + "" + GetLongNameForThreadClassification(CompilationThreadKind.MulticoreJitBackground) + "
msec" + - "" + GetLongNameForThreadClassification(CompilationThreadKind.TieredCompilationBackground) + "
msec" + - ""); + "" + GetLongNameForThreadClassification(CompilationThreadKind.TieredCompilationBackground) + "
msec"); + + if (runtime.JIT.Stats().IsJitAllocSizePresent) + { + writer.WriteLine("Allocation Size for Hotcode"); + writer.WriteLine("Allocation Size for ROData"); + writer.WriteLine("Allocated size"); + } + + writer.WriteLine(""); string moduleTableRow = "" + "{0}" + @@ -172,34 +179,60 @@ public static void ToHtml(TextWriter writer, TraceProcess stats, TraceLoadedDotN "{2:n0}" + "{3:n0}" + "{4:n0}" + - "{5:n0}" + + "{5:n1}" + "{6:n1}" + "{7:n1}" + - "{8:n1}" + ""; - writer.WriteLine(moduleTableRow, + + writer.Write(moduleTableRow, "TOTAL", runtime.JIT.Stats().TotalCpuTimeMSec, runtime.JIT.Stats().Count, runtime.JIT.Stats().TotalILSize, runtime.JIT.Stats().TotalNativeSize, - runtime.JIT.Stats().TotalLoaderHeapAllocSizeIfAvailable, runtime.JIT.Stats().TotalForegroundCpuTimeMSec, runtime.JIT.Stats().TotalBackgroundMultiCoreJitCpuTimeMSec, runtime.JIT.Stats().TotalBackgroundTieredCompilationCpuTimeMSec); + + string allocSizeColumns = ""; + if (runtime.JIT.Stats().IsJitAllocSizePresent) + { + allocSizeColumns += + "{0:n0}" + + "{1:n0}" + + "{2:n0}" + + "N/A"; //TODO: See if this is needed. + + writer.Write(allocSizeColumns, + runtime.JIT.Stats().TotalHotCodeAllocSize, + runtime.JIT.Stats().TotalRODataAllocSize, + runtime.JIT.Stats().TotalAllocSizeForJitCode); + } + writer.WriteLine(); + foreach (string moduleName in moduleNames) { JITStats info = statsEx.TotalModuleStats[moduleName]; - writer.WriteLine(moduleTableRow, + writer.Write(moduleTableRow, moduleName.Length == 0 ? "<UNKNOWN>" : moduleName, info.TotalCpuTimeMSec, info.Count, info.TotalILSize, info.TotalNativeSize, - info.TotalLoaderHeapAllocSizeIfAvailable, info.TotalForegroundCpuTimeMSec, info.TotalBackgroundMultiCoreJitCpuTimeMSec, info.TotalBackgroundTieredCompilationCpuTimeMSec); + + if (runtime.JIT.Stats().IsJitAllocSizePresent) + { + writer.Write(allocSizeColumns, + info.TotalHotCodeAllocSize, + info.TotalRODataAllocSize, + info.TotalAllocSizeForJitCode); + } + + writer.WriteLine(); + } writer.WriteLine(""); writer.WriteLine(""); @@ -228,8 +261,18 @@ public static void ToHtml(TextWriter writer, TraceProcess stats, TraceLoadedDotN "Start
(msec)" + "Jit Time
(msec)" + "IL
Size" + - "Native
Size" + - "Allocated
Heap Size"); + "Native
Size"); + + if (runtime.JIT.Stats().IsJitAllocSizePresent) + { + writer.Write( + "HotCode
Size" + + "RO data
Size" + + "Allocated
Heap Size" + + "JIT Allocation
Flag" + ); + } + if (showOptimizationTiers) { writer.Write("Optimization
Tier"); @@ -253,13 +296,26 @@ public static void ToHtml(TextWriter writer, TraceProcess stats, TraceLoadedDotN "{0:n3}" + "{1:n1}" + "{2:n0}" + - "{3:n0}" + - "{4:n0}", + "{3:n0}", _event.StartTimeMSec, _event.CompileCpuTimeMSec, _event.ILSize, - _event.NativeSize, - _event.LoaderHeapAllocSizeIfAvailable); + _event.NativeSize); + + if (_event.IsJitAllocSizePresent) + { + writer.Write( + "{0:n0}", + "{1:n0}", + "{2:n0}", + "{3:n0}", + _event.HotCodeAllocSize, + _event.RODataAllocSize, + _event.RequestedAllocSizeForJitCode, + _event.JitAllocFlag + ); + } + if (showOptimizationTiers) { writer.Write( @@ -397,14 +453,24 @@ public static void ToCsv(string filePath, TraceLoadedDotNetRuntime runtime) var csvMethodName = _event.MethodName.Replace(",", " "); // Insure there are no , in the name writer.Write( - "{1:f3}{0}{2:f3}{0}{3}{0}{4}{0}{5}{0}{6}", + "{1:f3}{0}{2:f3}{0}{3}{0}{4}{0}{5}", listSeparator, _event.StartTimeMSec, _event.CompileCpuTimeMSec, _event.ThreadID, _event.ILSize, - _event.NativeSize, - _event.LoaderHeapAllocSizeIfAvailable); + _event.NativeSize); + + if (_event.IsJitAllocSizePresent) + { + writer.Write("{1}{0}{2}{0}{3}{0}{4}", + listSeparator, + _event.HotCodeAllocSize, + _event.RODataAllocSize, + _event.RequestedAllocSizeForJitCode, + _event.JitAllocFlag); + } + if (showOptimizationTiers) { writer.Write( @@ -486,8 +552,8 @@ public static void ToXml(TextWriter writer, TraceProcess stats, TraceLoadedDotNe JITStatsEx statsEx = JITStatsEx.Create(runtime); // TODO pay attention to indent; - writer.Write(" "); - writer.WriteLine(" ", - statsEx.TotalModuleStats.Count, runtime.JIT.Stats().Count, runtime.JIT.Stats().TotalCpuTimeMSec, runtime.JIT.Stats().TotalILSize, runtime.JIT.Stats().TotalNativeSize, runtime.JIT.Stats().TotalLoaderHeapAllocSizeIfAvailable); + writer.WriteLine(" moduleNames = new List(statsEx.TotalModuleStats.Keys); @@ -536,7 +602,13 @@ public static void ToXml(TextWriter writer, TraceProcess stats, TraceLoadedDotNe writer.Write(" Count={0}", StringUtilities.QuotePadLeft(info.Count.ToString(), 7)); writer.Write(" ILSize={0}", StringUtilities.QuotePadLeft(info.TotalILSize.ToString(), 9)); writer.Write(" NativeSize={0}", StringUtilities.QuotePadLeft(info.TotalNativeSize.ToString(), 9)); - writer.Write(" LoaderHeapAllocSize={0}", StringUtilities.QuotePadLeft(info.TotalLoaderHeapAllocSizeIfAvailable, 9)); + + if (info.IsJitAllocSizePresent) + { + writer.Write(" HotCodeAllocSize={0}", StringUtilities.QuotePadLeft(info.TotalHotCodeAllocSize.ToString(), 9)); + writer.Write(" RODataAllocSize={0}", StringUtilities.QuotePadLeft(info.TotalRODataAllocSize.ToString(), 9)); + writer.Write(" RequestedAllocSizeForJitCode={0}", StringUtilities.QuotePadLeft(info.TotalAllocSizeForJitCode.ToString(), 9)); + } writer.Write(" Name=\"{0}\"", moduleName); writer.WriteLine("/>"); } @@ -552,7 +624,14 @@ private static void ToXml(TextWriter writer, TraceJittedMethod info, bool showOp writer.Write(" JitTimeMSec={0}", StringUtilities.QuotePadLeft(info.CompileCpuTimeMSec.ToString("n3"), 8)); writer.Write(" ILSize={0}", StringUtilities.QuotePadLeft(info.ILSize.ToString(), 10)); writer.Write(" NativeSize={0}", StringUtilities.QuotePadLeft(info.NativeSize.ToString(), 10)); - writer.Write(" LoaderHeapAllocSize={0}", StringUtilities.QuotePadLeft(info.LoaderHeapAllocSizeIfAvailable, 10)); + + if (info.IsJitAllocSizePresent) + { + writer.Write(" HotCodeAllocSize={0}", StringUtilities.QuotePadLeft(info.HotCodeAllocSize.ToString(), 10)); + writer.Write(" RODataAllocSize={0}", StringUtilities.QuotePadLeft(info.RODataAllocSize.ToString(), 10)); + writer.Write(" RequestedAllocSizeForJitCode={0}", StringUtilities.QuotePadLeft(info.RequestedAllocSizeForJitCode.ToString(), 10)); + writer.Write(" JitAllocFlag={0}", StringUtilities.QuotePadLeft(info.JitAllocFlag.ToString(), 10)); + } if (showOptimizationTiers) { writer.Write( diff --git a/src/TraceEvent/Computers/TraceManagedProcess.cs b/src/TraceEvent/Computers/TraceManagedProcess.cs index 1461b1489..d303e8e14 100644 --- a/src/TraceEvent/Computers/TraceManagedProcess.cs +++ b/src/TraceEvent/Computers/TraceManagedProcess.cs @@ -1301,7 +1301,7 @@ internal static void SetupCallbacks(TraceEventDispatcher source) } }; - clrPrivate.LoaderHeapAllocRequest += delegate(LoaderHeapAllocRequestTraceData data) + source.Clr.MethodMemoryAllocatedForJitCode += delegate(MethodJitMemoryAllocatedForCodeTraceData data) { var process = data.Process(); var stats = currentManagedProcess(data); @@ -3783,9 +3783,21 @@ public class JITStats /// public long TotalNativeSize; /// - /// Total allocated heap size for all JITT'd methods + /// Total hot code size allocated for all JITT'd methods /// - public long TotalLoaderHeapAllocSize; + public long TotalHotCodeAllocSize; + /// + /// Total read-only data size allocated for all JITT'd methods + /// + public long TotalRODataAllocSize; + /// + /// Total size allocated for all JITT'd methods + /// + public long TotalAllocSizeForJitCode; + /// + /// If data from alloc size for JIT event present + /// + public bool IsJitAllocSizePresent = false; /// /// Indication if this is running on .NET 4.x+ /// @@ -3849,8 +3861,6 @@ public class JITStats /// public HashSet SymbolsMissing = new HashSet(); - public string TotalLoaderHeapAllocSizeIfAvailable => TotalLoaderHeapAllocSize > 0 ? TotalLoaderHeapAllocSize.ToString() : "N/A"; - /// /// Aggregate a method to be included in the statistics /// @@ -3861,7 +3871,9 @@ public void AddMethodToStatistics(TraceJittedMethod method) TotalCpuTimeMSec += method.CompileCpuTimeMSec; TotalILSize += method.ILSize; TotalNativeSize += method.NativeSize; - TotalLoaderHeapAllocSize += method.LoaderHeapAllocSize; + TotalHotCodeAllocSize += method.HotCodeAllocSize; + TotalRODataAllocSize += method.RODataAllocSize; + TotalAllocSizeForJitCode += method.RequestedAllocSizeForJitCode; if (method.CompilationThreadKind == CompilationThreadKind.MulticoreJitBackground) { CountBackgroundMultiCoreJit++; @@ -3930,14 +3942,23 @@ internal static TraceJittedMethod MethodComplete(TraceLoadedDotNetRuntime stats, /// /// Handles AllocRequest event for JIT /// - internal static void LogJitMethodAllocation(TraceLoadedDotNetRuntime stats, LoaderHeapAllocRequestTraceData data) + internal static void LogJitMethodAllocation(TraceLoadedDotNetRuntime stats, MethodJitMemoryAllocatedForCodeTraceData data) { TraceJittedMethod _method = stats.JIT.m_stats.FindIncompleteJitEventOnThread(stats, data.ThreadID); if (_method != null) { - _method.IsLoaderHeapAllocSizePresent = true; - _method.LoaderHeapAllocSize += data.RequestSize; - stats.JIT.m_stats.TotalLoaderHeapAllocSize += data.RequestSize; + Debug.Assert(_method.HotCodeAllocSize == 0); + + _method.IsJitAllocSizePresent = true; + _method.HotCodeAllocSize = data.HotCodeSize; + _method.RODataAllocSize = data.RODataSize; + _method.RequestedAllocSizeForJitCode = data.TotalRequestSize; + _method.JitAllocFlag = data.CorJitAllocMemFlag; + + stats.JIT.m_stats.IsJitAllocSizePresent = true; + stats.JIT.m_stats.TotalHotCodeAllocSize += data.HotCodeSize; + stats.JIT.m_stats.TotalRODataAllocSize += data.RODataSize; + stats.JIT.m_stats.TotalAllocSizeForJitCode += data.TotalRequestSize; } } @@ -4145,9 +4166,21 @@ public class TraceJittedMethod /// public int NativeSize; /// - /// Heap size allocated for JIT code of method + /// Hot code size allocated for JIT code of method + /// + public long HotCodeAllocSize; + /// + /// Read-only data size allocated for JIT code of method + /// + public long RODataAllocSize; + /// + /// Total size allocated for JIT code of method + /// + public long RequestedAllocSizeForJitCode; + /// + /// Jit allocation flag /// - public int LoaderHeapAllocSize; + public int JitAllocFlag; /// /// Relative start time of JIT'd method /// @@ -4234,14 +4267,12 @@ public string BlockedReason public bool IsDefaultVersion { get { return VersionID == 0; } } - internal bool IsLoaderHeapAllocSizePresent + public bool IsJitAllocSizePresent { get; set; } - public string LoaderHeapAllocSizeIfAvailable => IsLoaderHeapAllocSizePresent ? LoaderHeapAllocSize.ToString() : "N/A"; - #region private internal void SetOptimizationTier(OptimizationTier optimizationTier, TraceLoadedDotNetRuntime stats) { diff --git a/src/TraceEvent/Parsers/ClrTraceEventParser.cs b/src/TraceEvent/Parsers/ClrTraceEventParser.cs index 44c2e72cd..26457bc9c 100644 --- a/src/TraceEvent/Parsers/ClrTraceEventParser.cs +++ b/src/TraceEvent/Parsers/ClrTraceEventParser.cs @@ -1510,7 +1510,17 @@ public event Action MethodUnloadVerbose source.UnregisterEventTemplate(value, 38, MethodTaskGuid); } } - + public event Action MethodMemoryAllocatedForJitCode + { + add + { + RegisterTemplate(new MethodJitMemoryAllocatedForCodeTraceData(value, 146, 9, "Method", MethodTaskGuid, 103, "MemoryAllocatedForJitCode", ProviderGuid, ProviderName)); + } + remove + { + source.UnregisterEventTemplate(value, 146, MethodTaskGuid); + } + } public event Action MethodR2RGetEntryPoint { add @@ -1983,7 +1993,10 @@ static private TieredCompilationBackgroundJitStopTraceData TieredCompilationBack { // action, eventid, taskid, taskName, taskGuid, opcode, opcodeName, providerGuid, providerName return new TieredCompilationBackgroundJitStopTraceData(action, 284, 31, "TieredCompilation", TieredCompilationTaskGuid, 2, "BackgroundJitStop", ProviderGuid, ProviderName); } - + static private MethodJitMemoryAllocatedForCodeTraceData MethodMemoryAllocatedForJitCodeTemplate(Action action) + { // action, eventid, taskid, taskName, taskGuid, opcode, opcodeName, providerGuid, providerName + return new MethodJitMemoryAllocatedForCodeTraceData(action, 146, 9, "Method", Guid.Empty, 103, "MemoryAllocatedForJitCode", ProviderGuid, ProviderName); + } static private R2RGetEntryPointStartTraceData R2RGetEntryPointStartTemplate(Action action) { // action, eventid, taskid, taskName, taskGuid, opcode, opcodeName, providerGuid, providerName return new R2RGetEntryPointStartTraceData(action, 160, 9, "Method", MethodTaskGuid, 33, "R2RGetEntryPointStart", ProviderGuid, ProviderName); @@ -8792,6 +8805,95 @@ public override object PayloadValue(int index) #endregion } + public sealed class MethodJitMemoryAllocatedForCodeTraceData : TraceEvent + { + public string MethodBeingCompiledNamespace { get { return GetUnicodeStringAt(0); } } + public string MethodBeingCompiledName { get { return GetUnicodeStringAt(SkipUnicodeString(0)); } } + public string MethodBeingCompiledNameSignature { get { return GetUnicodeStringAt(SkipUnicodeString(SkipUnicodeString(0))); } } + public long HotCodeSize { get { return GetInt64At(SkipUnicodeString(SkipUnicodeString(SkipUnicodeString(0)))); } } + public long RODataSize { get { return GetInt64At(SkipUnicodeString(SkipUnicodeString(SkipUnicodeString(0))) + 8); } } + public long TotalRequestSize { get { return GetInt64At(SkipUnicodeString(SkipUnicodeString(SkipUnicodeString(0))) + 16); } } + public int CorJitAllocMemFlag { get { return GetInt32At(SkipUnicodeString(SkipUnicodeString(SkipUnicodeString(0))) + 24); } } + public int ClrInstanceID { get { return GetInt16At(SkipUnicodeString(SkipUnicodeString(SkipUnicodeString(0))) + 28); } } + + #region Private + internal MethodJitMemoryAllocatedForCodeTraceData(Action action, int eventID, int task, string taskName, Guid taskGuid, int opcode, string opcodeName, Guid providerGuid, string providerName) + : base(eventID, task, taskName, taskGuid, opcode, opcodeName, providerGuid, providerName) + { + Action = action; + } + protected internal override void Dispatch() + { + Action(this); + } + protected internal override void Validate() + { + Debug.Assert(!(Version == 0 && EventDataLength != SkipUnicodeString(SkipUnicodeString(SkipUnicodeString(0))) + 30)); + Debug.Assert(!(Version > 0 && EventDataLength < SkipUnicodeString(SkipUnicodeString(SkipUnicodeString(0))) + 30)); + } + protected internal override Delegate Target + { + get { return Action; } + set { Action = (Action)value; } + } + public override StringBuilder ToXml(StringBuilder sb) + { + Prefix(sb); + XmlAttrib(sb, "MethodBeingCompiledNamespace", MethodBeingCompiledNamespace); + XmlAttrib(sb, "MethodBeingCompiledName", MethodBeingCompiledName); + XmlAttrib(sb, "MethodBeingCompiledNameSignature", MethodBeingCompiledNameSignature); + XmlAttrib(sb, "HotCodeSize", HotCodeSize); + XmlAttrib(sb, "RODataSize", RODataSize); + XmlAttrib(sb, "TotalRequestSize", TotalRequestSize); + XmlAttrib(sb, "CorJitAllocMemFlag", CorJitAllocMemFlag); + XmlAttrib(sb, "ClrInstanceID", ClrInstanceID); + sb.Append("/>"); + return sb; + } + + public override string[] PayloadNames + { + get + { + if (payloadNames == null) + payloadNames = new string[] { "MethodBeingCompiledNamespace", "MethodBeingCompiledName", "MethodBeingCompiledNameSignature", "HotCodeSize", "RODataSize", "TotalRequestSize", "CorJitAllocMemFlag", "ClrInstanceID" }; + return payloadNames; + } + } + + public override object PayloadValue(int index) + { + switch (index) + { + case 0: + return MethodBeingCompiledNamespace; + case 1: + return MethodBeingCompiledName; + case 2: + return MethodBeingCompiledNameSignature; + case 3: + return HotCodeSize; + case 4: + return RODataSize; + case 5: + return TotalRequestSize; + case 6: + return CorJitAllocMemFlag; + case 7: + return ClrInstanceID; + default: + Debug.Assert(false, "Bad field index"); + return null; + } + } + + public static ulong GetKeywords() { return 16; } + public static string GetProviderName() { return "Microsoft-Windows-DotNETRuntime"; } + public static Guid GetProviderGuid() { return new Guid("e13c0d23-ccbc-4e12-931b-d9cc2eee27e4"); } + private event Action Action; + #endregion + } + public sealed class TypeLoadStartTraceData : TraceEvent { public int TypeLoadStartID { get { return GetInt32At(0); } } From 5072c71273228aa5e64642edd4a704d21cfd281e Mon Sep 17 00:00:00 2001 From: Kunal Pathak Date: Thu, 29 Oct 2020 10:19:39 -0700 Subject: [PATCH 6/9] Working version --- src/PerfView/JitStats.cs | 30 ++++++++++--------- src/TraceEvent/Parsers/ClrTraceEventParser.cs | 3 +- 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/src/PerfView/JitStats.cs b/src/PerfView/JitStats.cs index 737d241fe..3e36b490c 100644 --- a/src/PerfView/JitStats.cs +++ b/src/PerfView/JitStats.cs @@ -154,7 +154,7 @@ public static void ToHtml(TextWriter writer, TraceProcess stats, TraceLoadedDotN writer.WriteLine("
  • Summary of jitting time by module:

    "); writer.WriteLine("
    "); writer.WriteLine(""); - writer.WriteLine("" + + writer.Write("" + "" + "" + "" + @@ -166,9 +166,9 @@ public static void ToHtml(TextWriter writer, TraceProcess stats, TraceLoadedDotN if (runtime.JIT.Stats().IsJitAllocSizePresent) { - writer.WriteLine(""); - writer.WriteLine(""); - writer.WriteLine(""); + writer.Write(""); + writer.Write(""); + writer.Write(""); } writer.WriteLine(""); @@ -181,8 +181,7 @@ public static void ToHtml(TextWriter writer, TraceProcess stats, TraceLoadedDotN "" + "" + "" + - "" + - ""; + ""; writer.Write(moduleTableRow, "TOTAL", @@ -200,8 +199,7 @@ public static void ToHtml(TextWriter writer, TraceProcess stats, TraceLoadedDotN allocSizeColumns += "" + "" + - "" + - ""; //TODO: See if this is needed. + ""; writer.Write(allocSizeColumns, runtime.JIT.Stats().TotalHotCodeAllocSize, @@ -231,7 +229,7 @@ public static void ToHtml(TextWriter writer, TraceProcess stats, TraceLoadedDotN info.TotalAllocSizeForJitCode); } - writer.WriteLine(); + writer.WriteLine(""); } writer.WriteLine("
    NameJitTime
    msec
    Num CompilationsAllocation Size for HotcodeAllocation Size for RODataAllocated sizeAllocation Size for HotcodeAllocation Size for RODataAllocated size
    {4:n0}{5:n1}{6:n1}{7:n1}
    {7:n1}{0:n0}{1:n0}{2:n0}N/A{2:n0}
    "); @@ -305,10 +303,10 @@ public static void ToHtml(TextWriter writer, TraceProcess stats, TraceLoadedDotN if (_event.IsJitAllocSizePresent) { writer.Write( - "{0:n0}", - "{1:n0}", - "{2:n0}", - "{3:n0}", + "{0}" + + "{1}" + + "{2}" + + "{3}", _event.HotCodeAllocSize, _event.RODataAllocSize, _event.RequestedAllocSizeForJitCode, @@ -440,7 +438,11 @@ public static void ToCsv(string filePath, TraceLoadedDotNetRuntime runtime) bool showOptimizationTiers = ShouldShowOptimizationTiers(runtime); using (var writer = File.CreateText(filePath)) { - writer.Write("Start MSec{0}JitTime MSec{0}ThreadID{0}IL Size{0}Native Size{0}LoaderHeap Allocation Size", listSeparator); + writer.Write("Start MSec{0}JitTime MSec{0}ThreadID{0}IL Size{0}Native Size", listSeparator); + if (runtime.JIT.Stats().IsJitAllocSizePresent) + { + writer.Write("HotCode Size{0}RO data Size{0}Allocated Heap Size{0}JIT Allocation Flag", listSeparator); + } if (showOptimizationTiers) { writer.Write("{0}OptimizationTier", listSeparator); diff --git a/src/TraceEvent/Parsers/ClrTraceEventParser.cs b/src/TraceEvent/Parsers/ClrTraceEventParser.cs index 26457bc9c..92a0144ab 100644 --- a/src/TraceEvent/Parsers/ClrTraceEventParser.cs +++ b/src/TraceEvent/Parsers/ClrTraceEventParser.cs @@ -2015,7 +2015,7 @@ protected internal override void EnumerateTemplates(Func Date: Thu, 29 Oct 2020 10:41:36 -0700 Subject: [PATCH 7/9] some misc bug fixes --- src/PerfView/JitStats.cs | 11 ++++++---- .../Computers/TraceManagedProcess.cs | 22 +++++++++---------- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/src/PerfView/JitStats.cs b/src/PerfView/JitStats.cs index 3e36b490c..1b711ce8b 100644 --- a/src/PerfView/JitStats.cs +++ b/src/PerfView/JitStats.cs @@ -441,7 +441,7 @@ public static void ToCsv(string filePath, TraceLoadedDotNetRuntime runtime) writer.Write("Start MSec{0}JitTime MSec{0}ThreadID{0}IL Size{0}Native Size", listSeparator); if (runtime.JIT.Stats().IsJitAllocSizePresent) { - writer.Write("HotCode Size{0}RO data Size{0}Allocated Heap Size{0}JIT Allocation Flag", listSeparator); + writer.Write("{0}HotCode Size{0}RO data Size{0}Allocated Heap Size{0}JIT Allocation Flag", listSeparator); } if (showOptimizationTiers) { @@ -465,7 +465,7 @@ public static void ToCsv(string filePath, TraceLoadedDotNetRuntime runtime) if (_event.IsJitAllocSizePresent) { - writer.Write("{1}{0}{2}{0}{3}{0}{4}", + writer.Write("{0}{1}{0}{2}{0}{3}{0}{4}", listSeparator, _event.HotCodeAllocSize, _event.RODataAllocSize, @@ -554,8 +554,11 @@ public static void ToXml(TextWriter writer, TraceProcess stats, TraceLoadedDotNe JITStatsEx statsEx = JITStatsEx.Create(runtime); // TODO pay attention to indent; - writer.Write(" Date: Thu, 29 Oct 2020 11:41:49 -0700 Subject: [PATCH 8/9] Rename some of the fields --- src/PerfView/JitStats.cs | 34 +++++++++---------- .../Computers/TraceManagedProcess.cs | 22 ++++++------ src/TraceEvent/Parsers/ClrTraceEventParser.cs | 26 +++++++------- 3 files changed, 41 insertions(+), 41 deletions(-) diff --git a/src/PerfView/JitStats.cs b/src/PerfView/JitStats.cs index 1b711ce8b..d1d2b623c 100644 --- a/src/PerfView/JitStats.cs +++ b/src/PerfView/JitStats.cs @@ -166,9 +166,9 @@ public static void ToHtml(TextWriter writer, TraceProcess stats, TraceLoadedDotN if (runtime.JIT.Stats().IsJitAllocSizePresent) { - writer.Write("Allocation Size for Hotcode"); - writer.Write("Allocation Size for ROData"); - writer.Write("Allocated size"); + writer.Write("JIT Hotcode request size"); + writer.Write("JIT RO-data request size"); + writer.Write("Allocated size for JIT code"); } writer.WriteLine(""); @@ -264,10 +264,10 @@ public static void ToHtml(TextWriter writer, TraceProcess stats, TraceLoadedDotN if (runtime.JIT.Stats().IsJitAllocSizePresent) { writer.Write( - "HotCode
    Size" + - "RO data
    Size" + - "Allocated
    Heap Size" + - "JIT Allocation
    Flag" + "JIT Hotcode
    request size" + + "JIT RO-data
    request size" + + "Allocated size
    for JIT code" + + "JIT Allocation
    Flags" ); } @@ -307,9 +307,9 @@ public static void ToHtml(TextWriter writer, TraceProcess stats, TraceLoadedDotN "{1}" + "{2}" + "{3}", - _event.HotCodeAllocSize, - _event.RODataAllocSize, - _event.RequestedAllocSizeForJitCode, + _event.JitHotCodeRequestSize, + _event.JitRODataRequestSize, + _event.AllocatedSizeForJitCode, _event.JitAllocFlag ); } @@ -441,7 +441,7 @@ public static void ToCsv(string filePath, TraceLoadedDotNetRuntime runtime) writer.Write("Start MSec{0}JitTime MSec{0}ThreadID{0}IL Size{0}Native Size", listSeparator); if (runtime.JIT.Stats().IsJitAllocSizePresent) { - writer.Write("{0}HotCode Size{0}RO data Size{0}Allocated Heap Size{0}JIT Allocation Flag", listSeparator); + writer.Write("{0}JIT HotCode request size{0}JIT RO-data request size{0}Allocated size for JIT code{0}JIT Allocation Flag", listSeparator); } if (showOptimizationTiers) { @@ -467,9 +467,9 @@ public static void ToCsv(string filePath, TraceLoadedDotNetRuntime runtime) { writer.Write("{0}{1}{0}{2}{0}{3}{0}{4}", listSeparator, - _event.HotCodeAllocSize, - _event.RODataAllocSize, - _event.RequestedAllocSizeForJitCode, + _event.JitHotCodeRequestSize, + _event.JitRODataRequestSize, + _event.AllocatedSizeForJitCode, _event.JitAllocFlag); } @@ -632,9 +632,9 @@ private static void ToXml(TextWriter writer, TraceJittedMethod info, bool showOp if (info.IsJitAllocSizePresent) { - writer.Write(" HotCodeAllocSize={0}", StringUtilities.QuotePadLeft(info.HotCodeAllocSize.ToString(), 10)); - writer.Write(" RODataAllocSize={0}", StringUtilities.QuotePadLeft(info.RODataAllocSize.ToString(), 10)); - writer.Write(" RequestedAllocSizeForJitCode={0}", StringUtilities.QuotePadLeft(info.RequestedAllocSizeForJitCode.ToString(), 10)); + writer.Write(" JITHotCodeRequestSize={0}", StringUtilities.QuotePadLeft(info.JitHotCodeRequestSize.ToString(), 10)); + writer.Write(" JITRODataRequestSize={0}", StringUtilities.QuotePadLeft(info.JitRODataRequestSize.ToString(), 10)); + writer.Write(" AllocSizeForJitCode={0}", StringUtilities.QuotePadLeft(info.AllocatedSizeForJitCode.ToString(), 10)); writer.Write(" JitAllocFlag={0}", StringUtilities.QuotePadLeft(info.JitAllocFlag.ToString(), 10)); } if (showOptimizationTiers) diff --git a/src/TraceEvent/Computers/TraceManagedProcess.cs b/src/TraceEvent/Computers/TraceManagedProcess.cs index d2da63ebe..b04e0be38 100644 --- a/src/TraceEvent/Computers/TraceManagedProcess.cs +++ b/src/TraceEvent/Computers/TraceManagedProcess.cs @@ -3871,10 +3871,10 @@ public void AddMethodToStatistics(TraceJittedMethod method) TotalCpuTimeMSec += method.CompileCpuTimeMSec; TotalILSize += method.ILSize; TotalNativeSize += method.NativeSize; - TotalHotCodeAllocSize += method.HotCodeAllocSize; - TotalRODataAllocSize += method.RODataAllocSize; + TotalHotCodeAllocSize += method.JitHotCodeRequestSize; + TotalRODataAllocSize += method.JitRODataRequestSize; IsJitAllocSizePresent |= method.IsJitAllocSizePresent; - TotalAllocSizeForJitCode += method.RequestedAllocSizeForJitCode; + TotalAllocSizeForJitCode += method.AllocatedSizeForJitCode; if (method.CompilationThreadKind == CompilationThreadKind.MulticoreJitBackground) { CountBackgroundMultiCoreJit++; @@ -3949,13 +3949,13 @@ internal static void LogJitMethodAllocation(TraceLoadedDotNetRuntime stats, Meth if (_method != null) { // If we already counted alloc size for a method, don't count it again. - if (_method.HotCodeAllocSize == 0) + if (_method.JitHotCodeRequestSize == 0) { _method.IsJitAllocSizePresent = true; - _method.HotCodeAllocSize = data.HotCodeSize; - _method.RODataAllocSize = data.RODataSize; - _method.RequestedAllocSizeForJitCode = data.TotalRequestSize; - _method.JitAllocFlag = data.CorJitAllocMemFlag; + _method.JitHotCodeRequestSize = data.JitHotCodeRequestSize; + _method.JitRODataRequestSize = data.JitRODataRequestSize; + _method.AllocatedSizeForJitCode = data.AllocatedSizeForJitCode; + _method.JitAllocFlag = data.JitAllocFlag; } } } @@ -4166,15 +4166,15 @@ public class TraceJittedMethod /// /// Hot code size allocated for JIT code of method /// - public long HotCodeAllocSize; + public long JitHotCodeRequestSize; /// /// Read-only data size allocated for JIT code of method /// - public long RODataAllocSize; + public long JitRODataRequestSize; /// /// Total size allocated for JIT code of method /// - public long RequestedAllocSizeForJitCode; + public long AllocatedSizeForJitCode; /// /// Jit allocation flag /// diff --git a/src/TraceEvent/Parsers/ClrTraceEventParser.cs b/src/TraceEvent/Parsers/ClrTraceEventParser.cs index 92a0144ab..c71e3773a 100644 --- a/src/TraceEvent/Parsers/ClrTraceEventParser.cs +++ b/src/TraceEvent/Parsers/ClrTraceEventParser.cs @@ -8811,10 +8811,10 @@ public sealed class MethodJitMemoryAllocatedForCodeTraceData : TraceEvent public string MethodBeingCompiledNamespace { get { return GetUnicodeStringAt(0); } } public string MethodBeingCompiledName { get { return GetUnicodeStringAt(SkipUnicodeString(0)); } } public string MethodBeingCompiledNameSignature { get { return GetUnicodeStringAt(SkipUnicodeString(SkipUnicodeString(0))); } } - public long HotCodeSize { get { return GetInt64At(SkipUnicodeString(SkipUnicodeString(SkipUnicodeString(0)))); } } - public long RODataSize { get { return GetInt64At(SkipUnicodeString(SkipUnicodeString(SkipUnicodeString(0))) + 8); } } - public long TotalRequestSize { get { return GetInt64At(SkipUnicodeString(SkipUnicodeString(SkipUnicodeString(0))) + 16); } } - public int CorJitAllocMemFlag { get { return GetInt32At(SkipUnicodeString(SkipUnicodeString(SkipUnicodeString(0))) + 24); } } + public long JitHotCodeRequestSize { get { return GetInt64At(SkipUnicodeString(SkipUnicodeString(SkipUnicodeString(0)))); } } + public long JitRODataRequestSize { get { return GetInt64At(SkipUnicodeString(SkipUnicodeString(SkipUnicodeString(0))) + 8); } } + public long AllocatedSizeForJitCode { get { return GetInt64At(SkipUnicodeString(SkipUnicodeString(SkipUnicodeString(0))) + 16); } } + public int JitAllocFlag { get { return GetInt32At(SkipUnicodeString(SkipUnicodeString(SkipUnicodeString(0))) + 24); } } public int ClrInstanceID { get { return GetInt16At(SkipUnicodeString(SkipUnicodeString(SkipUnicodeString(0))) + 28); } } #region Private @@ -8843,10 +8843,10 @@ public override StringBuilder ToXml(StringBuilder sb) XmlAttrib(sb, "MethodBeingCompiledNamespace", MethodBeingCompiledNamespace); XmlAttrib(sb, "MethodBeingCompiledName", MethodBeingCompiledName); XmlAttrib(sb, "MethodBeingCompiledNameSignature", MethodBeingCompiledNameSignature); - XmlAttrib(sb, "HotCodeSize", HotCodeSize); - XmlAttrib(sb, "RODataSize", RODataSize); - XmlAttrib(sb, "TotalRequestSize", TotalRequestSize); - XmlAttrib(sb, "CorJitAllocMemFlag", CorJitAllocMemFlag); + XmlAttrib(sb, "JitHotCodeRequestSize", JitHotCodeRequestSize); + XmlAttrib(sb, "JitRODataRequestSize", JitRODataRequestSize); + XmlAttrib(sb, "AllocatedSizeForJitCode", AllocatedSizeForJitCode); + XmlAttrib(sb, "JitAllocFlag", JitAllocFlag); XmlAttrib(sb, "ClrInstanceID", ClrInstanceID); sb.Append("/>"); return sb; @@ -8857,7 +8857,7 @@ public override string[] PayloadNames get { if (payloadNames == null) - payloadNames = new string[] { "MethodBeingCompiledNamespace", "MethodBeingCompiledName", "MethodBeingCompiledNameSignature", "HotCodeSize", "RODataSize", "TotalRequestSize", "CorJitAllocMemFlag", "ClrInstanceID" }; + payloadNames = new string[] { "MethodBeingCompiledNamespace", "MethodBeingCompiledName", "MethodBeingCompiledNameSignature", "JitHotCodeRequestSize", "JitRODataRequestSize", "AllocatedSizeForJitCode", "JitAllocFlag", "ClrInstanceID" }; return payloadNames; } } @@ -8873,13 +8873,13 @@ public override object PayloadValue(int index) case 2: return MethodBeingCompiledNameSignature; case 3: - return HotCodeSize; + return JitHotCodeRequestSize; case 4: - return RODataSize; + return JitRODataRequestSize; case 5: - return TotalRequestSize; + return AllocatedSizeForJitCode; case 6: - return CorJitAllocMemFlag; + return JitAllocFlag; case 7: return ClrInstanceID; default: From a552161afd081611e617e5feadebe25e25e56dd8 Mon Sep 17 00:00:00 2001 From: Kunal Pathak Date: Thu, 5 Nov 2020 15:29:59 -0800 Subject: [PATCH 9/9] Replace methodName with methodId --- .../Computers/TraceManagedProcess.cs | 1 - src/TraceEvent/Parsers/ClrTraceEventParser.cs | 40 +++++++++---------- 2 files changed, 18 insertions(+), 23 deletions(-) diff --git a/src/TraceEvent/Computers/TraceManagedProcess.cs b/src/TraceEvent/Computers/TraceManagedProcess.cs index b04e0be38..e8bafe253 100644 --- a/src/TraceEvent/Computers/TraceManagedProcess.cs +++ b/src/TraceEvent/Computers/TraceManagedProcess.cs @@ -3918,7 +3918,6 @@ internal static TraceJittedMethod MethodComplete(TraceLoadedDotNetRuntime stats, } } _method.NativeSize = data.MethodSize; - Console.WriteLine("MethodName= {0}, Size= {1}", methodName, data.MethodSize); _method.CompileCpuTimeMSec = data.TimeStampRelativeMSec - _method.StartTimeMSec; _method.SetOptimizationTier(data.OptimizationTier, stats); _method.VersionID = rejitID; diff --git a/src/TraceEvent/Parsers/ClrTraceEventParser.cs b/src/TraceEvent/Parsers/ClrTraceEventParser.cs index c71e3773a..c119b3f9c 100644 --- a/src/TraceEvent/Parsers/ClrTraceEventParser.cs +++ b/src/TraceEvent/Parsers/ClrTraceEventParser.cs @@ -8808,14 +8808,13 @@ public override object PayloadValue(int index) public sealed class MethodJitMemoryAllocatedForCodeTraceData : TraceEvent { - public string MethodBeingCompiledNamespace { get { return GetUnicodeStringAt(0); } } - public string MethodBeingCompiledName { get { return GetUnicodeStringAt(SkipUnicodeString(0)); } } - public string MethodBeingCompiledNameSignature { get { return GetUnicodeStringAt(SkipUnicodeString(SkipUnicodeString(0))); } } - public long JitHotCodeRequestSize { get { return GetInt64At(SkipUnicodeString(SkipUnicodeString(SkipUnicodeString(0)))); } } - public long JitRODataRequestSize { get { return GetInt64At(SkipUnicodeString(SkipUnicodeString(SkipUnicodeString(0))) + 8); } } - public long AllocatedSizeForJitCode { get { return GetInt64At(SkipUnicodeString(SkipUnicodeString(SkipUnicodeString(0))) + 16); } } - public int JitAllocFlag { get { return GetInt32At(SkipUnicodeString(SkipUnicodeString(SkipUnicodeString(0))) + 24); } } - public int ClrInstanceID { get { return GetInt16At(SkipUnicodeString(SkipUnicodeString(SkipUnicodeString(0))) + 28); } } + public long MethodID { get { return GetInt64At(0); } } + public long ModuleID { get { return GetInt64At(8); } } + public long JitHotCodeRequestSize { get { return GetInt64At(16); } } + public long JitRODataRequestSize { get { return GetInt64At(24); } } + public long AllocatedSizeForJitCode { get { return GetInt64At(32); } } + public int JitAllocFlag { get { return GetInt32At(40); } } + public int ClrInstanceID { get { return GetInt16At(44); } } #region Private internal MethodJitMemoryAllocatedForCodeTraceData(Action action, int eventID, int task, string taskName, Guid taskGuid, int opcode, string opcodeName, Guid providerGuid, string providerName) @@ -8829,8 +8828,8 @@ protected internal override void Dispatch() } protected internal override void Validate() { - Debug.Assert(!(Version == 0 && EventDataLength != SkipUnicodeString(SkipUnicodeString(SkipUnicodeString(0))) + 30)); - Debug.Assert(!(Version > 0 && EventDataLength < SkipUnicodeString(SkipUnicodeString(SkipUnicodeString(0))) + 30)); + Debug.Assert(!(Version == 0 && EventDataLength != 46)); + Debug.Assert(!(Version > 0 && EventDataLength < 46)); } protected internal override Delegate Target { @@ -8840,9 +8839,8 @@ protected internal override Delegate Target public override StringBuilder ToXml(StringBuilder sb) { Prefix(sb); - XmlAttrib(sb, "MethodBeingCompiledNamespace", MethodBeingCompiledNamespace); - XmlAttrib(sb, "MethodBeingCompiledName", MethodBeingCompiledName); - XmlAttrib(sb, "MethodBeingCompiledNameSignature", MethodBeingCompiledNameSignature); + XmlAttrib(sb, "MethodID", MethodID); + XmlAttrib(sb, "ModuleID", ModuleID); XmlAttrib(sb, "JitHotCodeRequestSize", JitHotCodeRequestSize); XmlAttrib(sb, "JitRODataRequestSize", JitRODataRequestSize); XmlAttrib(sb, "AllocatedSizeForJitCode", AllocatedSizeForJitCode); @@ -8857,7 +8855,7 @@ public override string[] PayloadNames get { if (payloadNames == null) - payloadNames = new string[] { "MethodBeingCompiledNamespace", "MethodBeingCompiledName", "MethodBeingCompiledNameSignature", "JitHotCodeRequestSize", "JitRODataRequestSize", "AllocatedSizeForJitCode", "JitAllocFlag", "ClrInstanceID" }; + payloadNames = new string[] { "MethodID", "ModuleID", "JitHotCodeRequestSize", "JitRODataRequestSize", "AllocatedSizeForJitCode", "JitAllocFlag", "ClrInstanceID" }; return payloadNames; } } @@ -8867,20 +8865,18 @@ public override object PayloadValue(int index) switch (index) { case 0: - return MethodBeingCompiledNamespace; + return MethodID; case 1: - return MethodBeingCompiledName; + return ModuleID; case 2: - return MethodBeingCompiledNameSignature; - case 3: return JitHotCodeRequestSize; - case 4: + case 3: return JitRODataRequestSize; - case 5: + case 4: return AllocatedSizeForJitCode; - case 6: + case 5: return JitAllocFlag; - case 7: + case 6: return ClrInstanceID; default: Debug.Assert(false, "Bad field index");