问题标签 [perfview]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
performance - 如何在 PerfView 中看到我昂贵的方法
我创建了一个简单的控制台应用程序并通过运行命令从 PerfView 执行它 -> PerfMonTest.exe
我得到日志文件并查看应用程序的进程。正如预期的那样昂贵(99% CPU),但是当我想深入研究昂贵的方法时,它们不会显示在昂贵的方法列表中。
我能做些什么让它们可见吗?
这是我选择流程时的视图。我希望列表中有 CallExpensive 和 CallCheap:
选择主要方法并没有让我有机会进一步研究被调用的方法
这是应用程序:
asp.net - ASP.Net web-app Mem-leak 调查
在调查在 Asp.Net 4.0 上运行的网站上的性能问题时需要建议。
网站上的一点背景:
该网站是一个建立在电子商务框架上的网上商店,已在许多项目中证明了自己的稳定性和可靠性。Webshop 已经稳定运行了很长一段时间(一年),但是在客户将他们的 ERP(MS Dynamics NAV)升级到更高版本后,性能问题很快就开始上升。
问题本身:
应用程序池正常启动,但会消耗几乎所有可用内存。所以,显然这是一个内存泄漏的情况。
更具体的例子:昨晚重新启动应用程序池,使用的内存约为 500 兆字节。在大约 16-18 小时内,该池已经以大约 2 GB 的速度运行。池将继续增长,直到几乎所有内存都被消耗并且应用程序变得非常缓慢。
应用程序池的内存快照是在池重新启动后和 2 Gig 时使用PerfView拍摄的。
快照的差异附在下面:
如您所见,第一行是mscrolib!LocalDataStoreHolder。如果我尝试打开有关它的详细信息,我可以看到以下引用来源视图,如下所示:
问题是 - 我无法打开这些节点中的任何一个以获取更详细的信息。所以目前我无法弄清楚,是什么吞噬了记忆。
如果它可能有任何帮助,下面是 RefTree 屏幕截图。在这里,您可以看到强句柄占 92.2%。
所以问题是 - 任何人都可以提供任何关于如何深入细节的提示或想法吗?如何找出导致内存泄漏的原因?
先感谢您
编辑:我还尝试了 RedGate ANTS 内存配置文件,这在此处的各种线程中得到了很多建议。这是我拍摄了一些内存快照后的摘要图片,最新的一张在 20 小时后完成,应用程序池占用了大约 3.7 Gb 的 RAM。如您所见,左侧巨大的红色块是“Unmanaged”,大小为 2.5 Gb。正如 ANTS 所说,这要么被 CLR 本身用完,要么被图形数据用完,要么被通过 P/Invoke 或 COM+ 访问的非托管数据。不过,不知道如何获得更深入的细节。
.net-4.5 - 为什么在 EventSource 的子类上实现接口会在运行时抛出异常?
我正在尝试通过.NET 4.5 中包含的EventSource类在我的 .NET 应用程序中使用Windows 事件跟踪 (ETW) 。我将子类化为并尝试实现一个接口(用于模拟目的),如下所示:EventSource
MyEventSource
IMyEventSource
当我运行PerfView并执行此代码时,我收到了IndexOutOfRangeException
对WriteEvent
. 如果我通过修改代码来删除接口......
...然后一切正常。
这是我在这两种情况下用于测试的代码:
EventSource
如果我的子类只是实现一个接口,为什么它会中断?
这是一个相关的帖子。
c# - clr的原因!PerfView CPU 堆栈中的 JIT_New
我正在使用 PerfView 来调整应用程序,第二个最昂贵的项目目前被标记为:
其他 < < clr!JIT_New >>
超过 10% 的 CPU。即使对于测试用例的后续运行,这种情况也会继续。
谁能确定哪些活动或代码实践可能导致需要 JIT-ting 的新代码的动态生成?
.net - PerfView 中没有来自自定义 .Net 4.5 EventSource ETW 提供程序的事件
我在我的 ASP.NET WebApi 应用程序中创建了一个 EventSource (WebApiEventSource)(作为 ITraceWriter 实现):
我检查了 EventSource 的方法在运行时是否被调用而没有错误。
然后我运行 PerfView 并在它的日志中检查它可以看到我的提供程序(EventSource):
解析规范 *WebApi 启用提供程序:*WebApi 级别:关键关键字:0x0 选项:无 值:Guid:fc7bbb67-1b01-557b-5e0e-c1c4e40b6a24
然后我使用过滤器“*WebApi”运行“收集”,在我的应用程序中执行一些操作并停止它。
但是在 etl 文件中我的提供商没有任何事件!“事件”部分甚至不包含我的提供者的名称。
我错过了什么?
更新:我找到了原因,请参阅下面的答案。
c# - 在 Perfview 中解释 JITStats 报告的结果
我已经为我的 ASP.NET 应用程序收集了一些 PerfView 结果,并且可以看到它花费了大量时间 JITting。这个结论与性能计数器“在 JIT 中花费的时间百分比”相匹配——平均约为 30%,这非常糟糕。
由于我有一个高吞吐量的应用程序(每秒 100 个请求),这对 CPU 造成了巨大的压力。
我可以看到针对特定方法的大量 JIT:
如何将该地址映射到我的源代码以确定坏代码是什么?
asp.net-mvc - IIS 工作进程不断增加内存使用量
我们正在一台具有 16 GB RAM、IIS 8.5 和 .Net 4.5.2 的机器上运行一个网站。
回收我们的网站后,w3wp 进程内存在一天内增加到 9 GB。
(机器范围的视图,但只有我们的网站工作进程内存使用量增加)
当我使用 PerfView 获得工作进程的堆快照时,我看到大部分内存都由 MemoryCache 持有
当我转到 MemoryCache 详细信息时,我看到 3 个命名缓存。其中之一是默认的,我们不会在上面放任何东西。另一种称为timeless,我们放置少量数据,这些数据将一直存在直到回收。最大的一个(名为_cache),我们将html输出放在上面,它增加到70K-80K项目,大约10到30分钟的缓存时间。
当我右键单击 _cache 项目并打开 Memory > View Object 时,我看到一个列表如下:
我正在获取缓存项目及其大小的列表并尝试将它们相加,我发现总项目大小低于 100 MB。
有什么办法可以让我看到什么是不断增加的?
c# - 如何在 ETW EventSource 中定义名称层次结构?
在我的项目中,我像这样使用 System.Diagnostics.Tracing.EventSource:
我通过在“附加提供者”字段中定义“*kafka4net”来使用具有动态提供者功能的 PerfView。这将通过其名称解析提供者。工作得很好。除了一个例外。我看到的事件是 kafka4net/Connecting,而我想看到 kafka4net/ConnectionTrace/Connecting。
一般来说,我希望事件是产品/子系统/事件。我可以看到一些系统组件具有这种结构,例如“Microsoft-Windows-DotNETRuntime/GC/Start”。
我尝试输入 [EventSource(Name = "kafka4net-Connection")],但我不能在 PerfView 中将其用作动态事件,因为我必须枚举我的所有子系统,如“kafka4net-Connection、kafka4net-Fetcher”等.而这是不行的。
EventSource 具有 Name 属性,可以是顶级“产品”,函数名称用作事件名称层次结构中的最低级别。如何在事件名称层次结构中插入中间元素“子系统”?
c# - PerfView:分析应用程序的性能,包括数据库调用
我目前正在使用 PerfView 对我的 (C#) 应用程序进行性能分析。但通常这些应用程序使用大量的数据库调用。所以我问自己这样的问题: - 在存储库中花费了多少时间?- (等待 SQL 查询返回花费了多少时间?) -> 我不知道这是否可以通过 PerfView 发现
但从我的痕迹中,我几乎没有得到任何有用的结果。在“任何堆栈”视图中,它告诉我(当我在我的存储库上使用分组时)在我的存储库中花费了 1.5 秒(整个调用大约为 45 秒)。而且我知道这不是真的,因为存储库调用了数据库很多。
是否只是在等待 SQL 查询完成时没有捕获 CPU 指标,因为在这段时间内 CPU 无事可做,因此我的时间只包括存储库中的数据转换时间等?
谢谢你的帮助!
编辑:
我错过的是打开线程时间选项以获取阻塞代码的时间(我想这是在数据库调用期间发生的事情)。我现在得到了所有的堆栈,只是过滤掉了无趣的东西。但我似乎无处可去。
当使用“线程时间”时,对我来说特别有趣的是 BLOCKED_TIME。但有了它,我认为时间已经过去了。当您查看屏幕截图时,它告诉我 CPU_TIME 是 28,384。这是毫秒(afaik),但 BLOCKED_TIME 是 2,314,732,不能是毫秒。所以 CPU_TIME 的百分比非常低,只有 1.2%,但 70 秒中有 28 秒仍然很多。所以包容百分比时间在这里比较苹果和橙子。有人可以解释一下吗?
.net - GC关于外部进程
是否可以在外部进程上强制 GC?我的意思是不附加到 Visual Studio/windbg 等。我知道可以使用 VS 即时窗口之类的东西来做到这一点。
编辑 看起来这可以通过 PerfView 来完成,但我可以找到很多信息,就好像这做了一个完整的 GC 或什么。有任何想法吗?