KVM安装及CPU内存虚拟化

Posted SYWcloud

tags:

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

一、centos7下的KVM安装

1、安装kvm和管理工具包

    [root@suyiwen ~]# yum install libvirt-client  libvirt-python  qemu-kvm virt-manager libvirt virt-viewer virt-top virt-what qemu-img virt-install

2、安装图形化界面

    [root@suyiwen ~]# yum groupinstall -y "Desktop" "Desktop Platform" "Desktop Platform Development" "Fonts" "General purpose Desktop" "Graphical Administration Tools" "Graphics Greation Tools" "Input Methods" "X Window System" "Internet Browser"

3、加载KVM内核模块

    [root@suyiwen ~]# modprobe kvm

4、查看模块是否已经装载

    [root@suyiwen ~]# lsmod | grep kvm
    kvm_intel             170086  0 
    kvm                   566340  1 kvm_intel
    irqbypass              13503  1 kvm

5、安装vnc与vnc-server

[root@suyiwen ~]# yum install tigervnc tigervnc-server

6、使用virt-install命令创建虚拟机

1)语法格式

        virt-install --name NAME --memory MB STORAGE INSTALL [options]

2)基本选项

        -n NAME, --name NAME  指定vm实例名称
        --memory MEMORY       指定vm内存,如下实例:
                                --memory 1024 (in MiB)            //指定内存大小
                                --memory 512,maxmemory=1024        //指定内存大小为512M,最大内存为1024M
                                --memory 512,maxmemory=1024,hotplugmemorymax=2048,hotplugmemoryslots=2    //
        --vcpus VCPUS         Number of vcpus to configure for your guest. Ex:
                                --vcpus 5
                                --vcpus 5,maxcpus=10,cpuset=1-4,6,8
                                --vcpus sockets=2,cores=4,threads=2,
        --cpu CPU             CPU model and features. Ex:
                                --cpu coreduo,+x2apic
                                --cpu host
        --metadata METADATA   Configure guest metadata. Ex:
                                --metadata name=foo,title="My pretty title",uuid=...
                                --metadata description="My nice long description"

二、KVM虚拟化cpu虚拟化和内存虚拟化

1、SMP技术:SMP技术是多个CPU通过同一个总线访问内存,也称之为UMA(一致内存访问),一致性指任何时候CPU必须为内存的每一个数据保持或者共享同一个数值

2、MPP模式:MPP靠软件来实现,相当于实现SMP的一个横向扩展集群

3、NUMA架构:NUMA架构简单来说就是计算机上有多个处理器,每个处理器有自己单独的内存,当然也可以访问其它节点的内存

1)使用命令numactl可以查看计算机的CPU情况,例如:

        [root@suyiwen ~]# numactl --hardware
        available: 2 nodes (0-1)
        node 0 cpus: 0 2 4 6 8 10 12 14 16 18 20 22
        node 0 size: 65536 MB
        node 0 free: 62875 MB
        node 1 cpus: 1 3 5 7 9 11 13 15 17 19 21 23
        node 1 size: 65523 MB
        node 1 free: 58250 MB
        node distances:
        node   0   1 
          0:  10  20 
          1:  20  10 

2)使用numastat命令可以查看各节点内存使用情况,例如:

        [root@suyiwen ~]# numastat
                                   node0           node1
        numa_hit                 2795025         4297777
        numa_miss                      0               0
        numa_foreign                   0               0
        interleave_hit             33335           32976
        local_node               2787372         4271270
        other_node                  7653           26507
        [root@suyiwen ~]# 

4、linux系统默认使用的是numa自动平衡的策略,改变策略可以修改/proc/sys/kernel/numa_balancing的值,值为0是表示关闭自动平衡策略,值为1时表示使用自动平衡策略,例如:

    [root@suyiwen ~]# cat /proc/sys/kernel/numa_balancing
    1

5、查看、修改VM的numa配置,使用virsh numatune命令。

1)查看VM的numa配置信息:

        [root@suyiwen ~]# virsh numatune Centos7-1
        numa_mode      : strict
        numa_nodeset   : 

2)修改VM的numa配置信息:

        virsh numatune Centos7-1 --nodeset '0,2-3'

6、KSM(kernel same-pages merging | kernel shared memory):多台VM可以将相同部分的内存合并,进行多VM共享相同部分的内存数据,可以在有限内存总量的情况下增加VM的密度

1)KSM依赖两个服务ksm和ksmtuned,centos6和7默认是开启的,可以通过关闭服务或开启服务来操作KSM,在线操作对业务没有影响,系统会逐步合并或者释放内存页,

2)关闭某个虚拟机KSM的方法,在虚拟机配置文件修改或者添加如下内容:

        </memoryBacking>
            <nosharepages/>
        </memoryBacking>

