![对使用 nanosleep 的 KVM 主机和客户机 CPU 使用率之间的差异感到困惑](https://linux22.com/image/742909/%E5%AF%B9%E4%BD%BF%E7%94%A8%20nanosleep%20%E7%9A%84%20KVM%20%E4%B8%BB%E6%9C%BA%E5%92%8C%E5%AE%A2%E6%88%B7%E6%9C%BA%20CPU%20%E4%BD%BF%E7%94%A8%E7%8E%87%E4%B9%8B%E9%97%B4%E7%9A%84%E5%B7%AE%E5%BC%82%E6%84%9F%E5%88%B0%E5%9B%B0%E6%83%91.png)
一段时间以来,我一直被 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
文档这里,然后看一下以下资源: