为啥我的 ASP.NET MVC 多实例性能计数器不起作用

Posted

技术标签:

【中文标题】为啥我的 ASP.NET MVC 多实例性能计数器不起作用【英文标题】:Why is my ASP.NET MVC Multi instance Performance counter not working为什么我的 ASP.NET MVC 多实例性能计数器不起作用 【发布时间】:2012-01-25 11:12:32 【问题描述】:

我无法让我们的多实例性能计数器在 ASP.NET MVC 3 中工作。将其创建为单个实例可以正常工作,并且在简单的控制台应用程序中运行我们的多实例性能计数器代码也可以正常工作。但是当我创建它的多实例并尝试使用 ASP.NET 增加它时,它似乎很困难。

我没有例外。我在 perf mon 中根本看不到任何测量输出。但是,我可以看到 2 个实例。

这是创建性能计数器类别的控制台应用代码:

private const string PERF_COUNTER_CATEGORY_NAME = "MvcPerformance";
private const string PERF_COUNTER_BASE_NAME = "MvcAction_Base";
private const string PERF_COUNTER_NAME = "MvcAction";

static void Main(string[] args)

    if (PerformanceCounterCategory.Exists(PERF_COUNTER_CATEGORY_NAME))
    
        PerformanceCounterCategory.Delete(PERF_COUNTER_CATEGORY_NAME);
    

    CounterCreationDataCollection counters = new CounterCreationDataCollection();

    // Add the counter.
    CounterCreationData avgDuration = new CounterCreationData();
    avgDuration.CounterType = PerformanceCounterType.AverageTimer32;
    avgDuration.CounterName = PERF_COUNTER_NAME;
    counters.Add(avgDuration);

    CounterCreationData avgDurationBase = new CounterCreationData();
    avgDurationBase.CounterName = PERF_COUNTER_BASE_NAME;
    avgDurationBase.CounterType = PerformanceCounterType.AverageBase;
    counters.Add(avgDurationBase);

    // Create the category.
    PerformanceCounterCategory.Create(PERF_COUNTER_CATEGORY_NAME, "Performance counters for MVC!", PerformanceCounterCategoryType.MultiInstance, counters);

那么我们在 ASP.NET MVC 应用程序中的 HomeController 看起来像这样:

    private static readonly Random _Random = new Random();
    private const string PERF_COUNTER_CATEGORY_NAME = "MvcPerformance";
    private const string PERF_COUNTER_BASE_NAME = "MvcAction_Base";
    private const string PERF_COUNTER_NAME = "MvcAction";
    private static PerformanceCounter _MvcActionCounter = new PerformanceCounter
    
        CounterName = PERF_COUNTER_NAME, 
        CategoryName = PERF_COUNTER_CATEGORY_NAME,
        ReadOnly = false,
        InstanceName = "Home_Index",
    ;
    private static PerformanceCounter _MvcActionCounterBase = new PerformanceCounter
    
        CounterName = PERF_COUNTER_BASE_NAME,
        CategoryName = PERF_COUNTER_CATEGORY_NAME,
        ReadOnly = false,
        InstanceName = "Home_Index_Base",
    ;

    public ActionResult Index()
    
        Stopwatch s = new Stopwatch();
        s.Start();
        Thread.Sleep(_Random.Next(1000));
        s.Stop();

        // Increment the performance counters.
        _MvcActionCounter.IncrementBy(s.ElapsedMilliseconds);
        _MvcActionCounterBase.Increment();
        return View(new HomeViewModel  ElapsedTime = s.Elapsed );
    

我可能很容易忘记这件事。也许与权限或用户管理有关?

【问题讨论】:

【参考方案1】:

我的一位同事刚刚给我邮寄了答案。基本计数器的实例名称必须与平均计数器的实例名称相同。

如果您遇到这样的问题,请确保这是您检查的第一件事......可以为您节省大量时间。

【讨论】:

你有没有机会写博客或者为我提供一个简单的示例应用程序?我认为这对性能测试非常有用。

以上是关于为啥我的 ASP.NET MVC 多实例性能计数器不起作用的主要内容,如果未能解决你的问题,请参考以下文章

为啥 ASP.NET MVC 4 有这么多的 NuGet 包,哪些是真正重要的?

为啥我的 SelectListItem 无法编辑 ASP.NET Core MVC

为啥 Asp.Net MVC 不在我的共享目录中搜索视图?

为啥我的 ASP.NET MVC 站点中的此 AJAX 请求会触发预检检查?

为啥我的 Jquery Ajax 调用不起作用?(Asp.net MVC C#)

ASP.NET MVC3 如何通过跨 Action 调用共享单个 AsyncManager 实例来避免多线程错误?