.NET 4.0和Windows 7上的PerformanceCounters
我有一个在VS2008和Vista上正常工作的程序,但是我在Windows 7和VS2010/.NET Framework 4.0上尝试它,但它不起作用.最终问题是 system.invalidoperationException带有消息"无法加载计数器数据,因为从注册表中读取了无效的索引". 我可以使用下面显示的非常简单的程序来复制此内容: class Program { static void Main(string[] args) { foreach (var pc in System.Diagnostics.PerformanceCounterCategory.GetCategories()) { Console.WriteLine(pc.CategoryName); } } } 我确实确保正在以管理员的身份运行该程序.我是否使用附加的VS/调试器运行它都没关系.我没
0 2024-01-07
编程技术问答社区
要求的性能计数器不是一个自定义的计数器,它必须被初始化为只读的。
每当我尝试调试.NET Windows Service应用程序时,我会在性能计数器上重复出现有关ReadOnly属性的错误.该应用程序在X86 Windows Vista或X86 Windows 2003上正常工作. 在管理模式下,我已经在64位和32位命令行Vcvars.bat上运行了相关的installutil Incocations.我得到 没有错误设置类别和每个perf计数器 .但是,无论我是否将perf cttrs设置为无读,我都会明白: 请求的性能计数器是 不是自定义柜台,必须是 初始化为可读. 更新 我用32位版本的Windows 7重新安装了机器,而且我仍然遇到此错误.唯一改变的是从Windows Vista业务转移到Windows 7 Professional.这响了吗? 解决方案 这是由于性能计数器(或类别)不存在, 但是带有可怕的错误消息. 看一下柜台的完美,它应该在相关的机器上缺少. 我发现有时会发生在.net perf
4 2024-01-07
编程技术问答社区
以编程方式读取w3wp .Net性能计数器实例
使用性能工具查看.NET性能计数器时,我可以看到列出的Web进程性能计数器(W3WP,W3WP#1): 但是,当我以管理员的身份运行以下代码时: var instanceNames = new PerformanceCounterCategory(".NET CLR Memory") .GetInstanceNames() .OrderBy(x => x); foreach (var name in instanceNames) { Console.WriteLine(name); } 这是我看到的输出: 请注意,未列出W3WP计数器.有人知道为什么是这种情况以及如何解决吗? 解决方案 解决方案是您必须以与网站相同的位置运行该应用程序.由于我的网站是64位,因此我需要以64位模式运行控制台应用程序.要右键单击"控制台应用程序"项目,请单击"构建"选项卡中的属性,请在
4 2024-01-07
编程技术问答社区
为什么我需要成为管理员来读取.NET CLR内存性能计数器?
我找不到" .net CLR内存"计数器类别(在C#中),如这个问题.作为管理员运行解决了问题. 但是为什么我需要这样做?还有其他选择吗?我希望可以读取访问,以查看我的应用程序中的GC生成收藏,以进行分析.优选而不必使用Admin特权运行该应用程序. 编辑: 我可以在"性能监视器"工具中看到内存性能计数器,而无需作为管理员运行 如果不作为管理员运行,我可以通过编程方式缩短(但没有空)性能计数器类别列表,但这不包括我感兴趣的. 我们的公司设置有点疯狂:我有管理特权,但不是本地管理员组的成员.我确实有特权增加自己,但是每30分钟左右,自动化过程就会消除我.不知道这是否会影响任何事情 将自己添加到Performance Monitor用户组中没有效果(除非我首先重新启动) 解决方案 您只需要在group performance Monitor用户中.只需将您的非管理用户添加到该组就应该解决问题. 其他解决方案 性能计数器是安全危险.常见的攻击技术之一是观
6 2024-01-06
编程技术问答社区
一个线程的cpu使用率
如何获取c# 中的.NET中线程的CPU使用情况 解决方案 检查如何获得Windows(Win32)上的每个线程的CPU使用量和 pinvoke 为此. SO:我如何获得C#中的a thread 的CPU用法(托管代码)?,这是重复的.
6 2024-01-06
编程技术问答社区
使用PerformanceCounters针对特定驱动器
大家,我有以下代码: using System.Diagnostics; private PerformanceCounter diskRead = new PerformanceCounter(); private PerformanceCounter diskWrite = new PerformanceCounter(); diskRead.CategoryName = "PhysicalDisk"; diskRead.CounterName = "Disk Reads/sec"; diskRead.InstanceName = "_Total"; diskWrite.CategoryName = "PhysicalDisk"; diskWrite.CounterName = "Disk Writes/sec"; diskWrite.InstanceName = "_Total"; 此代码可跟踪磁盘读取的每秒读取,并且磁盘每秒写入,并且效果很好.我的问题是,如何跟踪
2 2024-01-05
编程技术问答社区
.net性能计数器-进程(w3wp)/%处理器时间
在性能测试期间,我发现Process(w3wp)\% Processor Time的值大于100.有些值是 237.1436486 312.5338052 341.2373994 264.4097661 191.6237736 我认为此值代表W3WP过程的CPU使用情况.我不明白为什么值大于100%. 解决方案 如果您有多个内核,则可以超过100,这是 处理器(核心或虚拟核心)的处理器总和,因此超过100是正常的(100*numberOfCores>)是nax). 使用计数器的Process(w3wp_Total)版本,如果您想要总CPU%,则在100处限制. 其他解决方案 正如Nick Craver已经说过的那样,这是所有处理器(逻辑或物理)的合并价值.要获得0%至100%之间的值,将其除以处理器的数量(例如Environment.ProcessorCount,假设您想在.NET代码中进行).
4 2024-01-05
编程技术问答社区
C#: 为".NET CLR内存类别 "访问PerformanceCounters
我正在尝试访问位于实例化类别 new PerformanceCounter(".NET CLR Memory", "# bytes in all heaps", Process.GetCurrentProcess().ProcessName); 我尝试使用以下代码循环浏览类别和计数器 string[] categories = PerformanceCounterCategory.GetCategories().Select(c => c.CategoryName).OrderBy(s => s).ToArray(); string toInspect = string.Join(",\r\n", categories); System.Text.StringBuilder interestingToInspect = new System.Text.StringBuilder(); string[] interestingCategories = categories.W
0 2024-01-05
编程技术问答社区
关于高分辨率性能计数器及其与.NET秒表有关的存在的解释?
在静态Stopwatch构造函数中,我们可以看到以下代码,该代码基本检查是否存在高分辨率性能计数器. static Stopwatch() { if (!SafeNativeMethods.QueryPerformanceFrequency(out Frequency)) { IsHighResolution = false; Frequency = 0x989680L; tickFrequency = 1.0; } else { IsHighResolution = true; tickFrequency = 10000000.0; tickFrequency /= (double) Frequency; } } 在msdn上说QueryPerformanceFrequency: 如果存在,则检索高分辨率性能计数器的频率
0 2024-01-05
编程技术问答社区
损坏的性能计数器?
性能计数器是邪恶的.不要使用它们. if(PerformanceCounterCategory.Exists("ILoveYou") ) // is true { PerformanceCounterCategory.Delete("ILoveYou"); //throws exception The **configuration registry** key is invalid } at System.Diagnostics.PerformanceCounterLib.RegisterFiles(String arg0, Boolean unregister) at System.Diagnostics.PerformanceCounterLib.UnregisterCategory(String categoryName) at System.Diagnostics.PerformanceCounterCategory.Delete(String c
4 2024-01-05
编程技术问答社区
性能计数器的平均计时器如何与它们的基数相关联?
我正在为我的C#项目添加一些性能计数器,并正在创建一个新的PerformanceCounterCategory.在此类别中,我想拥有多个跟踪不同事物的计数器/计时器.我需要使用多个平均计时器,并试图了解平均值计数器如何与正确的Averagetimer32计数器相关联时,当CoutnerCreationDataCollection中有多个计数器时. 有几个问题: 1.首先,这是正确的方法吗?我发现所有样本只有一个平均计时器. 2.如果第一个问题的答案是肯定的,那么我认为在Averagetimer32之后添加到集合中的第一个平均值计数器是否正确?我确实在文章中找到了需要按顺序添加的文章的参考. 这是我要做的示例: var dataColl = new CounterCreationDataCollection { new CounterCreationData { CounterType = PerformanceCounterType.AverageT
0 2024-01-05
编程技术问答社区
如何在System.Diagnostics.Stopwatch中使用AverageTimer32和AverageBase性能计数器?
当我执行以下程序并查看性能对抗时,结果对我来说没有意义.当我期望〜0.1或〜100. 我的问题是什么? 代码 class Program { const string CategoryName = "____Test Category"; const string CounterName = "Average Operation Time"; const string BaseCounterName = "Average Operation Time Base"; static void Main(string[] args) { if (PerformanceCounterCategory.Exists(CategoryName)) PerformanceCounterCategory.Delete(CategoryName); var counterDataCollect
6 2024-01-04
编程技术问答社区
如何在我已经创建的类别中添加性能计数器?
我创建了一个performanceCounterCategory,如下 var category = PerformanceCounterCategory.Create("MyCat", "Cat Help", PerformanceCounterCategoryType.SingleInstance, "MyCounter", "Counter Help); 如何向类别添加新的计数器来监视另一个项目? 我找不到API. 解决方案 我对此进行了一项研究,似乎不可能将计数器添加到现有类别中,您需要做的才能重新创建同一类别,并添加新的计数器. 其他解决方案 PerformanceCounter lCounter = new PerformanceCounter(Category, CounterName, false); lCounter.Machi
0 2024-01-04
编程技术问答社区
如何在没有PerformanceCounter的情况下获得可用内存和CPU的使用情况?
我有Windows XP,该XP不提供类别处理器或内存,我无法带上它来显示它们 (我不允许编辑注册表或更改系统文件) 有什么方法可以在不使用Perfortancecount的情况下获取实际的CPU使用和免费内存? 我在Windows XP SP2 上使用.NET 3.5和C# 解决方案 您可以使用本机Win32 API调用吗?如果是这样,那么他们将在您之后提供信息. 请参阅以下文章: codeproject:codeprowloct:codeproject:使用C#调用API函数 其他解决方案 要使用WMI获取无性计数器的处理器使用情况,请查看Win32_Processor类.如果您想查看可用的总内存,请使用GC.GetTotalMemory - Process.GetCurrentProcess().PrivateMemorySize64; 其他解决方案 如果您使用的是.NET 4,并且您只对当前的应用域进行的操作感兴趣,那么您可以使用此信息:
0 2024-01-04
编程技术问答社区
计算一个Windows进程的CPU使用率?
给定一个流程ID,如何使用C#? 从此过程中获得CPU加载 我尝试使用 c#计算CPU用法以计算CPU用法的CPU用法特定的应用程序 我还试图在时间范围内手动将该过程的总CPU的两个值分别为总CPU,并将Delta-CPU时间与delta-total-time分开. 这两种方法一开始似乎都可以正常工作,但是如果我在Windows任务管理器旁边放置我的应用程序,我的应用程序总是显示大约是任务管理器的两倍.我试图以各种时间段从10ms到10秒进行更新,并始终获得相同的结果. 嗯,当我写这本书时意识到这可能是某种双核问题... 解决方案 如果您有两个内核,那么任务管理器将将100%CPU报告为50%.那可能就是您的问题.
16 2024-01-04
编程技术问答社区
如何在IIS中使用性能计数器和WCF服务?
嗨, 我在IIS7中有WCF服务,该服务与TCP通过Winform应用程序进行通信(WAS),现在我需要监视性能. 我已将其添加到web.config文件: 打开了性能监视器后,我与Winform进行了几次测试,以确保激活该服务. 我然后打开性能监视器(LIVE),右键单击并添加计数器.我扩展了ServiceModelService 4.0.0.0,然后选择调用和调用持续时间,我还选择了我的服务(SVC),该服务(SVC)在选定的对象listbox实例中,然后单击添加按钮. . 在ServiceModeLoperation 4.0.0.0下选择呼叫和呼叫持续时间时,没有实例或操作可以选择吗? ServiceModelendPoint 4.0.0.0? 也是如此 单击OK时,将添加两个计数器(ServiceMod
2 2024-01-04
编程技术问答社区
如何在不删除旧的计数器的情况下为现有的性能计数器类别添加一个新的计数器?
我有一个自定义计数器类别,我需要添加一个新计数器,而无需删除或重置任何现有计数器.我怎样才能做到这一点? 我尝试使用Counterexists(),但是即使在创建计数器之后,我仍能将其关联到CounterCreationDataCollection项目并将其关联到我现有的计数器类别? ? 解决方案 我发现的最佳方法是,尤其是因为似乎没有太多有关此主题的信息,就是保留现有的原始值,然后在删除类别后重新应用它们并重新应用它们 - 创建. /// /// When deleting the Category, need to preserve the existing counter values /// static Dictionary GetPreservedValues(string category, XmlNodeList nodes) { Dictionary
4 2024-01-04
编程技术问答社区
从C#中读取性能计数器。实例不存在于指定的类别中
我正在尝试从另一个.NET 4应用程序中读取运行.NET 4应用程序的许多性能计数器. 一些计数器,例如Process\% Processor Time和Process\Private Bytes工作正常.但是,一旦我尝试从.NET类别之一阅读性能计数器,例如.NET CLR Memory\# Gen 0 Collections,我就会得到以下例外: Instance 'MyApplication' does not exist in the specified Category 我打电话: new PerformanceCounterCategory(".NET CLR Memory").GetInstanceNames() 它返回一小部分实例,而myapplication确实不在列表中.但是,当我在perfmon中查看性能计数器时,我在那里看到的实例列表相同/计数器更长,并且确实包括myapplication. 有人知道为什么我的应用程序不可见.net
26 2024-01-03
编程技术问答社区
是什么让PerformanceCounterCategory.Exists无限期地挂起?
我有一个使用性能计数器的应用程序,该应用程序已经工作了几个月.现在,在我的开发机和另一台开发人员机器上,当我致电PerformanceCounterCategory.exists时,它已经开始挂起.据我所知,它无限期地悬挂.我用作输入的哪个类别并不重要,而使用API​​的其他应用则表现出相同的行为. 调试(使用MS符号服务器)表明,它是对Microsoft.win32.RegistryKey的调用.进一步的调查表明,这条线悬挂: while (Win32Native.ERROR_MORE_DATA == (r = Win32Native.RegQueryValueEx(hkey, name, null, ref type, blob, ref sizeInput))) { 这基本上是一个循环,它试图为性能计数器数据分配足够的内存.它从size = 65000开始,进行了一些迭代.在第4个电话中,当size = 520000,Win32Native.RegQueryVal
2 2024-01-03
编程技术问答社区
列出所有进程及其当前的内存和CPU消耗?
如何在C#中获取所有进程的列表,然后在每个过程中,当前内存和CPU消耗? 示例代码非常感谢. 解决方案 Process类getProcesses方法将使您列举运行过程并列出一堆统计信息,例如内存使用和CPU时间.查看属性属性下的文档. 内存使用是一个复杂的问题.确实没有一个数字,可以描述用法.请参阅Russinovich关于此事的出色系列.第一部分在这里: http://blogs.technet.com/markrussinovich/archive/2008/07/21/3092070.aspx
0 2024-01-03
编程技术问答社区