虚拟机配置

基本配置

概述

不同于Libvirt通过xml文件配置虚拟机的方式,StratoVirt可以通过命令行参数指定配置,也可以通过json文件进行配置。配置包括虚拟机CPU、内存、磁盘等信息。这里给出两种方式的具体操作方法。

虚拟机配置 - 图1

同时使用命令行配置和json文件配置时,以命令行配置为准。

本文中的/path/to/socket为用户自定义路径下的socket文件。

规格说明

  • 虚拟机CPU个数:[1, 254]
  • 虚拟机内存大小:[256M, 512G]
  • 虚拟机磁盘个数(包括热插的磁盘):[0, 6]
  • 虚拟机网卡个数(包括热插的网卡):[0, 2]
  • 虚拟机console设备仅支持单路连接
  • x86_64平台,最多可以配置11个mmio设备;但是除了磁盘和网卡,建议最多配置2个其他设备; AArch64平台,最多可以配置160个mmio设备;但是除了磁盘和网卡,建议最多配置12个其他设备。

最小配置

StratoVirt能够运行的最小配置为:

  • PE格式或bzImage格式(仅x86_64)的Linux内核镜像
  • 将rootfs镜像设置成virtio-blk设备,并添加到内核参数中
  • 使用api-channel来控制StratoVirt
  • 如果要使用ttyS0登录,添加一个串口到启动命令行,并将ttyS0添加到内核参数中

命令行配置

概述

命令行配置即通过命令行参数直接指定虚拟机配置内容。

命令格式

使用cmdline配置的命令格式如下:

$ /path/to/stratovirt -[参数1] [参数选项] -[参数2] [参数选项] …

使用说明

  1. 首先,为确保可以创建api-channel需要的socket,可以参考如下命令清理环境:

    1. $ rm [参数] [用户自定义socket文件路径]
  2. 然后,运行cmdline命令。

    1. $ /path/to/stratovirt -[参数1] [参数选项] -[参数2] [参数选项] ...

参数说明

cmdline命令行配置参数请参见下表:

表1 :命令行配置参数说明

参数参数选项说明
-nameVMname配置虚拟机名称(字符长度:1-255字符)
-machine[type=vm_type] [,dump-guest-core=on] [,mem-share=off]配置虚拟机类型,详细说明
-kernel/path/to/vmlinux.bin配置内核镜像
-appendconsole=ttyS0 root=/dev/vda reboot=k panic=1 rw配置内核命令行参数
-initrd/path/to/initrd.img配置initrd文件
-smp[cpus=]个数配置cpu个数,范围[1, 254]
-m内存大小(字节单位)、内存大小M(M单位)、内存大小G(G单位)配置内存大小,范围[256M, 512G]
-driveid=rootfs,file=/path/to/rootfs[,readonly=false,direct=true,serial=serial_num,iothread=iothread1,iops=200]配置virtio-blk设备,详细说明
-netdevid=iface_id,netdev=tap0[,mac=mac_address,iothread=iothread2]配置virtio-net设备,详细说明
-chardevid=console_id,path=/path/to/socket配置virtio-console,详细说明
-devicevsock,id=vsock_id,guest-cid=3配置vhost-vsock,详细说明
-api-channelunix:/path/to/socket配置api-channel,运行前须保证socket文件不存在
-serialstdio配置串口设备
-D/path/to/logfile配置日志文件
-pidfile/path/to/pidfile配置pid文件,必须和-daemonize一起使用。运行前须保证pid文件不存在
-disable-seccompNA关闭Seccomp,默认打开
-daemonizeNA开启进程daemon化
-iothreadid=“iothread1”配置iothread线程,详细说明
-balloondeflate-on-oom=true配置balloon设备,详细说明
-mem-path/dev/hugepages配置内存大页,详细说明

配置示例

  1. 删除socket文件,确保可以创建api-channel。

    1. $ rm -f /tmp/stratovirt.socket
  2. 运行StratoVirt。

    1. $ /path/to/stratovirt \
    2. -kernel /path/to/vmlinux.bin \
    3. -append console=ttyS0 root=/dev/vda rw reboot=k panic=1 \
    4. -drive file=/home/rootfs.ext4,id=rootfs,readonly=false \
    5. -api-channel unix:/tmp/stratovirt.socket \
    6. -serial stdio

运行成功后,将根据指定的配置参数创建并启动虚拟机。

