KVM虚拟化

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了KVM虚拟化相关的知识,希望对你有一定的参考价值。

一、 虚拟化的优势

  • 1.降低运营成本:
      服务器虚拟化降低了IT基础设施的运营成本,令系统管理员摆脱了繁重的物理服务器、OS、中间件及兼容性的管理工作,减少人工干预频率,使管理更加强大、便捷。
  • 2.提高应用兼容性:
      服务器虚拟化提供的封装性和隔离性使大量应用独立运行于各种环境中,管理人员不需频繁根据底层环境调整应用,只需构建一个应用版本并将其发布到虚拟化后的不同类型平台上即可。
  • 3.加速应用部署:
      采用服务器虚拟化技术只需输入激活配置参数、拷贝虚拟机、启动虚拟机、激活虚拟机即可完成部署,大大缩短了部署时间,免除人工干预,降低了部署成本。
  • 4.提高服务可用性:
      用户可以方便地备份虚拟机,在进行虚拟机动态迁移后,可以方便的恢复备份,或者在其他物理机上运行备份,大大提高了服务的可用性。
  • 5.提升资源利用率:
      通过服务器虚拟化的整合,提高了CPU、内存、存储、网络等设备的利用率,同时保证原有服务的可用性,使其安全性及性能不受影响。
  • 6.动态调度资源:
      在服务器虚拟化技术中,数据中心从传统的单一服务器变成了统一的资源池,用户可以即时地调整虚拟机资源,同时数据中心管理程序和数据中心管理员可以灵活根据虚拟机内部资源使用情况灵活分配调整给虚拟机的资源。
  • 7.降低能源消耗:
      通过减少运行的物理服务器数量,减少CPU以外各单元的耗电量,达到节能减排的目的。

    二、KVM虚拟化介绍

KVM(kernel-based virtual machine,基于内核的虚拟主机),最初是一家叫Qumranet的以色列公司研发。作为他们的VDI产品的虚拟机。为了简化开发,KVM的开发人员并没有选择从底层开始新写一个Hypervisor,而是选择了基于Linux kernel,通过加载新的模块从而使Linux Kernel本身变成一个Hypervisor。2006年10月,在先后完成了基本功能、动态迁移以及主要的性能优化之后,Qumranet正式对外宣布了KVM的诞生。

KVM虚拟化技术之所以叫基于内核的虚拟化技术,其KVM自身就是一个Linux内核模块,当一个安装有Linux系统的物理机装载了KVM这个内核模块之后,摇身一变,此Linux系统就变成了一个hypervisor。但是这个Hypervisor上面运行的进程还是会继续运行,同时也可以创建虚拟机,但每个虚拟机就是运行在Linux内核之上的一个系统进程,可以随时使用kill命令杀死。
在2006年10月左右, Linux内核的维护者将KVM收录进了内核,KVM是寄宿在Linux内核之上。

KVM这家公司在2008年9月被RedHat收购,出价1亿7百万美金。RedHat收购KVM后也算有了自己的虚拟化技术,此后就开始大力支持KVM,从REHL5.4开始KVM就已经被收录进内核。由于KVM这种虚拟化技术出现的比较晚,所以充分利用了现代操作系统特性,特别是KVM要求只能运行在支持HVM(硬件辅助虚拟化)的平台上并且只能是64位平台,如Intel的VT。

三、KVM 架构

技术分享图片

KVM是一个非常精巧的设计方式,它只是Linux的一个内核模块,但是这个内核模块一旦装载立即可以成为一个hypervisor,如果不装载就还是一个正常的Linux系统。有了KVM模块以后Linux就有了三种运行模式:

  • Guest Mode:来宾模式:

此模式只负责非I/O类操作或者说是非特权指令操作,如算术运行,由于是虚拟而非模拟,底层架构一样,所以此时Guest OS可以直接通过KVM Driver直接运行到物理CPU的ring 3上执行。如果是模拟那么此时就需要经过User Mode转到CPU执行。但一旦需要跟I/O打交道或需要运行特权指令,就需要Guest OS中的进程进行内部系统调用到达Geust OS的内核空间,然后经过User Mode到Kernel Mode这么一个过程。

  • User Mode:用户模式:

