gpt4 book ai didi

.net - 性能计数器已创建但在 Windows 重新启动之前无法工作

转载 作者:行者123 更新时间:2023-12-04 01:53:07 26 4
gpt4 key购买 nike

我在现有组中创建新计数器时遇到一个奇怪的问题。我有一个 Windows 服务,它做了一些工作,并允许我通过性能计数器监视它的状态。我有性能计数器组和一些性能计数器。组在服务安装阶段创建(具有管理员权限),并且在服务启动时初始化计数器(作为 LocalSystem 用户)。一切正常,组存在,计数器也存在,我可以监视它们并写入性能计数器日志。服务一直在运行。

然后我想添加更多性能计数器。我将它们添加到服务代码中,通过卸载以前的服务实例(性能计数器组被卸载代码删除)并再次安装服务(在安装阶段使用所有新计数器创建性能计数器组)来重建和部署到服务器。然后我开始服务。

这是故事中常见的、无趣的部分的结尾。奇怪的事情从这里开始。

我转到 PerMon,将所有计数器添加到系统监视器 View 。我可以看到我的性能计数器组,我可以看到所有性能计数器,包括我刚刚添加的新性能计数器。我可以将它们添加到系统监视器 View 。我可以看到,旧计数器正在工作。但是新的计数器不起作用,它们不收集任何数据。好吧,也许是我的错误,我切换到日志 View 并尝试记录性能计数器数据。旧计数器的记录与之前记录的一样。但是当我尝试添加新计数器时,我在事件查看器中发现以下警告:

The service was unable to add the counter '\AGENT\MyCountersGroupName\MyNewCounter' to the NewCountersLog log or alert. This log or alert will continue, but data for that counter will not be collected. The error returned is: The specified counter could not be found.



我尝试重新安装服务,删除旧计数器,再次添加它们,但没有任何改变。旧计数器有效,而新计数器无效。然后我重新启动 Windows,新的计数器开始工作!服务中没有任何变化,我刚刚重新启动了服务器。我在两台服务器上遇到了这个问题,它们都在 Windows Server 2003 SP1 下运行。所有性能计数器的代码都是相同的,因为我使用带有泛型的代码创建它们。

您可以说“嘿,别打扰,每次需要添加新的性能计数器时都重新启动 Windows”,但我不能。我的服务与其他服务一起在服务器上运行,我们需要这些服务不断工作,每次更改一项服务时我们都无法重新启动服务器。

有人可以帮忙解决这个问题吗?

更新:
看起来有类似的问题: https://stackoverflow.com/questions/2180005/adding-performance-counters-to-existing-category

更新
我不认为问题出在我的代码中,但如果有帮助,我会在此处发布。

安装和卸载代码(在安装阶段调用):
PerformanceCountersManagerBase.GetCreationData() 是一个通用包装器,用于获取数据集合以创建性能计数器。
public static void Install()
{
CounterCreationDataCollection counters = new CounterCreationDataCollection(
PerformanceCountersManagerBase.GetCreationData<TManager>().ToArray());

if (PerformanceCounterCategory.Exists(PerformanceCountersManagerBase.GroupName))
PerformanceCounterCategory.Delete(PerformanceCountersManagerBase.

PerformanceCounterCategory.Create(PerformanceCountersManagerBase.GroupName,
"Group description",
PerformanceCounterCategoryType.SingleInstance, counters);
}

public static void Uninstall()
{
if (!PerformanceCounterCategory.Exists(PerformanceCountersManagerBase.GroupName))
return;

PerformanceCounterCategory.Delete(PerformanceCountersManagerBase.GroupName);
}

用于初始化服务和更新计数器的代码:
internal void Initialize(string name, string groupName)
{
_counter = new PerformanceCounter(groupName, name, false);
_counter.RawValue = 0;
}

internal void Increment()
{
if ((_counter == null) || _counter.ReadOnly)
return;

lock (_counter)
{
_counter.Increment();
}
}

更新 3
我更改了代码以通过 .NET 组件 PerformanceCounterInstaller 安装计数器,但没有任何更改。旧计数器正常工作,而新创建的计数器不起作用,尝试记录它们会导致事件日志中出现确切的错误(警告)消息。安装程序创建代码如下:
public static PerformanceCounterInstaller GetInstaller()
{
PerformanceCounterGroupAttribute group
= PerformanceCountersManagerBase.ExtractGroupSettings(typeof(TManager));

PerformanceCounterInstaller installer = new PerformanceCounterInstaller();
installer.CategoryName = group.Name;
installer.CategoryHelp = group.Description;
installer.CategoryType = PerformanceCounterCategoryType.SingleInstance;
installer.UninstallAction = UninstallAction.Remove;
installer.Counters.AddRange(PerformanceCountersManagerBase.GetCreationData<TManager>().ToArray());

return installer;
}

最佳答案

Perf 计数器基于共享内存段。当有人仍然拥有共享内存段的句柄时,我看到了类似的问题。这可以包括 perfmon 工具本身。您可以使用 handle 实用程序查看谁在占用共享内存。
您不需要重新启动,因此请尝试查看此问题是否因您先关闭 perfmon 然后重新创建计数器而消失。还要确保您的服务没有运行。

关于.net - 性能计数器已创建但在 Windows 重新启动之前无法工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3734277/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com