一段时间以来,我一直被 KVM 主机和客户机报告的 CPU 使用率之间的巨大差异所困扰。客户机报告基本处于空闲状态,但主机报告一个虚拟核心的 CPU 使用率为 100%。
我最终将其归结为一个行为不当的应用程序,该应用程序最终在客户机的紧密循环中调用了一个非常短的 nanosleep。以下 C 代码将可靠地复制该问题:
#include <time.h>
void main() {
while (1) {
struct timespec ts = {0, 1024*100};
nanosleep(&ts, NULL);
}
}
如果我在主机上运行这个程序,CPU 基本处于空闲状态。如果我在客户机上运行它,客户机认为它处于空闲状态,但主机却报告一个核心已完全使用。
我确实想让应用程序表现得更好,但我想了解不匹配的根本原因。我的 KVM 设置中是否有可能配置错误导致这种情况,或者这是预期的结果吗?
在我的测试设置中,主机是 Ubuntu 18.10,客户机是 CentOS 6。我也能够使用其他客户操作系统复制此操作。
答案1
nanosleep
可能会迫使客户操作系统非常频繁地读取 CPU TSC,从而导致主机系统负载过大。但是,这非常依赖于平台和设置。
我建议先阅读 libvirttimer
和stimer
文档这里,然后看一下以下资源: