标签: perfview

为什么在EventSource的子类上实现接口会在运行时抛出异常?

我试图通过.NET 4.5中包含的EventSource类在我的.NET应用程序中使用事件跟踪Windows(ETW).我继承的,并试图实现一个接口(用于嘲讽的目的),如下所示:EventSourceMyEventSourceIMyEventSource

public interface IMyEventSource
{
  void Test();
}

public class MyEventSource : EventSource, IMyEventSource
{
  public static MyEventSource Log = new MyEventSource();

  [Event(1)]
  public void Test()
  {
    this.WriteEvent(1);
  }
}
Run Code Online (Sandbox Code Playgroud)

当我运行PerfView并执行此代码时,我IndexOutOfRangeException接到了一个电话WriteEvent.如果我通过修改代码删除界面...

public class MyEventSource : EventSource
{
  public static MyEventSource Log = new MyEventSource();

  [Event(1)]
  public void Test()
  {
    this.WriteEvent(1);
  }
}
Run Code Online (Sandbox Code Playgroud)

...然后一切正常.

以下是我在两种情况下用于测试的代码:

static void Main(string[] args)
{
  MyEventSource.Log.Test();
}
Run Code Online (Sandbox Code Playgroud)

EventSource如果它只是实现一个接口,为什么我的子类会中断呢?

这是一篇相关的帖子.

etw .net-4.5 perfview etw-eventsource

8
推荐指数
2
解决办法
2038
查看次数

如何在Windows Server 2012 R2上解决PerfView for 64位进程中的BROKEN堆栈

我正在生产系统上运行perfview(只是默认集合),其中CPU在几分钟的时间内达到100%的峰值.我得到了一些有用的结果,但我也得到了一堆BROKEN堆栈.

该计算机是Windows Server 2012 R2.该应用程序是一个启动的exe.应用程序在.NET 4.0中编译,但服务器运行的是.NET 4.6.1

perfview帮助说我的情况的这些BROKEN堆栈是在Windows 8中修复的(我也猜测Windows Server 2012).我的dll不是ngen-ed但我不认为我必须这样,因为,问题在Windows 8中得到修复

有什么想法吗?

.net ngen perfview

8
推荐指数
1
解决办法
1172
查看次数

clr的原因!JIT_New在PerfView CPU堆栈中

我使用PerfView调整应用程序,第二个最昂贵的项目目前标记为:

其他<< clr!JIT_New >>

占CPU的10%以上.即使对于后续运行的测试用例,这仍然存在.

任何人都可以确定哪些活动或代码实践可能导致动态生成需要JIT-ting的新代码?

.net c# performance perfview

6
推荐指数
1
解决办法
1222
查看次数

如何强制PerfView收集仅来自一个进程的ETW事件

我知道有一个/ Process:NameOrPID开关,但它仅影响/ StopXXX命令。从所有进程收集ETW事件会导致* .ETL大文件。我试图仅从一个进程中捕获ETW事件,以避免使用不相关的ETW事件污染输出文件。

perfview

6
推荐指数
1
解决办法
1042
查看次数

Perfview 没有停止

我正在运行这个 PerfView 命令:

PerfView.exe /Merge:true /zip:true /NoNGenRundown /NoClrRundown /KeepAllEvents /ThreadTime /DumpHeap /NoView /NoGui /MaxCollectSec:30 collect

但似乎即使我定义/MaxCollectSec:30为 30 秒,实际的数据收集过程也不会停止并继续将数据添加到PerfViewData.etl文件中

这是运行命令时 Perfview 打开的控制台窗口的输出:

详细登录:PerfViewData.log.txt

执行:PerfView /Merge:true /zip:true /NoNGenRundown /NoClrRundown /KeepAllEvents /ThreadTime /DumpHeap /NoView /NoGui /MaxCollectSec:30 收集

V4.0 之前的 .NET Rundown 已禁用,请键入“E”以启用 V3.5 进程的符号。

不要关闭此控制台窗口。它将继续收集!

输入 S 停止收集,“A”将中止。

内核日志:C:\PerfView\PerfViewData.kernel.etl

用户模式日志:C:\PerfView\PerfViewData.etl

2017年12月7日14:26:32开始采集

收集 10 秒:大小= 10.5 MB。

收集 20 秒:大小= 16.4 MB。

超过 MaxCollectSec 30

所以就是这样:Exceeded MaxCollectSec 30但继续写入 etl 文件。

