当考虑使用性能计数器作为我公司的基于.NET的站点时,我想知道使用它们的开销有多大.
我想让我的网站不断更新它的计数器,还是我最好只做我测量的时候?
设置性能计数器的开销通常不足以担心(设置共享内存区域和一些.NET对象,以及CLR开销,因为CLR实际上为您进行管理).这里我指的是像PerformanceCounter这样的类.
注册性能计数器的开销可能会相当慢,但通常不会引起关注,因为它打算在设置时发生一次,因为您想要更改机器范围的状态.你做的任何复制都会相形见绌.它通常不是你想在运行时做的事情.这里我指的是PerformanceCounterInstaller.
更新性能计数器的开销通常归结为在共享存储器上执行互锁操作的成本.这比正常的内存访问慢,但它是一个处理器原语(这就是它如何在包括缓存在内的整个内存子系统中获得原子操作).一般来说,这个成本并不高.它可能是正常内存操作的10倍,可能更糟糕,具体取决于更新以及线程和CPU之间的争用情况.但考虑到这一点,除了与原子更新进行跨进程通信的互锁操作以及没有锁定之外,实际上不可能做得更好.这里我指的是PerformanceCounter.Increment和类似的方法.
读取性能计数器的开销通常是从共享内存中读取.正如其他人所说的那样,你想在合理的时间内进行采样(就像任何其他采样一样),但只要想到PerfMon并尝试将采样保持在人体尺度上(想想秒而不是毫秒),你可能根本没有问题.
最后,体验的吸引力:性能计数器非常轻巧,它们可以在Windows中的任何地方使用,从内核到驱动程序再到用户应用程序.微软在内部依赖它们.
建议:性能计数器的真正问题是理解中的学习曲线(这是适度的)和衡量正确事物的一个(看起来很容易,但通常你会弄错).
更新时性能影响可以忽略不计.微软的意图是你总是写入性能计数器.它是监视(或捕获)那些会导致性能下降的性能计数器.因此,只有当您使用像perfmon这样的东西来捕获数据时.
实际上,性能计数器对象仅具有"在测量时执行此操作"的效果.
我已经测试了很多.
在一台旧的compaq 1Ghz 1处理器机器上,我能够创建大约10,000个计数器并远程监控它们的CPU使用率约为20%.这些不是自定义计数器,只是检查CPU或其他什么.
基本上,你可以监控任何体面的新机器上的所有计数器,影响很小.
对象的实例化可能需要很长时间,几秒到几分钟.我建议你为你收集的所有计数器多线程,否则你的应用程序将永远坐在那里创建这些对象.一旦你创建它需要这么长时间,不确定MS会做什么,但你可以在1000个计数器中使用1000个线程同时为1个计数器和1个线程执行此操作.
性能计数器只是指向共享内存(也就是内存映射文件)中4/8字节的指针,因此它们的成本与访问int/long变量非常相似.