请教一个虚拟化的问题, kvm 虚拟机中运行一个简单的 C 程序,导致服务主机中 CPU 占用 100%。

2019-07-25 17:28:03 +08:00
 rayjoy

问题描述:

#include <stdio.h>
#include <unistd.h>

int main(int argc, char** argv)
{
    int i = 0;

    while(1){
        i++;
        usleep(100);
    }
}
5418 次点击
所在节点    Linux
25 条回复
rayjoy
2019-07-25 17:30:19 +08:00
不知道节点对不对,没发现虚拟化节点。
weifengzi2009
2019-07-25 17:54:53 +08:00
不确定具体怎么回事,但是有没有可能是 qemu 如何实现时钟、interrupt 的问题?比如 qemu 本身必须 busy wait 去实现虚拟机里的 sleep ?
rayjoy
2019-07-25 18:01:29 +08:00
@weifengzi2009 不清楚,试了两台机器,都有这个问题,这样的话好多类似机制程序就无法安全高效的在虚拟机中运行了,改了好多配置,都搞不定这个问题。
pagxir
2019-07-25 18:39:37 +08:00
usleep 单位是微妙,sleep 0.1 毫秒正常情况下没有人会这么干。0.1 毫秒完成 userspace 与 kernel 的切换,同时还把 CPU 控制权交个宿主机,宿主机完成调度之后还能再切换回来这个效率以及很高了。还有宿主机未必是在全速运行的。
rayjoy
2019-07-25 19:14:13 +08:00
@pagxir 看起来有道理。公司的一个程序,跑在了虚拟机上,导致了 host 主机 CPU 占用很高,我定位了一下,应该是 usleep 导致,这样写程序肯定不太合适,不过这个程序在物理机上运行的话,cpu 占用率是很低的,难道时间都耗费在了宿主机和虚拟机的处理器切换上?
ResetTrap
2019-07-25 19:23:49 +08:00
是不是 sleep 以后中断,然后唤醒,一直中断 /唤醒导致的?去除 sleep 试试看
opengps
2019-07-25 19:26:51 +08:00
虚拟机也不能这么慢,难不成母鸡 cpu 用满了?
rayjoy
2019-07-25 19:32:43 +08:00
@ResetTrap 去掉 usleep,主机和虚拟机,都有一个 cpu 是 100%,这样是正常现象。在物理机上跑也是百分之百,因为是无间歇的死循环了。
rayjoy
2019-07-25 19:35:08 +08:00
@opengps 在我自用的 Windows 主机上,我用 vmware 开了一个虚拟机,虚拟机系统也是 archlinux,跑这个程序,没有问题,Windows 主机和虚拟机处理器占用都很低。
pkookp8
2019-07-25 19:45:45 +08:00
1.top 是采样,不能真实地反应 cpu 情况
2.不知道 qemu 的实现方式,是不是 qemu 的调度策略导致的
3.gdb 或者 strace 或别的方法看看 qemu 的系统调用试试,以及在 qemu 里看看进程的调用试试?
rayjoy
2019-07-25 19:52:07 +08:00
@pkookp8 这个是真的高,处理器温度从 40 升到了 60,风扇转速也上去了。明天用 gdb 追踪分析一下。
zhao305149619
2019-07-25 20:03:14 +08:00
@rayjoy 不用 GDB 吧,sar -w 看一下 context
zhao305149619
2019-07-25 20:04:51 +08:00
pidstat -w -p <pid> 1 12 看一下也可以,或者看一下 proc 下面的 stack
rayjoy
2019-07-25 21:30:56 +08:00
@zhao305149619 明天去公司试一下。
chinesestudio
2019-07-25 22:42:15 +08:00
你把 Ubuntu 换成 debian centos 也许就解决了
msg7086
2019-07-25 23:24:06 +08:00
@chinesestudio 有任何一丁点的理论依据吗?
chinesestudio
2019-07-25 23:27:24 +08:00
@msg7086 没有 只是个人建议 。Ubuntu 本身占用资源多 这是肯定的
www5070504
2019-07-26 10:11:30 +08:00
配额多少 按理说应该虚拟机的每个 vcpu 都只是宿主机上的一个线程
rayjoy
2019-07-26 11:06:35 +08:00
@www5070504 虚拟机是四核 4G
rayjoy
2019-07-26 11:08:36 +08:00
@www5070504 还有一个机器,主机 cpu 是 2620v3, os:ubuntu16.04 ,虚拟机是 1cpu,1G,ubuntu16.04 ,也是同样的问题。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/586200

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX