我试图在虚拟机上每隔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#以不同方式获取虚拟机的值?
感谢您的帮助!
答案 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