【问题标题】:Naming multi-instance performance counters in .NET在 .NET 中命名多实例性能计数器
【发布时间】:2011-02-28 18:24:12
【问题描述】:

如果有多个同名实例,Windows 中的大多数多实例性能计数器似乎会自动(?)在末尾添加一个 #n。

例如:如果在 Perfmon 中查看 Process 类别,您会看到:

...
dwm
explorer
explorer#1
...

我有两个explorer.exe 进程,所以第二个计数器的名称后面附加了#1。

当我尝试在 .NET 应用程序中执行此操作时:

  • 我可以创建类别并注册实例(使用带有CounterCreationDataCollectionPerformanceCounterCategory.Create)。
  • 我可以打开计数器进行写入和写入。

当我第二次(在另一个进程中)打开计数器时,它会打开同一个计数器。这意味着我有两个进程在柜台竞争。

documentation for PerformanceCounter.InstanceName 声明名称中不允许使用#

那么:我如何拥有实际上是多个实例的多实例性能计数器?第二个(和后续的)实例在哪里获得 #n 附加到名称?

也就是说:我知道我可以将进程 ID(例如)放在实例名称上。这可行,但有一个不幸的副作用,即重新启动进程会导致新的 PID,并且 Perfmon 会继续监视旧计数器。

更新:

我正在按如下方式创建类别(和计数器):

const string categoryName = "Test App";
const string counterName = "Number of kittens";
string instanceName =
    Path.GetFileNameWithoutExtension(
        Process.GetCurrentProcess().MainModule.FileName);

if (!PerformanceCounterCategory.Exists(categoryName))
{
    var counterCreationDataCollection = new CounterCreationDataCollection
        {
            new CounterCreationData(counterName, "",
                PerformanceCounterType.NumberOfItems32)
        };

    PerformanceCounterCategory.Create(categoryName, "",
        PerformanceCounterCategoryType.MultiInstance,
        counterCreationDataCollection);
}

我打开柜台如下:

PerformanceCounter counter = new PerformanceCounter(
        categoryName, counterName, instanceName, readOnly: false);

【问题讨论】:

  • 当您第二次打开性能计数器时,您是在不同的进程中执行的,还是从同一进程中的不同组件执行的?
  • 我认为您必须使用不同的实例名称打开它们。否则你最终会写错柜台。另外,请参阅msdn.microsoft.com/en-us/library/dd537616.aspx,这似乎表明 perfmon 正在添加“#1”。

标签: .net performancecounter


【解决方案1】:

我认为您的问题在于 .NET 在性能计数器方面更加松散,并且实际上绕过了 PerfLib Win API。

使用本机 PerfLib API 时,您可以在设置期间注册类别 - 并使用句柄从进程创建实例。因此,对于原生 API,没有直接的方法来共享计数器实例。所以当两个计数器实例被同名访问时,它们实际上有不同的句柄,并适当地用#标记。

在 .NET 中,由于您只是按名称寻址计数器和实例,因此存在交叉更新的危险。由于 .NET 采用名称并枚举(使用 WMI)实例,即使它们正被不同的应用程序使用。

我认为添加 PID* 确实是最聪明的解决方案 - 因为你们都有更好的跟踪能力并且没有碰撞。关于重新启动创建新计数器的问题,我看不到问题;如果您允许在给定时间运行多个进程实例,您如何知道该实例是由于重新启动还是仅仅运行另一个可执行文件而创建的?

如果您在进程之间确实存在某种依赖关系,您可以清理过时的计数器或使用其他一些逻辑。在 PerfMon 中,您可以查看“*”所有实例。

*或者,如果您在流程背后有一些逻辑,这些逻辑在不考虑重新启动的情况下得到维护 - 例如某种任务 ID。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多