请教一个虚拟化的问题, kvm 虚拟机中运行一个简单的 C 程序,导致服务主机中 CPU 占用 100%。 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
rayjoy
V2EX    Linux

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

  •  
  •   rayjoy 2019-07-25 17:28:03 +08:00 6391 次点击
    这是一个创建于 2339 天前的主题,其中的信息可能已经有所发展或是发生改变。

    问题描述:

    • Linux 主机,运行操作系统为 ubuntu 18.04 server,cpu:intel 8700。
    • kvm 虚拟机操作系统 archlinux。
    • 写了一个简单的 C 程序:
    #include <stdio.h> #include <unistd.h> int main(int argc, char** argv) { int i = 0; while(1){ i++; usleep(100); } } 
    • 将该程序在虚拟机中运行,在虚拟机中使用 top 查看,该进程 cpu 占用率约为 1~2%。
    • 此时在 ubuntu 主机中使用 top 查看,发现 qemu-system-x86_64 进程 cpu 占用率在 100%左右。
    • 求解答,是什么原因导致了虚拟机 cpu 占用率正常,而 ubuntu 主机的 cpu 占用率这么高? CPU 切换?有没有人碰到过这样的问题?
    25 条回复    2023-02-20 14:02:32 +08:00
    rayjoy
        1
    rayjoy  
    OP
       2019-07-25 17:30:19 +08:00
    不知道节点对不对,没发现虚拟化节点。
    weifengzi2009
        2
    weifengzi2009  
       2019-07-25 17:54:53 +08:00
    不确定具体怎么回事,但是有没有可能是 qemu 如何实现时钟、interrupt 的问题?比如 qemu 本身必须 busy wait 去实现虚拟机里的 sleep ?
    rayjoy
        3
    rayjoy  
    OP
       2019-07-25 18:01:29 +08:00
    @weifengzi2009 不清楚,试了两台机器,都有这个问题,这样的话好多类似机制程序就无法安全高效的在虚拟机中运行了,改了好多配置,都搞不定这个问题。
    pagxir
        4
    pagxir  
       2019-07-25 18:39:37 +08:00 via Android
    usleep 单位是微妙,sleep 0.1 毫秒正常情况下没有人会这么干。0.1 毫秒完成 userspace 与 kernel 的切换,同时还把 CPU 控制权交个宿主机,宿主机完成调度之后还能再切换回来这个效率以及很高了。还有宿主机未必是在全速运行的。
    rayjoy
        5
    rayjoy  
    OP
       2019-07-25 19:14:13 +08:00 via iPhone
    @pagxir 看起来有道理。公司的一个程序,跑在了虚拟机上,导致了 host 主机 CPU 占用很高,我定位了一下,应该是 usleep 导致,这样写程序肯定不太合适,不过这个程序在物理机上运行的话,cpu 占用率是很低的,难道时间都耗费在了宿主机和虚拟机的处理器切换上?
    ResetTrap
        6
    ResetTrap  
       2019-07-25 19:23:49 +08:00
    是不是 sleep 以后中断,然后唤醒,一直中断 /唤醒导致的?去除 sleep 试试看
    opengps
        7
    opengps  
       2019-07-25 19:26:51 +08:00 via Android
    虚拟机也不能这么慢,难不成母鸡 cpu 用满了?
    rayjoy
        8
    rayjoy  
    OP
       2019-07-25 19:32:43 +08:00 via iPhone
    @ResetTrap 去掉 usleep,主机和虚拟机,都有一个 cpu 是 100%,这样是正常现象。在物理机上跑也是百分之百,因为是无间歇的死循环了。
    rayjoy
        9
    rayjoy  
    OP
       2019-07-25 19:35:08 +08:00 via iPhone
    @opengps 在我自用的 Windows 主机上,我用 vmware 开了一个虚拟机,虚拟机系统也是 archlinux,跑这个程序,没有问题,Windows 主机和虚拟机处理器占用都很低。
    pkookp8
        10
    pkookp8  
       2019-07-25 19:45:45 +08:00 via Android
    1.top 是采样,不能真实地反应 cpu 情况
    2.不知道 qemu 的实现方式,是不是 qemu 的调度策略导致的
    3.gdb 或者 strace 或别的方法看看 qemu 的系统调用试试,以及在 qemu 里看看进程的调用试试?
    rayjoy
        11
    rayjoy  
    OP
       2019-07-25 19:52:07 +08:00 via iPhone
    @pkookp8 这个是真的高,处理器温度从 40 升到了 60,风扇转速也上去了。明天用 gdb 追踪分析一下。
    zhao305149619
        12
    zhao305149619  
       2019-07-25 20:03:14 +08:00
    @rayjoy 不用 GDB 吧,sar -w 看一下 context
    zhao305149619
        13
    zhao305149619  
       2019-07-25 20:04:51 +08:00   1
    pidstat -w -p <pid> 1 12 看一下也可以,或者看一下 proc 下面的 sack
    rayjoy
        14
    rayjoy  
    OP
       2019-07-25 21:30:56 +08:00
    @zhao305149619 明天去公司试一下。
    chinesestudio
        15
    chinesestudio  
       2019-07-25 22:42:15 +08:00 via Android
    你把 Ubuntu 换成 debian centos 也许就解决了
    msg7086
        16
    msg7086  
       2019-07-25 23:24:06 +08:00
    @chinesestudio 有任何一丁点的理论依据吗?
    chinesestudio
        17
    chinesestudio  
       2019-07-25 23:27:24 +08:00 via Android
    @msg7086 没有 只是个人建议 。Ubuntu 本身占用资源多 这是肯定的
    www5070504
        18
    www5070504  
       2019-07-26 10:11:30 +08:00
    配额多少 按理说应该虚拟机的每个 vcpu 都只是宿主机上的一个线程
    rayjoy
        19
    rayjoy  
    OP
       2019-07-26 11:06:35 +08:00
    @www5070504 虚拟机是四核 4G
    rayjoy
        20
    rayjoy  
    OP
       2019-07-26 11:08:36 +08:00
    @www5070504 还有一个机器,主机 cpu 是 2620v3, os:ubuntu16.04 ,虚拟机是 1cpu,1G,ubuntu16.04 ,也是同样的问题。
    clariion
        21
    clariion  
       2019-07-26 21:52:20 +08:00   1
    亲测。
    vm:
    #top -p 14971
    top - 21:42:17 up 9 days, 11:02, 5 users, load average: 0.08, 0.03, 0.02
    Tasks: 1 total, 1 running, 0 sleeping, 0 stopped, 0 zombie
    %Cpu(s): 0.9 us, 0.4 sy, 0.0 ni, 97.7 id, 0.9 wa, 0.0 hi, 0.0 si, 0.0 st
    KiB Mem : 4046344 total, 268972 free, 466868 used, 3310504 buff/cache
    KiB Swap: 4194300 total, 4193488 free, 812 used. 3216164 avail Mem

    PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
    14971 root 20 0 4220 648 580 R 8.3 0.0 0:01.74 a.out

    cpu 占用率基本在 7%左右波动


    host:
    #top -p 104384
    top - 21:44:37 up 36 days, 12:04, 1 user, load average: 3.64, 3.80, 3.80
    Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie
    %Cpu(s): 9.4 us, 1.7 sy, 0.0 ni, 88.8 id, 0.1 wa, 0.0 hi, 0.0 si, 0.0 st
    KiB Mem: 65729244 total, 64605832 used, 1123412 free, 189524 buffers
    KiB Swap: 66875388 total, 4046752 used, 62828636 free. 24522884 cached Mem

    PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
    104384 libvirt+ 20 0 9332380 3.898g 5068 S 30.3 6.2 1530:39 qemu-system-x86

    CPU 占用率基本稳定在 30 左右,观察 1 分钟



    将 vm 里 a.out kill 掉。

    host:

    top - 21:47:45 up 36 days, 12:07, 1 user, load average: 3.99, 3.77, 3.77
    Tasks: 1 total, 0 running, 1 sleeping, 0 stopped, 0 zombie
    %Cpu(s): 7.9 us, 1.7 sy, 0.0 ni, 89.9 id, 0.4 wa, 0.0 hi, 0.0 si, 0.0 st
    KiB Mem: 65729244 total, 64600260 used, 1128984 free, 189736 buffers
    KiB Swap: 66875388 total, 4046704 used, 62828684 free. 24526240 cached Mem

    PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
    104384 libvirt+ 20 0 9332380 3.898g 5068 S 11.0 6.2 1531:24 qemu-system-x86


    CPU 占用率降为 10%左右。




    附:
    host cpu 为 Intel(R) Xeon(R) CPU E5-2650 v3 @ 2.30GHz,40 Core
    vm 里分了 4 Core。
    zerozerone
        22
    zerozerone  
       2019-08-13 15:02:22 +08:00
    楼主最后解决了么,是什么原因导致的呢
    rayjoy
        23
    rayjoy  
    OP
       2019-08-14 11:44:25 +08:00   1
    @zerozerone 没有解决,我把程序改了,这里不再使用 nanosleep。原因猜想是 nanosleep 导致了宿主机和虚拟机之间的频繁切换。。。只是猜想。
    rayjoy
        24
    rayjoy  
    OP
       2019-08-14 11:45:26 +08:00
    @zerozerone 写错了,不是 nanosleep 是 usleep。
    fishg
        25
    fishg  
       2023-02-20 14:02:32 +08:00
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2777 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 02:45 PVG 10:45 LAX 18:45 JFK 21:45
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86