【问题标题】:ASP.NET/C# - Custom PerformanceCounters only show up in 32-bit perfmon on 64-bit systemASP.NET/C# - 自定义 PerformanceCounters 仅显示在 64 位系统上的 32 位 perfmon
【发布时间】:2009-01-02 20:22:58
【问题描述】:

我正在尝试创建一组自定义性能计数器以供我的 ASP.NET 应用程序使用。我使用以下代码来增加计数器:

internal static void Increment(String instanceName, DistributedCacheCounterInstanceType counterInstanceType)
{
    var permission = new PerformanceCounterPermission(PerformanceCounterPermissionAccess.Write, Environment.MachineName, "CounterName");
    permission.Assert();

    var counter = new PerformanceCounter("CategoryName", "CounterName", instanceName, false);
    counter.RawValue++; // Use RawValue++ instead of Increment() to avoid locking
    counter.Close();
}

这在单元测试中以及在我的开发盒 (Vista Business x64) 上的 Cassini 中都非常有效。我可以在性能监视器中观察计数器的工作情况。但是,在我的生产环境(Win Server 2003 x64)中,计数器似乎没有记录任何增量。计数器实例本身是可用的,但它们都只显示“--”用于最后/平均/最小/最大显示。

关于我可能做错的任何想法?

编辑:这里是a [perhaps somewhat outdated] MSDN article that I used for reference

编辑 2:我正在使用 VS 2008/.NET Framework v3.5 SP1,如果这有什么不同的话。

编辑 3: 刚刚找到 this article about 32 bit/64 bit app and monitor mismatching,但我不确定它如何适用于我的情况,如果有的话。 Cassini 确实是一个 32 位应用程序,但我在 64 位系统上查看值没有问题。在我的生产服务器上,应用程序和系统都是 64 位的,但我看不到值。

编辑 4: 当我在生产服务器上运行 32 位 perfmon 时,这些值会显示出来。。所以我想现在的问题是为什么我不能读取 64 位 perfmon 中的值?

编辑 5:它实际上似乎在工作,只是我不得不重新启动我的 perfmon 实例,因为它在创建计数器之前是打开的。

【问题讨论】:

    标签: c# asp.net performancecounter


    【解决方案1】:

    我读到实例化 PerformanceCounter 非常耗费资源。您是否考虑过将这些缓存在 Session / Application 变量中?

    另外,在不锁定多线程 ASP.net 应用程序的情况下更新计数器是否明智?

    帕特里克

    【讨论】:

    • 实例化我的计数器似乎有一些开销,但此时需要缓存是不够的。
    • 是的,在这种情况下,绝对需要在不锁定的情况下进行更新,因为锁定会影响性能。最好有稍微不准确的数字,而不是准确的数字和糟糕的表现。
    猜你喜欢
    • 2011-11-11
    • 2013-05-08
    • 2013-05-29
    • 2014-03-30
    • 2012-03-16
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    • 2011-06-30
    相关资源
    最近更新 更多