3)查看KSM运行的相关信息:

        [root@susu ~]# cat /sys/kernel/mm/ksm/pages_shared         //有多少内存共享页正在使用
        0
        [root@susu ~]# cat /sys/kernel/mm/ksm/pages_sharing     //有多少节点内存页被共享和保存的
        0
        [root@susu ~]# cat /sys/kernel/mm/ksm/pages_unshared     //内存页合并时内容独特被反复检查的数量
        0
        [root@susu ~]# cat /sys/kernel/mm/ksm/full_scans         //多少次内存可以合并的区域被扫面
        0
        [root@susu ~]# cat /sys/kernel/mm/ksm/pages_volatile     //多少内存页改变太快被放置
        0

4)KSM可以跨numa节点进行内存的合并,如果需要关闭跨节点的内存可并,可修改/sys/kernel/mm/ksm/merge_across_nodes参数,值为0时关闭跨numa节点的KSM,值为1时打开,centos7默认打开状态

    [root@suyiwen ~]# cat /sys/kernel/mm/ksm/merge_across_nodes 
    1

7、针对特定的VM关闭KSM特性需要修改VM的配置文件添加如下内容:

    <memoryBacking>
            <nosharepages>
    </memortBacking>

8、VM中CPU绑定管理

1)使用virsh vcpuinfo VMID可以查看虚拟机CPU与物理CPU的对应关系

        [root@suyiwen ~]# virsh vcpuinfo 13
        VCPU:           0                            //虚拟机VCPU第几核
        CPU:            15                            //被调度到物理CPU的第几核
        State:          running
        CPU time:       31.5s                        //vcpu占用的时钟频率
        CPU Affinity:   yyyyyyyyyyyyyyyyyyyyyyyy    //cpu亲和性,y表示可以被调度到哪些物理CPU上

2)使用virsh emulatorpin命令查看或者绑定虚拟机vcpu能在哪些物理CPU上调度

    示例1:查看虚拟机vcpu能在哪些物理核上调度
        [root@suyiwen ~]# virsh emulatorpin 13
        emulator: CPU Affinity
        ----------------------------------
               *: 0-23

示例2:修改虚拟机vcpu只能在21核到23核之间调度

        [root@suyiwen ~]# virsh emulatorpin 12 21-23 --live        //--live表示立即生效,--config表示下次重启生效

        [root@suyiwen ~]# virsh emulatorpin 12
        emulator: CPU Affinity
        ----------------------------------
               *: 21-23
        自动会修改虚拟机的xml文件增加如下配置
        <cputune>
            <emulatorpin cpuset='21-23'/>
          </cputune>

9、强制虚拟机vcpu与物理CPU1对1绑定,如将0号vcpu与物理20号cpu进行绑定,1号vcpu与23号CPU进行1对1绑定

    [root@suyiwen ~]# virsh vcpupin 12 0 20

    [root@suyiwen ~]# virsh vcpupin 12 1 21

    [root@suyiwen ~]# virsh vcpupin 12
    VCPU: CPU Affinity
    ----------------------------------
       0: 20
       1: 21

修改后自动修改虚拟机配置文件,修改后配置如下:

       <cputune>
        <vcpupin vcpu='0' cpuset='20'/>
        <vcpupin vcpu='1' cpuset='21'/>
        <emulatorpin cpuset='21-23'/>
      </cputune>

10、虚拟机vcpu热添加使用命令virsh setvcpus进行添加,如

[root@suyiwen ~]# virsh setvcpus 14 4 --live
    热添加需要事先定义最大vcpu个数,xml文件如下配置,表示当前vcpu数为4个,最大可以添加到10个
 <vcpu placement='static' current='4'>10</vcpu>
 注意:vcpu可以热添加,但是不能热减少,减少cpu需要虚拟机关机状态

11、kvm虚拟vcpu模式

    1)custom模式
    2)host-model模式,根据物理CPU,选择一个靠近物理cpu的型号标准通用型号提供给虚拟机,虚拟机看不到具体的型号,只能看到大型号比如E56xx
    3)host-passthrough模式,将物理CPU暴露给虚拟机,虚拟机能就能直接看到CPU型号

12、CPU nexted技术,通过host-passthrough技术可以使得kvm嵌套 在KVM中,理论上可以一直嵌套。配置KVM嵌套方法如下:

1)打开内核nested特性,编辑/etc/modprobe.d/kvm_mod.conf添加以下内容:

        options kvm-intel nested=y

2)移除kvm模块重新加载

        [root@suyiwen ~]# rmmod kvm-intel
        [root@suyiwen ~]# modprobe kvm-intel
        [root@suyiwen ~]# cat /sys/module/kvm_intel/parameters/nested 
        Y