此模式就代表来宾模式执行I/O类操作请求(站在虚拟机角度),因为QEMU就在用户模式运行(QEMU负责模拟I/O设备提供给Guest OS使用)。

  • Kernel Mode:内核模式:

此模式是真正可以操作硬件的,当Guest OS执行I/O类操作或特权指令操作时需要向用户模式提交请求,然后由用户模式再次发起硬件操作请求给内核模式从而真正操作硬件。

KVM组件

在一个装载了KVM模块的Linux系统上,其运行的KVM虚拟机表现为一个个线程,Linux系统可以正常管理。KVM核心就两个组件:/dev/kvm和QEMU。
KVM模块是KVM虚拟机的核心部分,其主要功能是初始化CPU硬件,打开虚拟化模式,然后将虚拟客户机运行在虚拟机模式下,并对虚拟客户机的运行提供一定的支持。
为了软件的简洁和性能,KVM仅支持硬件虚拟化。自然而然,打开并初始化系统硬件以支持虚拟机的运行,是KVM模块的职责所在。以KVM在Intel公司的CPU上运行为例,在被内核加载的时候,KVM模块会先初始化内部的数据结构;做好准备之后,KVM模块检测系统当前的CPU,然后打开CPU控制寄存器CR4中的虚拟化模式开关,并通过执行VMXON 指令将宿主操作系统(包括KVM模块本身)置于虚拟化模式中的根模式;最后,KVM模块创建特殊设备文件/dev/kvm并等待来自用户空间的命令。接下来虚拟机的创建和运行将是一个用户空间的应用程序(QEMU)和KVM模块相互配合的过程。

1) /dev/kvm

/dev/kvm是一个字符设备,工作于Hypervisor。在用户空间,可通过这个接口(调用ioctl系统调用)管理虚拟机或通过这个接口编程序用来管理虚拟机,实现VM创建、删除、分配内存、读写VCPU的寄存器、想VCPU注入中断、运行VCPU等功能。如virsh或qemu-kvm这些工具都是都可以用来管理KVM虚拟机。

2) QEMU

QEMU本身并不是KVM的一部分,其自身就是一个著名的开源虚拟机软件。与KVM不同,QEMU虚拟机是一个纯软件的实现,所以性能低下。但是,其优点是在支持QEMU本身编译运行的平台上就可以实现虚拟机的功能,甚至虚拟机可以与宿主机并不是同一个架构。作为一个存在已久的虚拟机,QEMU的代码中有整套的虚拟机实现,包括处理器虚拟化、内存虚拟化,以及KVM使用到的虚拟设备模拟(比如网卡、显卡、存储控制器和硬盘等)。
为了简化开发和代码重用,KVM在QEMU的基础上进行了修改。虚拟机运行期间,QEMU 会通过KVM模块提供的系统调用进入内核,由KVM模块负责将虚拟机置于处理器的特殊模式运行。遇到虚拟机进行输入输出操作,KVM模块会从上次的系统调用出口处返回 QEMU,由QEMU来负责解析和模拟这些设备。
从QEMU角度来看,也可以说QEMU使用了KVM模块的虚拟化功能,为自己的虚拟机提供硬件虚拟化的加速,从而极大地提高了虚拟机的性能。除此之外,虚拟机的配置和创建,虚拟机运行依赖的虚拟设备,虚拟机运行时的用户操作环境和交互,以及一些针对虚拟机的特殊技术(诸如动态迁移),都是由QEMU自己实现的。

四、部署KVM虚拟化平台:

  1. 通过Bios上面设置支持虚拟化操作
    如果是使用vmware来模拟开启支持虚拟化标志:
    技术分享图片
  2. 查看系统是否支持虚拟化:

        # grep -E ‘vmx|svm‘ /proc/cpuinfo

    技术分享图片
    3.安装KVM管理工具

        # yum install qemu-kvm libvirt libvirt-client python-virtinst virt-manager

    加载KVM模块,并验证KVM模块是否安装好:

        # modprobe kvm 
        # lsmod |grep kvm(物理机:如果没有输出代表CPU不支持,需要开启CPU的支持KVM虚拟化的模块,具体就是进入BIOS中设置。)

    技术分享图片

  3. 设置KVM网络桥接模式:

备注:在libvirt中运行kvm网络有两种方法:NAT和BRIDGE,默认是NAT模式,用户模式可以访问外网,但是无法从外部访问虚拟机网络,所以用的不是很多,我们一般做的服务器都需要外网的访问,所有我们多数情况采用桥接模式(bridge),这种模式允许虚拟机像一台独立的主机一样拥有网络,外部的机器可以直接访问到虚拟机。所以一般都是使用桥接模式。
说明:在安装kvm后发现网络接口中多了一个叫做virbr0的虚拟网络接口:
技术分享图片
这是因为安装启动了libvirt服务后生产的,libvirt在服务器上生成了一个virbr0,host上所有的虚拟主机通过这个virbr0连接起来。默认使用的是NAT模式,这时guest可以访问外部,但是无法从外部访问虚拟机网络,所以,大部分时候我们虚拟机是通过网桥连接到局域网里。
所以这个virbr0不是必须的。如何关掉这个virbr0呢:

# virsh net-list  列出网络
# virsh net-destroy default  销毁网络
# virsh net-undefine default  不定义一个持久网络
# service libvirtd restart

设置桥接:

  • 第一种方法(在Centos7上会断开连接,推荐第二种方法):

    # virsh iface-bridge ens33 br0 --no-stp
    # service libvirtd restart
    # # service network restart 
  • 第二种方法:

编辑物理机的网卡文件(如下):

# cat /etc/sysconfig/network-scripts/ifcfg-eth0 
DEVICE=eth0
ONBOOT=yes
BRIDGE=br0
# cat /etc/sysconfig/network-scripts/ifcfg-br0 
DEVICE=br0
ONBOOT=yes
TYPE=Bridge
BOOTPROTO=dhcp
STP=off

技术分享图片

    # service libvirtd restart  重启libvirtd守护进程
  1. KVM虚拟机安装:

1)安装虚拟机(图形化界面)

# virt-manager

技术分享图片
备注:error qustion:
a. virt-manager无法打开图形界面:
windows安装xmanager
linux下安装支持xmanager的驱动:yum -y install xorg-x11-xauth
b. 图形界面乱码问题:
yum install dejavu-lgc-sans-fonts -y
yum groupinstall Fonts
2)查看安装界面(双击localhost)
技术分享图片
可以看到此时的默认存储地址是/var/lib/libvirt/images下的。
3)右击localhost界面,点击新建。
技术分享图片
可以看到其支持ISO,HTTP,FTP,NFS,PXE和本地image等方式来安装虚拟机系统。
技术分享图片
点击前进,选择使用iso镜像,
技术分享图片
选择浏览-?本地浏览—>找到存放你ISO镜像的地方。

技术分享图片
设置你要给虚拟机的内存和CPU。
技术分享图片

技术分享图片
技术分享图片

然后点击完成。这里一定要设置键盘模式为en-us。
技术分享图片
点击应用,然后开始安装。接下来就是安装操作系统的常规界面了,这里就不作介绍了。
技术分享图片

2)命令行方式安装虚拟机(virt-install):
virt-install介绍:
virt-install 创建虚拟机并安装GuestOS,virt-isntall是一个命令行工具,为KVM,XEN或者其他支持libvirt API的hypervisor创建虚拟机并完成Guest OS安装,此外可以基于串行控制台/VNV/SDL支持文本或者图形安装界面,安装过程可以使用本地的安装介质cdrom,也可以通过网络NFS/HTTP/FTP服务实现。对于通过网络安装的方式,virt-install可以通过自动加载必要的文件以启动安装过程而无须额外提供引导工具。当然,virt-install也支持PXE方式的安装过程,也能够直接使用现有的磁盘镜像直接启动安装过程。
virt-install:命令选项大体分类
一般选项:指定虚拟机的名称/内存大小/VCPU个数及特性等
-n NAME,--name=NAME:虚拟机名称,全局唯一
-r Memory,--ram=memory:虚拟机内存大小,单位MB
--vcpus=VCPUS ...:VCPU个数及相关配置
--cpu=CPU:CPU模式及其特性,如coreduo等,可以使用qemu-kvm -cpu ?来获取支持的CPU模式

