2009-01-02 91 views
1

我试图创建一组自定义性能计数器以供我的ASP.NET应用程序使用。我使用下面的代码来递增计数器:ASP.NET/C# - 自定义PerformanceCounters只显示在64位系统上的32位perfmon

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商业版64位),我可以看在性能监视器工作的计数器。但是,计数器似乎没有在我的生产环境中注册任何增量(Win Server 2003 x64)。计数器实例本身可用,但它们都只显示“ - ”表示最后/平均/最小/最大显示。

任何想法,我可能做错了什么?

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

编辑2:我使用VS 2008/.NET框架V3.5 SP1,如果有什么差别。

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

EDIT 4:示出了,当我运行生产服务器上的32位性能监视器。所以我想现在的问题是为什么我不能读取64位perfmon中的值?

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

回答

1

我读到,实例化PerformanceCounter是相当资源密集型的。你有没有想过将这些缓存在会话/应用程序变量中?

另外,更新计数器而不锁定多线程ASP.net应用程序是明智吗?

Patrick Patrick

+0

实例化我的计数器似乎存在一点开销,但此时仅需要缓存是不够的。 – 2009-01-12 17:25:59