json配置

概述

使用json文件配置即在运行StratoVirt创建虚拟机时,读取给定的json文件,该文件中包含了对虚拟机的相关配置。

命令格式

使用json文件配置虚拟机的命令格式如下,其中 /path/to/json 为对应文件的路径。

$ /path/to/stratovirt -config /path/to/json -[参数] [参数选项]

使用说明

  1. 编写json文件,将虚拟机配置写入该文件。

  2. 执行StratoVirt创建虚拟机。

    1. $ /path/to/stratovirt -config /path/to/json -[参数] [参数选项]

参数说明

json文件中可配置字段及含义请参见下表:

表2:配置文件的字段

配置参数配置参数选项说明
boot-source“kernel_image_path”: “/path/to/vmlinux.bin”,“boot_args”: “console=ttyS0 reboot=k panic=1 pci=off tsc=reliable ipv6.disable=1 root=/dev/vda quiet”,“initrd_fs_path”: “/path/to/initrd.img”配置内核镜像和内核参数, 参数initrd_fs_path可选。
machine-config“type”: “MicroVm”,“vcpu_count”: 4,“mem_size”: 805306368,“dump_guest_core”: false,“mem-share”: false,“mem_path”:“/path/to/backend”配置虚拟cpu和内存大小,参数 dump_guest_core,mem-pathmem-share可选,。
drive“drive_id”: “rootfs”,“path_on_host”: “/path/to/rootfs.ext4”,“read_only”: false,“direct”: true,“serial_num”: “xxxxx”,“iothread”: “iothread1”,“iops”: 200配置virtio-blk磁盘 ,参数serial_numiothreadiops可选。
net“iface_id”: “net0”,“host_dev_name”: “tap0”,“mac”: “xx:xx:xx:xx:xx:xx”,“iothread”: “iothread1”配置virtio-net网卡,参数maciothread 可选。
console“console_id”: “charconsole0”,“socket_path”: “/path/to/socket”配置virtio-console串口,运行前须保证socket文件不存在
vsock“vsock_id”: “vsock0”,“guest_cid”: 3配置virtio-vsock设备
serial“stdio”: true配置串口设备
iothread“id”: “iothread1”配置iothread的id,用来创建名为”iothread1”的线程。
balloon“deflate_on_oom”: true配置balloon的auto deflate特性

使用json运行的参数请参见下表:

表3:使用json运行的参数

参数参数选项说明
-config/path/to/json配置文件的路径
-api-channelunix:/path/to/socket配置api-channel,运行前须保证socket文件不存在
-D/path/to/logfile配置日志文件
-pidfile/path/to/pidfile配置pid文件,必须配合daemonize使用。运行前须保证pid文件不存在
-disable-seccompNA关闭Seccomp,默认打开
-daemonizeNA开启进程daemon化

配置示例:

  1. 创建json文件,例如/home/config.json,其内容如下:

    1. {
    2. "boot-source": {
    3. "kernel_image_path": "/path/to/vmlinux.bin",
    4. "boot_args": "console=ttyS0 reboot=k panic=1 pci=off tsc=reliable ipv6.disable=1 root=/dev/vda quiet rw"
    5. },
    6. "machine-config": {
    7. "type": "MicroVm",
    8. "vcpu_count": 2,
    9. "mem_size": 268435456
    10. },
    11. "drive": [
    12. {
    13. "drive_id": "rootfs",
    14. "path_on_host": "/path/to/rootfs",
    15. "serial_num": "11111111",
    16. "direct": true,
    17. "read_only": false,
    18. "iops": 200000,
    19. "iothread": "iothread2"
    20. }
    21. ],
    22. "net": [
    23. {
    24. "iface_id": "net0",
    25. "host_dev_name": "tap0",
    26. "mac": "0e:90:df:9f:a8:88",
    27. "iothread": "iothread1"
    28. }
    29. ],
    30. "console": [
    31. {
    32. "console_id": "charconsole0",
    33. "socket_path": "/path/to/console.socket"
    34. }
    35. ],
    36. "serial": {
    37. "stdio": true
    38. },
    39. "vsock": {
    40. "vsock_id": "vsock-123321132",
    41. "guest_cid": 4
    42. },
    43. "iothread": [
    44. {"id": "iothread1"},
    45. {"id": "iothread2"}
    46. ]
    47. }
  2. 运行StratoVirt,读取json文件配置创建并启动虚拟机。

    1. $ /path/to/stratovirt \
    2. -config /home/config.json \
    3. -api-channel unix:/tmp/stratovirt.socket

