获取虚拟机的总CPU百分比始终为零

时间:2016-03-15 07:36:13

标签: c# performancecounter hyper-v

我试图在虚拟机上每隔x秒获取总cpu使用量。我找到了这段代码:

  var cpuCounter = new PerformanceCounter("Processor", "% Processor Time", "_Total", true);

   WriteCpuUsageToFile(cpuCounter.NextValue() + "%");

每次计时器触发时,我的值都为零。

2016-03-15T02:29:26 0%
2016-03-15T02:29:45 0%
2016-03-15T02:30:05 0%
2016-03-15T02:30:25 0%
2016-03-15T02:30:45 0%

服务器平均达到20%。

我正在为vm分配~8个核心,具体取决于vm。我是否需要使用C#以不同方式获取虚拟机的值?

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

更新

虽然旧答案很有趣,但它并没有解决OP的问题。

问题(在评论中的一些屏幕截图中找到)是OP在每次调用PerformanceCounter时实例化NextValue,因此它不会让计数器收集值。

正确的解决方案是实例化PerformanceCounter 一次,并在同一个实例上多次调用NextValue()

对于希望有趣的信息,旧答案保留在下方,但它适用于主机,而不适用于来宾

如此处所述:https://msdn.microsoft.com/en-us/library/cc768535(v=bts.10).aspx

  

衡量客户操作系统处理器利用率 - 传统上,可以使用“\ Processor(*)\%Processor Time”性能监视器计数器来测量处理器性能。这不是用于评估客户机操作系统的处理器利用率的准确计数器,因为Hyper-V会测量并报告此值相对于分配给虚拟机的处理器数量。

...(冗长的解释,为什么它不是一个好主意,实际上可能是一个瓶颈,你可以在链接上阅读)......

  

要准确衡量客户机操作系统的处理器利用率,请使用Hyper-V主机操作系统上的“\ Hyper-V管理程序逻辑处理器(_Total)\%总运行时间”性能监视器计数器。使用以下阈值使用“\ Hyper-V Hypervisor逻辑处理器(_Total)\%Total Run Time”性能监视器计数器评估客户机操作系统处理器利用率

所以我没有对此进行过测试,但是

编辑: 我实际测试过它并且有效,所以:

var cpuCounter = new PerformanceCounter("Hyper-V Hypervisor Logical Processor"
        , "% Total Run Time"
        , "_Total", true);

答案 1 :(得分:1)

使用libvirt api访问主机cpu使用情况,我编写了Python代码,将所有数据放入一个csv文件中。 Python代码链接:https://github.com/leonardo329cf/VMMeter-libvirt