代码之家  ›  专栏  ›  技术社区  ›  Daniel Schaffer

ASP.NET/C—自定义性能计数器仅在64位系统上的32位perfmon中显示

  •  1
  • Daniel Schaffer  · 技术社区  · 16 年前

    我正在尝试创建一组自定义性能计数器,供我的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();
    }
    

    这在单元测试和Cassini的dev box(Vista Business x64)中都能很好地工作,我可以在Performance Monitor中查看计数器的工作情况。但是,计数器似乎没有在我的生产环境(Win Server 2003 x64)中注册任何增量。计数器实例本身是可用的,但它们只显示最后一个/平均值/最小值/最大值的“--”。

    你知道我会做错什么吗?

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

    编辑2: 我正在使用VS2008/.NETFrameworkV3.5SP1,如果这有什么不同的话。

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

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

    编辑5: 它看起来确实在工作,只是我必须重新启动perfmon实例,因为它在创建计数器之前是打开的。

    1 回复  |  直到 16 年前
        1
  •  1
  •   Patrick J Collins    16 年前

    我读到实例化PerformanceCounter非常耗费资源。您是否想过将它们缓存在会话/应用程序变量中?

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

    帕特里克