执行成功后,虚拟机创建并启动成功。

配置说明:

虚拟机类型

通过-machine参数来指定启动的虚拟机的类型。

参数说明

  • type:启动虚拟机的类型(当前只支持“MicroVm”类型,可选配置,默认为”MicroVM“类型)。
  • dump-guest-core:进程panic时,是否dump虚拟机内存(可选配置)。
  • mem-share:是否与其他进程共享内存(可选配置)。

磁盘配置

虚拟机磁盘配置包含以下配置项

  • drive_id: 磁盘的id。
  • path_on_host: 磁盘的路径。
  • serial_num: 磁盘的串号(可选配置)。
  • read_only: 是否只读(可选配置)。
  • direct: 是否以“O_DIRECT”模式打开(可选配置)。
  • iothread: 配置iothread属性(可选配置)。
  • iops: 配置磁盘QoS,以限制磁盘的io操作(可选配置)。

下面对iops和iothread两个配置项进行详细说明:

iops:磁盘QoS

简介

QoS(Quality of Service)是服务质量的意思。在云场景中,单主机内会启动多台虚拟机,当某台虚拟机对磁盘访问压力大时,由于同主机的磁盘访问总带宽有限,这会挤占其他虚拟机的访问带宽,从而造成对其他虚拟机IO影响。为了降低影响,可以为虚拟机配置QoS属性,限制它们对磁盘访问的速率,从而降低对彼此的影响。

注意事项
  • 当前QoS支持配置磁盘的iops。
  • iops的设定范围是[0, 1000000],0为不限速;实际iops不会超过设定值,并且不会超过后端磁盘实际性能的上限。
  • 只能限制平均iops,无法限速瞬时的突发流量。
配置方式

用法:

命令行

  1. -drive xxx,iops=200

参数:

  • iops:当配置了iops后,本磁盘在虚拟机内部的IO下发速度,不会超过此配置值。
  • xxx:表示磁盘的其他设置。

json配置

  1. {
  2. ...
  3. "drive": [
  4. {
  5. "drive_id": "rootfs",
  6. "path_on_host": "/path/to/block",
  7. ...
  8. "iops": 200
  9. }
  10. ],
  11. ...
  12. }

iothread:

iothread配置细节见iothread配置

网卡配置

虚拟机网卡的配置包含以下配置项

  • iface_id:唯一的设备id。
  • host_dev_name:host上的tap设备名。
  • mac:设置虚拟机mac地址(可选配置)。
  • iothread:配置磁盘的iothread属性(可选配置)。

网卡iothread配置详见iothread配置

Console设备配置

virtio-console是通用的串口设备,用于guest和host之间传送数据。console设备的配置有如下配置项:

  • console_id: 唯一的设备id
  • socket_path:virtio console文件路径

在启动stratovirt之前请确保console文件不存在。

vsock设备配置

vsock也是host和guest间通信的设备,类似于console,但具有更好的性能。配置项:

  • vsock_id: 唯一的设备id。
  • guest_cid: 唯一的context id。

大页配置

概述

StratoVirt支持为虚拟机配置内存大页,相比传统的4K内存分页模式,大页内存可以有效减少TLB Miss次数和缺页中断次数,能够显著提升内存密集型业务性能。

注意事项

  • 指定的大页挂载的目录,必须是绝对路径。
  • 仅支持在启动时配置。
  • 仅支持静态大页。
  • 使用大页前, 在Host上需要配置好大页。
  • 使用大页特性, 指定虚拟机内存规格必须是大页页面大小的整数倍

互斥特性

  • 如果配置大页,balloon特性失效。

配置方式

配置Host上大页
挂载

将大页文件系统挂载到指定目录上,其中/path/to/hugepages为用户自定义的空目录。

  1. $ mount -t hugetlbfs hugetlbfs /path/to/hugepages
设置大页数目
  • 设置静态大页数目, num为指定的大页数目

    1. $ sysctl vm.nr_hugepages=num
  • 查询大页统计信息

    1. $ cat /proc/meminfo | grep Hugepages

如果需要查看其它页面大小的大页统计信息, 可以查看/sys/kernel/mm/hugepages/hugepages-*/目录下相关信息。