安装方法:指定安装方法/Guest OS类型等
        -c cdrom,--cdrom=cdrom:光盘安装介质
        -l localtion,--location=locationo:安装源URL,支持ftp,http及nfs等,如http://192.168.1.1/cobber/ks...
        --pxe:基于pxe安装
        --live cd:把光盘当作live CD
        --os-type=DISTRO_VARIANT:某类型操作系统的变体,如rhe13
        -x extra,--extra-args=extra:根据--location指定的方式安装时,用于传递给内核的额外选项,例如指定kickstartd文件的位置,--extra-args ‘ks=http://172.16.0.1/class.cfg‘
        --boot=bootopts:指定安装过程完成后的配置选项,如指定引导设备的次序,使用指定的而非安装的kernel/initrd来引导系统启动等。如:
            --boot cdromo,hd,nd,network:指定引导次序
            --boot keernel=KERNEL,initrd=INITRD,kernel_args=‘console=/dev/ttys0‘:指定启动系统内核及 initrd文件
    存储配置:指定存储类型/位置及其属性等
        --disk=DISKOPTS:指定存储设备及其属性;格式为--disk /some/storage/path,opt1=val1,opt2=val2.常用的选项有:
            device:设备类型,如cdromo,disk或者floppy等,默认disk
            bus:磁盘总线类型,
            perms:访问权限,如rw,ro或sh(共享的可读写),默认为rw
            size:新建磁盘镜像文件的大小。单位GB
            cache:缓存模型,值为none,writethrouth(缓存读),writeback(缓存读写)
            format:磁盘镜像格式,raw,qcow2.vmdk等
            sparse:磁盘镜像使用稀疏格式,也就是不立即分配只当大小的空间
            --nodisks:不是使用本地磁盘,在LIVECD模式中常用
网络配置:指定网络接口的网络类型及其接口属性,如mac地址/驱动模式等
        -w NETWORK,--network=NETWORK,opt1=val1,opt2=val2 将虚拟机连接到宿主机的网络中。其NETWORK可以为:bridge=Bridge:连接至名为‘BRIDEG’的桥设备
            network=NAME 连接至名为‘NAME’的网络
图形配置:
设备选项:
虚拟化平台:
其他:
        --autostart:指定虚拟机是否在物理启动后自动启动
        --print-xml:
        --force:禁止命令进入交互模式,如果有需要回答yes或者no,则自动回答yes

安装示例:
使用光盘安装:
virt-install --hvm --name demo1 --memory 500 –disk size=5--livecd --graphics vnc --cdrom /var/lib/libvirt/images/CentOS-7-x86_64-Minimal-1708.iso

Install a Fedora 9 plain QEMU guest, using LVM partition, virtual networking, booting from PXE, using VNC server/viewer, with virtio-scsi disk

     # virt-install           --connect qemu:///system           --name demo           --memory 500           --disk path=/dev/HostVG/DemoVM,bus=scsi           --controller virtio-scsi           --network network=default           --virt-type qemu           --graphics vnc           --os-variant fedora9

Run a Live CD image under Xen fullyvirt, in diskless environment

                 # virt-install           --hvm           --name demo           --memory 500           --disk none           --livecd           --graphics vnc           --cdrom /root/fedora7live.iso

Run /usr/bin/httpd in a linux container guest (LXC). Resource usage is capped at 512 MiB of ram and 2 host cpus:

                 # virt-install            --connect lxc:///            --name httpd_guest            --memory 512            --vcpus 2            --init /usr/bin/httpd

Start a linux container guest(LXC) with a private root filesystem, using /bin/sh as init. Container‘s root will be under host dir /home/LXC. The host dir "/home/test" will be mounted at "/mnt" dir inside container:

        # virt-install            --connect lxc:///            --name container            --memory 128            --filesystem /home/LXC,/            --filesystem /home/test,/mnt            --init /bin/sh

Install a paravirtualized Xen guest, 500 MiB of RAM, a 5 GiB of disk, and Fedora Core 6 from a web server, in text-only mode, with old style –file options:

        # virt-install           --paravirt           --name demo           --memory 500           --disk /var/lib/xen/images/demo.img,size=6           --graphics none           --location 

Create a guest from an existing disk image ‘mydisk.img‘ using defaults for the rest of the options.

     # virt-install           --name demo           --memory 512           --disk /home/user/VMs/mydisk.img           --import

Start serial QEMU ARM VM, which requires specifying a manual kernel.

     # virt-install           --name armtest           --memory 1024           --arch armv7l --machine vexpress-a9           --disk /home/user/VMs/myarmdisk.img           --boot kernel=/tmp/my-arm-kernel,initrd=/tmp/my-arm-initrd,dtb=/tmp/my-arm-dtb,kernel_args="console=ttyAMA0 rw root=/dev/mmcblk0p3"           --graphics none

五、常规操作虚拟机

  • 列出域

        # virsh list   列出开启和挂起的域
        # virsh list –all 列出全部域

    技术分享图片

  • 挂起和恢复虚拟机

        # virsh suspend kvm2  挂起虚拟机
        # virsh resume kvm1   恢复虚拟机

    技术分享图片
    技术分享图片

  • 伴随着开机自启动

    # virsh autostart kvm1  随着物理机开机自动启动KVM1

    技术分享图片

  • 关闭开启一个域

        # virsh start kvm1
        # virsh shutdown kvm1
  • 编辑虚拟机的配置文件

        # virsh edit kvm3
  • 克隆虚拟机:

    # virt-clone -o kvm1 -n kvm4 -f /var/lib/libvirt/images/kvm4.img

    技术分享图片
    技术分享图片

  • 转换磁盘的格式:

虚拟磁盘有raw和qcow2两种格式,默认使用的是raw,raw性能好,速度快,缺点是不支持一些功能,例如:制作快照,压缩,加密等。下面给大家介绍qcow2格式的使用,这种格式用的比较多,功能多。

    # qemu-img info /var/lib/libvirt/images/kvm3.img  查看KVM3镜像的磁盘格式为raw

技术分享图片

    # virsh shutdown kvm3
    #  qemu-img convert -f raw -O qcow2 /var/lib/libvirt/images/kvm3.img  /var/lib/libvirt/images/kvm3.qcow2  将raw转换成qcow2格式

进行格式的转换

# virsh edit kvm3  编辑配置文件将raw修改成为qcow2,把配置文件的路径也修改一下

修改前:
技术分享图片

修改后:
技术分享图片

  • 虚拟机快照(raw格式不支持)

        Snapshot (help keyword ‘snapshot‘)
        snapshot-create                Create a snapshot from XML
        snapshot-create-as             Create a snapshot from a set of args
        snapshot-current               Get or set the current snapshot
        snapshot-delete                Delete a domain snapshot
        snapshot-dumpxml               Dump XML for a domain snapshot
        snapshot-edit                  edit XML for a snapshot
        snapshot-info                  snapshot information
        snapshot-list                  List snapshots for a domain
        snapshot-parent                Get the name of the parent of a snapshot
        snapshot-revert                Revert a domain to a snapshot
    
        # virsh snapshot-create kvm3  创建快照
        # virsh snapshot-list kvm3      查看快照

    技术分享图片

        # virsh snapshot-revert  kvm3 1525428646 恢复快照
        # virsh snapshot-delete kvm3 1525428646  删除快照

    技术分享图片

  • 使用libguestfs-tools工具:

安装:# yum -y install libguestfs-tools

    virt-df     显示虚拟机磁盘的空间,类似于物理机的df命令
    virt-cat    读取虚拟机的文件,同cat
    virt-ls 列出文件或者目录
    virt-copy-out   复制文件从虚拟机复制到本地物理机
    virt-copy-in    复制文件从本地物理机复制到虚拟机

六、虚拟机的优化:

  • 绑定虚拟机的CPU

查看虚拟CPU和物理CPU的对应关系:

    # virsh vcpuinfo 2

查看虚拟机可以使用哪些物理逻辑CPU

    Virsh # emulatorpin 2

在线绑定虚拟机的CPU和物理的CPU

Virsh emulatorpin 2 1-4 –live
Virsh emulatorpin 2   #查看绑定是否生效

也可以通过vrish vcpuinfo n 查看绑定信息
也可以通过virsh # dumpxml n 查看cpuset的绑定信息

  • 强制VCPU和物理CPU一对一绑定

        # virsh vcpupin 3 0 0
        # virsh vcpupin 3 0 1
        # virsh vcpupin 3 0 2
        virsh # dumpxml 0
  • 使用半虚拟化网卡(Virtio)技术提高虚拟机的网络性能

      # grep -i virtio /boot/config-2.6.32-642.el6.x86_64 (查看是否支持virtio技术)

配置使用半虚拟化网卡:

# virsh edit kvm1
  • 磁盘虚拟化:

1) 使用Virtio半虚拟技术来代替IDE虚拟磁盘
2) 缓存模式技术:
a) 比较安全的模式:writethrought,none,directsync,可靠性要求非常高使用writethough或者directsync模式
b) wirteback模式:虚拟机必须依靠刷盘命令来保持数据的一致性。
c) Unsafe模式是最不安全的。

七、KVM的性能和局限性:

1.性能特性支持

1)内存管理

KVM从Linux继承了强大的内存管理功能,一个虚拟机的内存与任何其他Linux进程的内存一样进行存储,可以以大页面的形式进行交换以实现更高的性能,
KVM支持最新的基于硬件的内存虚拟化功能,支持使用Intel EPT或AMD RVI技术来完成内存地址映射,GVAàHPA,以实现更低的CPU利用率和更高的吞吐量。
支持KSM(Kernel Same-page Merging,相同内存页合并),比如在KVM上同时运行多个Linux相同版本的主机,它们都会载入一些相同的动态库,由于是只读的,所以可以进行合并。KSM通过扫描每个虚拟机的内存,查找个虚拟机间相同的内存页,并将这些内存页合并成一个各相关虚拟机能够共享的独立内存页面,从而实现了内存页面共享。节约内存使用,使得我们的KVM可以过载使用内存,虚拟机内存分配可以大于物理机内存。如果这些合并页中有某个虚拟机需要修改,那么此时KVM就会进行copy on write机制给它重新生成一个副本,它只能修改自己的而不能修改共享的。
2)硬件支持

由于KVM出现的较晚,充分利用了先进技术,所以KVM运行的物理机必须要支持硬件辅助虚拟化且只能是X64架构。
由于KVM是寄宿在Linux内核之上,所以支持的硬件取决于Linux内核支持的硬件。
3)存储

KVM可以支持任何Linux内核支持的存储设备,如:
本地存储:IDE、SCSI、SAN、SATA、SAS、PCI-E等。
网络附加存储:NAS、SAMBA等
存储区域网络:SAN,ISCSI。
分布式存储:GlustFS
KVM的原生磁盘格式为QCOW2,它支持快照,允许多级快照、压缩和加密。
4)实时迁移

各个Hypervisor利用共享存储实现实时虚拟机迁移,并且虚拟机运行的服务无中断。但是KVM实现实时迁移有一些前提条件,如:
a.镜像文件必须放在共享存储。
b.共享存储还必须放在同一个位置,否则配置文件会找不到。
c.各个Hypervisor必须要兼容。
d.CPU必须拥有相同特性,最好同款CPU。
e.两台Hypervisor的时间必须要一致。
f.两台Hypervisor必须有一样的网络配置。
5)支持的Guest OS

像XEN那种半虚拟化,由于要修改系统内核才能运行,所以不是每个系统都支持,比如Windows系统。但KVM属于全虚拟化技术,所以支持大多数系统,如:Linux、Windows、OpenBSD、FreeBSD、OpenSolaris等。另外,运行在KVM上的Windows还通过了微软的虚拟化认证,也就是说,如果你在KVM上面运行正版Windows系统,如果出现异常,微软官方是承认可提供技术支持的。当然这也是红帽跟微软的勾当而已。
6)设备驱动

Linux内核支持的驱动,KVM都支持。另外,KVM是一个混合类型的VMM,因为KVM能够以模拟(QEMU)的方式支持完全虚拟机,又能够支持在Guest OS中安装驱动实现IO的半虚拟化,也就是两阶段IO,前半部分IO在Guest OS上,后半部分在宿主机上。
现在在KVM中常用的IO半虚拟化组件叫virtio,由IBM和RedHat联合研发,是一个比较通用的半虚拟化IO组件。目前,基于virtio有virtio-blk支持块存储半虚拟化、virtio-net支持网络半虚拟化、virtio-pci支持pci设备虚拟化、virtio-console支持控制台的虚拟化、virtio-ballon支持动态内存的扩展和收缩。而virtio在Linux 2.6.25内核已经收录,只要编译内核时选择了virtio模块就可以,但是如果是微软的系统那么还需要去RedHat官方下载对应的virtio程序才可以支持。
7)性能和可伸缩性

KVM也继承了Linux的性能和可伸缩性。KVM虚拟化性能在很多方面(如计算能力、网络带宽等)已经可以达到非虚拟化原生环境的95%以上的性能。KVM的扩展性也非常良好,客户机和宿主机都可以支持非常多的CPU数量和非常大量的内存。例如,Redhat官方文档就介绍过,RHEL 6.x系统中的一个KVM客户机可以支持160个虚拟CPU和多达2TB的内存,KVM宿主机支持4096个CPU核心和多达64TB的内存。

2. KVM的局限性:

1). CPU过载使用

KVM允许过载使用CPU,但是过载能力有限,过载使用不但不会提升性能反而会降低性能。一般所有虚拟CPU数量加在一起不要大于物理CPU核心数,一旦超过物理CPU数量依然需要调度。
2). 虚拟化时间需要依赖外部时钟才能实现精确计时

Linux系统有个特性,它有两套时钟,一套是硬件时钟、另一套是系统启动时从硬件读取的时间称为系统时间。当系统一旦启动后,系统时间就开始自己记时了,根据CPU震荡频率来计时,比如是一个2G赫兹的CPU,那么系统就认为1s中震荡2G个时钟周期,它就认为时间过1s,计时非常精确。但是很遗憾的是,一旦我们做了虚拟化,就意味着这颗CPU未必就是供这一个虚拟机所使用的,比如2G赫兹的CPU,这个虚拟机只得到了1G赫兹,那么此虚拟化还是以2G赫兹为1s计时,就会比正常时间整整慢一半。所以任何虚拟机的时钟都不会精确,包括vmware workstations(vmware提供的vmware tools工具就是实现把虚拟机时间一直跟系统时间同步),一般所有虚拟化都需要提供一个时钟服务器,一直同步这个比较精确的时间。
3). MAC地址

KVM的MAC地址分配机制跟vmare一样,前24位固定,后24后随机。当虚拟机量特别大时,可能会出现MAC地址冲突。
4). 性能影响

对于CPU MMU来讲,在完全虚拟化模式下,性能大概有10%的损耗;如果支持EPT技术以及硬件辅助虚拟化技术,性能损耗大概在5%左右。
对于网络IO在完全虚拟化模式下,只相当于物理硬件性能的60%左右;半虚拟化模式下75%;透传模式下95%。
对于磁盘IO如果使用模拟的方式,只相当于物理硬件性能的40%左右;如果使用半虚拟化性能在85%左右,所以磁盘IO是最需要半虚拟化的;如果是透传大概在95%左右。
对于显卡设备模拟,相当于物理硬件设备的50%左右;然后半虚拟化是不支持的。
对于时间计时在完全虚拟化模式下,是不可能精确;在半虚拟化模式下,可以做到精确,因为它有一个特殊模块来完成计时辅助。

参考文献:
http://www.ywnds.com/?p=5842
https://www.cnblogs.com/clsn/p/8366251.html#auto_id_29

以上是关于KVM虚拟化的主要内容,如果未能解决你的问题,请参考以下文章

虚拟化技术kvm

KVM虚拟化平台部署及管理

kvm基本原理

KVM虚拟化知识的一些笔记

KVM虚拟化管理平台的实现

虚拟化技术之KVM平台部署及简单应用