CPU配置
在QEMU中,“-smp
”参数是为了配置客户机的SMP系统。
在命令行中,关于配置SMP系统的参数如下:
-smp [cpus=]n[,maxcpus=cpus][,cores=cores][,threads=threads][,sockets=sockets]
主要参数说明:
- cpus用来设置客户机中使用的逻辑CPU的数量(默认值是1);
- maxcpus用来设置客户机的最大CPU的数量;
最多支持255个CPU,包含启动时处于下线状态的CPU数目;
- cores用来设置在一个socket上CPU core的数量;
- threads用来设置在一个CPU core上线程的数量;
- sockets用来设置客户机中看到的总socket的数量。
下面通过几个命令行例子来演示一下如何在客户机中使用SMP技术。
例1:不加smp参数,使用其默认值1,模拟了只有一个逻辑CPU的客户机系统。
qemu-system-x86_64 ubuntu14.04.img -vnc :1 -monitor stdio
在宿主机qemu monitor
中,可以使用“info cpus
”命令看到客户机中CPU状态:
从上面的输出可以看出,只有一个CPU,线程的ID是86374。
在宿主机
中,可以使用ps
命令来查看QEMU进程和线程:
ps -efL|grep qemu
ps命令主要用于监控后台进程的工作情况:
-e参数指定选择所有进程和环境变量;
-f参数指定选择打印出完全的各列;
-L参数指定打印出线程的ID和线程的个数;
ps -efL|head -1
“PID”表示进程的ID;
“PPID”表示父进程的ID;
“lwp”表示线程的ID;
“CMD”表示命令;
从上面的输出可以看出,客户机的进程ID是86371,它产生了一个线程作为客户机的vCPU运行在宿主机中,这个线程ID是86374。
在客户机
中,可以使用ls
命令来查看CPU情况:
从上面的输出可以看出,客户机系统识别到一个QEMU模拟的CPU(cpu0)。
在客户机
中,可以使用命令“cat /proc/cpuinfo
”查看CPU的具体信息:
从上面的输出可以看出,客户机系统识别到一个QEMU模拟的CPU。
例2:使用smp参数,模拟有两个逻辑CPU的客户机系统。
qemu-system-x86_64 -smp 2,maxcpus=4 ubuntu14.04.img -vnc :0 -monitor stdio
其中,“-smp 2”表示分配了2个虚拟的CPU,客户机最多可以使用4个CPU,但系统在启动时,只有两个CPU处于开启的状态。
在宿主机qemu monitor
中,可以使用“info cpus
”命令可以看到客户机中CPU状态:
从上面的输出可以看出,只有两个CPU,线程的ID分别是86539和86536。
在宿主机
中,可以使用ps
命令来查看QEMU进程和线程:
从上面的输出可以看出,客户机的进程ID是86536,结合qemu monitor的数据,可以发现它产生了两个线程作为客户机的vCPU运行在宿主机中,线程ID是86539和86536。
在客户机
中,可以使用ls
命令来查看CPU情况:
从上面的输出可以看出,在系统启动时,客户机系统识别到两个QEMU模拟的CPU(cpu0和cpu1)。
在客户机
中,可以使用命令“cat /proc/cpuinfo
”查看CPU的具体信息:
例3:使用smp参数,模拟有8个逻辑CPU的客户机系统,共有2个CPU socket,每个socket有两个核,每个核有两个线程。
qemu-system-x86_64 -smp 8,sockets=2,cores=2,threads=2 -vnc :0 -monitor stdio ubuntu14.04.img
在宿主机qemu monitor
中,可以使用“info cpus
”命令看到客户机中CPU状态:
不是每个CPU都在启动,有一些不用时会停止。
在客户机
中,可以使用命令“cat /proc/cpuinfo | grep 'processor' | sort | unip
”查看CPU的具体信息:
从上面输出可以,在客户机中有8个逻辑CPU,分别是cpu0-cpu7,共有2个CPU socket,每个socket有两个核,启用了超线程,每个核有两个线程。
在客户机
中,使用“cat /proc/cpuinfo | more
”命令查看第二个CPU数据:
例4:使用smp参数,模拟有4个逻辑CPU的客户机系统,共有2个CPU socket,每个socket有两个核。
qemu-system-x86_64 -smp 4,sockets=2,cores=2 -vnc :0 -monitor stdio ubuntu14.04.img
在宿主机qemu monitor
中,可以使用“info cpus
”命令看到客户机中CPU状态:
在客户机
中,可以使用命令“cat /proc/cpuinfo > cpuinfo
”查看CPU的具体信息:
(在vim
中搜索,在命令行输入“/
”,然后输入要搜索的内容,向下匹配按“n
”,向上匹配按“N
”)
CPU模型
每一种虚拟机监视器都定义了自己的策略,让客户机有一个默认的CPU模型。有的VMM会简单的将宿主机中的CPU类型和特性直接传递给客户机使用。在默认情况下,QEMU会为客户机提供一个名为qemu64或qemu32的基本CPU模型。虚拟机监视器的这种策略不但可以为CPU特性提供一些高级的过滤功能,还可以将物理平台根据基本CPU模型进行分组,使得客户机在同一组硬件平台上的动态迁移更加平滑和安全。
例5:通过如下命令来查看当前的QEMU支持的所有CPU模型。
CPU模型是在源代码qemu-kvm.git/target-i386/cpu.c
中的结构体数组builtin_x86_defs[]
中定义的。在x86-64平台上编译和运行的QEMU,如果不加“-cpu
”参数启动,默认采用“qemu64
”作为CPU模型。
例6:不加“-cpu”参数来启动客户机。
qemu-system-x86_64 ubuntu14.04.img
在客户机
中,可以使用命令“cat /proc/cpuinfo
”查看CPU的具体信息:
从上面的输出可知,客户机中的CPU模型的名称为“QEMU Virtual CPU version 2.0.0”,这是“qemu64”CPU模型的名称。在QEMU中,除了使用默认的CPU模型之外,还可以用“-cpu cpu_model
”来指定在客户机中的CPU模型。
例7:在启动客户机时指定了CPU模型为Penryn。
qemu-system-x86_64 -vnc :0 -monitor stdio ubuntu14.04.img -cpu Penryn
在客户机
中,可以使用命令“cat /proc/cpuinfo
”查看CPU的具体信息:
从上面的输出可知,客户机中的CPU模型的名称为“Intel Core 2 Duo P9xxx (Penryn Class Core 2)”,这是“Penryn”CPU模型的名称。