img

  1. 请根据大页使用情况,配置StratoVirt内存规格和大页。如果大页资源不足,虚拟机会启动失败。

启动StratoVirt时添加大页配置

  • 命令行

    1. -mem-path /page/to/hugepages

其中/page/to/hugepages为大页文件系统挂载的目录,仅支持绝对路径。

  • Json文件

    1. {
    2. "machine-config": {
    3. "mem_path": "/page/to/hugepages",
    4. ...
    5. },
    6. ...
    7. }

其中/page/to/hugepages为大页文件系统挂载的目录,仅支持绝对路径。

img

  1. 典型配置:指定StratoVirt命令行中的mem-path项为:大页文件系统挂载的目录。 推荐使用典型配置使用StratoVirt大页特性。

配置iothread

简介

当StratoVirt启动了带iothread配置的虚拟机后,会在主机上启动独立于主线程的单独线程,这些单独线程可以用来处理设备的IO请求,一方面提升设备的IO性能,另一方面降低对管理面消息处理的影响。

注意事项

  • 支持配置最多8个iothread线程
  • 支持磁盘和网卡配置iothread属性
  • iothread线程会占用主机CPU资源,在虚拟机内部大IO压力情况下,单个iothread占用的CPU资源取决于磁盘的访问速度,例如普通的SATA盘会占用20%以内CPU资源。

创建iothread线程

用法:

命令行:

  1. -iothread id=iothread1 -iothread id=iothread2

json:

  1. "iothread": [
  2. {"id": "iothread1"},
  3. {"id": "iothread2"}
  4. ]

参数:

  • id:用于标识此iothread线程,该id可以被设置到磁盘或网卡的iothread属性。当启动参数配置了iothread线程信息,虚拟机启动后会在主机上启动相应id名的线程。

配置磁盘或网卡的iothread属性

用法:

命令行配置

  1. # 磁盘
  2. -drive xxx,iothread=iothread1
  3. # 网卡
  4. -netdev xxx,iothread=iothread2

​ 参数:

  1. iothread:设置成iothread线程的id,指明处理本设备IO的线程。
  2. xxx: 表示磁盘或者网卡的其他配置

json配置

  1. # 磁盘
  2. {
  3. ...
  4. "drive": [
  5. {
  6. "drive_id": "rootfs",
  7. "path_on_host": "/path/to/block",
  8. ...
  9. "iothread": "iothread1",
  10. }
  11. ],
  12. ...
  13. }
  14. # 网卡
  15. {
  16. ...
  17. "net": [
  18. {
  19. "iface_id": "tap0",
  20. "host_dev_name": "tap0",
  21. "mac": "12:34:56:78:9A:BC",
  22. "iothread": "iothread1"
  23. }
  24. ]
  25. }

配置balloon设备

简介

在虚拟机运行过程中,由虚拟机里的balloon驱动来动态占用或释放内存,从而动态改变这台虚拟机当前可用内存,达到内存弹性的效果。

注意事项

  • 启用balloon前须确保guest和host的页面大小相同。
  • guest内核须开启balloon特性支持。
  • 开启内存弹性时,有可能造成虚拟机内部轻微卡顿、内存性能下降。

互斥特性

  • 大页内存互斥。
  • 在x86下,由于中断数量有限,所以balloon设备和其他virtio的数量(默认使用6个block设备,2个net设备和1个串口设备)总和不得超过11个。

规格

  • 每个VM只能配置1个balloon设备。

配置方式

  • 命令行

    1. -balloon deflate-on-oom=true
  • json文件

    1. {
    2. "balloon": {
    3. "deflate_on_oom": true
    4. },
    5. ...
    6. }

img

  1. deflate-on-oom的取值为bool类型,表示是否开启auto deflate特性。开启时,如果balloon已经回收部分内存,当guest需要内存时,balloon设备会自动放气,归还内存给guest。不开启则不会自动归还。
  2. 使用qmp命令回收虚拟机内存时,应确保回收后虚拟机仍然有足够的内存来保持最基本的运行。否则可能会出现一些操作超时,以及导致虚拟机内部无法申请到空闲内存等现象。
  3. 如果虚拟机内部开启内存大页,balloon不能回收大页占用内存。

img

  • deflate-on-oom=false时,当Guest中内存不足时,balloon不会自动放气并归还内存,可能会引起Guest内部OOM,进程被Kill,甚至虚拟机无法正常运行。