我想向客户端发送 Perfview 命令来收集系统范围的数据,并将包含来自 Perfview 的所有 ETL 文件的 zip …

perfview

5
推荐指数
1
解决办法
940
查看次数

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 秒仍然很多。所以包容百分比时间在这里比较苹果和橙子。有人可以解释一下吗?

对 WCF 服务调用进行大约 70 秒分析后的 PerfView“线程时间堆栈”视图

.net c# performance profiling perfview

4
推荐指数
1
解决办法
2531
查看次数

StackTrace 构造函数和获取方法名称对性能的影响

我的日志库中有这段代码

var stackTrace = new StackTrace();
string operationName = stackTrace.GetFrame(1).GetMethod().Name;
Run Code Online (Sandbox Code Playgroud)

根据我使用 PerfView 工具进行的性能分析,它显示为

图片来自 PerfView etl 文件

有谁知道我添加的代码对性能的影响?如果是,是否有其他方法可以获取方法名称而不会对性能产生更大的影响?

我目前在 4 核机器上以 1000 TPS 的速度运行它。我发现它使用了我的 CPU 的 15.1%

c# performance perfview

4
推荐指数
1
解决办法
980
查看次数

我如何在PerfView中看到昂贵的方法

我创建了一个简单的控制台应用程序,并通过Run Command - > PerfMonTest.exe从PerfView执行它

我得到日志文件,看看应用程序的过程.如预期的那样昂贵(99%CPU),但是当我想深入研究昂贵的方法时,它们不会显示在昂贵的方法列表中.

我能做些什么让它们可见吗?

这是我选择过程时的视图.我希望列表中有CallExpensive和CallCheap:

在此输入图像描述

选择主要方法并不能让我进一步深入研究被调用的方法

在此输入图像描述

这是应用程序:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace PerfMonTest
{
    class Program
    {
        static void Main(string[] args)
        {
            for (int i = 0; i <= 2000; i++)
            {
                CallExpensive(1000);
                CallCheap(1000);
                CallCheap(400);
            }

        }

        public static void CallExpensive(int expense)
        {
            for (int i = 0; i <= expense; i++)
            {
                DateTime checkTime = DateTime.Now;
                string val = "10" + i.ToString();
            }
        }

        public static void CallCheap(int expense)
        {
            for (int …
Run Code Online (Sandbox Code Playgroud)

performance .net-4.0 perfview

3
推荐指数
1
解决办法
793
查看次数

了解 PerfView 中的 BLOCKED_TIME

我们怀疑在运行几个 ASP.NET Core API 和几个 .NET Core 控制台的服务器上遇到线程池饥饿。

我在我们的一台服务器上运行了 perfview,因为我们怀疑线程池饥饿有问题。但是,我在分析结果时遇到了一些麻烦。

我跑PerfView /threadTime collect了大约60秒。这是我得到的结果(我选择了一个来查看我们的 ASP.NET Core API 之一):

在此处输入图片说明

查看“按名称”,我们可以看到在BLOCKED_TIME. 如果我双击,则会进入以下视图,我可以在其中展开节点之一以获取以下视图(被覆盖的部分是我们的 API 进程的名称):

在此处输入图片说明

这告诉我什么?我不应该能够看到究竟是什么阻塞?看起来问题是很多线程在短时间内阻塞了每个线程吗?

我们还能从中得出什么其他结论吗?

perfview .net-core asp.net-core

3
推荐指数
1
解决办法
1973
查看次数

关于外部流程的GC

是否可以在外部进程上强制GC?我的意思是没有附加到Visual Studio/windbg等我知道可能有可能用VS立即窗口这样的东西.

编辑在此输入图像描述 看起来这可以通过PerfView完成,但我可以找到很多信息,好像这是一个完整的GC或什么.有任何想法吗?

.net garbage-collection perfview

2
推荐指数
2
解决办法
662
查看次数

如何在perfiew的调用树中对线程堆栈进行分组

Perfiew是一个非常酷的工具.但是我使用它的调用树视图时遇到问题,因为它一次显示信息线程 - 除非你有一个非常繁忙的线程,否则它真的会失败.见下图.

在此输入图像描述

相反,我想通过低于线程ID的东西看到最昂贵的堆栈,就像顶级方法一样(如ANTS和大多数其他性能分析器那样).这可能吗?如果是这样,怎么样?

见下图

在此输入图像描述

.net performance profiling cpu-usage perfview

2
推荐指数
1
解决办法
321
查看次数