对使用 nanosleep 的 KVM 主机和客户机 CPU 使用率之间的差异感到困惑

对使用 nanosleep 的 KVM 主机和客户机 CPU 使用率之间的差异感到困惑

一段时间以来,我一直被 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,从而导致主机系统负载过大。但是,这非常依赖于平台和设置。

我建议先阅读 libvirttimerstimer文档这里,然后看一下以下资源:

相关内容