我的问题是某些性能计数器类别有时似乎丢失了,我不明白为什么。
下面的代码将引发异常,如下所示:
无法查找性能类别
错误消息:类别不存在。类别名称:HP EVA物理磁盘目标上的组类别列表:ServiceModel服务4.0。bla bla
打印输出包含一长串性能计数器,但不包括我所追求的。如果我查看perfmon.exe,则可以找到丢失的类别一次。
我正在使用以下代码来查找类别内的不同计数器。
public static string[] GetPerformanceCategory(string CategoryName)
{
//Console.WriteLine("CategoryName to Search for: " + CategoryName);
if (string.IsNullOrEmpty(CategoryName))
throw new NullReferenceException("CategoryName is empty");
try
{
PerformanceCounterCategory perfCat = new PerformanceCounterCategory(CategoryName);
string[] catInstances = perfCat.GetInstanceNames();
return catInstances;
}
catch(Exception Ex)
{
StringBuilder ErrorMsg = new StringBuilder();
ErrorMsg.AppendLine("Failed to lookup Preformance Category");
ErrorMsg.AppendLine("Error Msg: " + Ex.Message);
ErrorMsg.AppendLine("CategoryName: " + CategoryName);
ErrorMsg.AppendLine("Category list on target:");
StringBuilder CatList = new StringBuilder();
var categories = PerformanceCounterCategory.GetCategories();
foreach (var Cat in categories)
CatList.AppendLine(Cat.CategoryName);
ErrorMsg.AppendLine(CatList.ToString());
Logger.WriteToLog(ErrorMsg.ToString(), EventLogEntryType.Error);
return null;
}
}
问题归结为,是否有一些“魔术”可以使性能计数器消失?还是我需要做一些特定的事情?
我遇到了完全相同的问题,这就是我的解决方法:
服务器体系结构(x86或x64)和.net(c#)构建目标必须相同,否则您的代码将无法访问所有性能计数器(如果构建目标和服务器不同,则仅性能计数器的子集可用) 。
因此,在Visual Studio中,右键单击您的项目(在解决方案资源管理器中),然后选择“属性”,然后转到“构建”并选择x64作为平台目标(如果您的服务器在x64中,则选择x86)。
更具体一点,您可以检查事件查看器并查找PerfLib事件。
就我而言,它们被标记为错误。
然后,环顾四周后,我发现了上面解释的两个命令。就我而言,问题出在perfOS上。 (您始终可以运行lodctr /q:Perflib
来检查已禁用的内容。
然后,运行:lodctr / e:perfOS(或更改禁用的任何服务的perfOS)
这将会(至少对我有用)
TLDR:以管理员身份运行lodctr /q:perfOs
和lodctr /e:perfOS
。>