【发布时间】:2015-12-25 19:19:49
【问题描述】:
我正在尝试推出自己的系统性能监视器,以便在过载的情况下延迟执行部分服务器代码(在 IIS 下运行一些 Web 服务)。我要解决的第一件事是 CPU 过载。
我知道PerformanceCounter 的问题是必须在第一次调用NextValue() 时对其进行初始化(请参阅this question 等),因此我实现了一个非常简单的静态类,可以将数据缓存一秒钟,并且实际上每秒或更少访问一次PerformanceCounter 对象。我知道它目前不是线程安全的,但在当前的原型设计阶段我并不关心。
所以,说了这么多,这是我当前的代码:
public static class SystemPerformance
{
private static PerformanceCounter TotalProcessorTimeCounter =
new PerformanceCounter("Process", "% Processor Time", "_Total");
private static DateTime CacheRefreshed;
private static float CachedValue = 0f;
private const float MIN_DELTA_SECONDS = 1f;
public static float ReadCPU()
{
if ((DateTime.Now - CacheRefreshed).TotalSeconds > MIN_DELTA_SECONDS)
// Stale cache
return ReadFromCounter();
// Good cache
return CachedValue;
}
private static float ReadFromCounter()
{
CachedValue = TotalProcessorTimeCounter.NextValue();
CacheRefreshed = DateTime.Now;
return CachedValue;
}
}
...在我执行之前,这一切都很好而且很花哨。我尝试在具有 4 核的 Windows 10 x64 VM 和具有 4 核的 Windows 7 x64 Iron 上运行它——在这两种情况下,无论我做什么,返回值都徘徊在 400 左右。
我得到的典型值在 395–401 范围内,偶尔下降到 365 或跳到 405。我读取的值与我测试的任何一台机器上的实际 CPU 负载没有任何关系,如任务管理器、性能监视器或实际上的常识所示。
测试方法很简单:SystemPerformance.ReadCPU() 在简单的 Windows 表单中由按下按钮触发,输出显示在相同表单的文本框中。我在 CPU 准空闲时按下该按钮,并且在 其他进程 正在执行操作并加载 CPU 时按下它。
我做错了什么?这应该只返回我的应用程序线程的 CPU 使用率吗?我是否误解了数据?
【问题讨论】:
-
fyi
CacheRefreshed == null永远不会为真,因为DateTime不能为空。 -
好点,谢谢;从代码中删除了该测试。
-
“盘旋”,所以它改变了吗?还是恒定的?
-
如前所述,它会发生变化。如果您是在暗示技术上不准确的标题,我不想让它比现在更长。
标签: c# cpu-usage performancecounter