3)修改虚拟机xml配置文件如下:

     <cpu mode='host-model' check='partial'>
        <model fallback='allow'/>
      </cpu>

4)如果虚拟机里面还需要嵌套再在虚拟机如上3部配置。

13、内存气泡技术(balloon),可以将虚拟机暂时用不到的内存回收然后分配给其它需要使用该技术的主机,实现内存超分配,提高虚拟机密度。

1)内存气泡技术需要虚拟机安装virt balloon驱动,内核开启CONFIG_VIRTIO_BALLOON,centos7默认开启的,虚拟机的xml配置:

            <memballoon model='virtio'>
              <address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
            </memballoon>
        虚拟机加载virtio memory balloon驱动:
            [root@localhost ~]# lspci | fep -i "virtio memory balloon"
            00:07.0 Unclassified device [00ff]: Red Hat, Inc Virtio memory balloon
        虚拟机加载balloon模块:
        [root@localhost ~]# lsmod | grep balloon
        virtio_balloon         13864  0 
        virtio_ring            22746  1 virtio_balloon
        virtio                 14959  1 virtio_balloon

2)查看修改虚拟机balloon配置使用virsh qemu-monitor-command命令:

        查看虚拟机内存大小:
            [root@susu ~]# virsh qemu-monitor-command Centos7-1 --hmp --cmd info balloon
            balloon: actual=2048
        修改虚拟机内存并查看:
            [root@susu ~]# virsh qemu-monitor-command Centos7-1 --hmp --cmd balloon 1024


            [root@susu ~]# virsh qemu-monitor-command Centos7-1 --hmp --cmd info balloon
            balloon: actual=1024

3)windows修改跟Linux一样,不过需要手动安装virtio memory balloon驱动

14、内存限制技术,可将虚拟机内存限制在一定的范围内,通过命令virsh memtune命令来实现

1)语法格式:

         memtune <domain> [--hard-limit <number>] [--soft-limit <number>] [--swap-hard-limit <number>] [--min-guarantee <number>] [--config] [--live] [--current]
         --hard-limit:虚拟机可使用的最大内存
         --soft-limit:竞争时的内存
         --swap-hard-limit:最大的物理内存加上swap
         --min-guarantee:最低给虚拟机分配的内存
         --config:表示仅修改配置文件,重启后才生效
         --live:表示仅修改运行虚拟机的参数,重启后将失效,默认选项
         --current:表示同时修改虚拟机运行的参数和配置文件,重启后还生效

2)应用示例:

示例1:限制虚拟机Centos7-1最大的使用内存为8GB,重启后才生效

            [root@susu ~]# virsh memtune Centos7-1 --hard-limit=9012MB --config
此时虚拟机的xml配置文件修改内容:
              <memtune>
                <hard_limit unit='KiB'>8800782</hard_limit>
              </memtune>

示例2:限制虚拟机Centos7-1竞争时内存为8GB,重启后生效

            [root@susu ~]# virsh memtune Centos7-1 --soft-limit=6GB --config

            此时虚拟机的xml配置文件修改内容:
             <memtune>
                <hard_limit unit='KiB'>8800782</hard_limit>
                <soft_limit unit='KiB'>5859375</soft_limit>
              </memtune>

示例3:保证虚拟机Centos7-1至少可以分配到4GB内存:

            [root@susu ~]# virsh memtune Centos7-1 --min-guarantee 4GB --config

示例4:通过修改配置文件可以限制宿主机将swap内存分配给虚拟机使用(前提是必须配置hard_limit):

            <memoryBacking>
                <locked>
            </memoryBacking>

15、透明巨型页技术,centos6以后默认使用透明巨型页技术,可以自动进行调整(x86系统默认内存页的大小为4KB,巨型页可以分配2MB或者1GB内存页给虚拟机使用,提高效率)

1)查看或修改内存巨型页:

        [root@susu ~]# cat /sys/kernel/mm/transparent_hugepage/enabled 
        [always] madvise never
        always:表示尽量使用内存巨型页
        madvise:表示尽量联使用透明内存巨型页
        never:表示不使用内存巨型页

2)透明内存巨型页的使用情况查看:

        [root@susu ~]# cat /proc/meminfo | grep -i huge
        AnonHugePages:   1198080 kB
        HugePages_Total:       0
        HugePages_Free:        0
        HugePages_Rsvd:        0
        HugePages_Surp:        0
        Hugepagesize:       2048 kB
        [root@susu ~]# 

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

KVM详解

Openstack 实战讲解之-----------02-控制节点kvm虚拟化配置

kvm介绍 转载

centOS6安装KVM及虚拟机

KVM搭建及管理,虚拟机快建

KVM安装与配置