kvm迁移及优化
静态迁移(冷迁移)
对于静态迁移,你可以在宿主机上保存一个完整的客户机镜像快照,然后在宿主机中关闭或
者暂停该客户机,然后将该客户机的镜像文件复制到另一台宿主机中,使用在源主机中启动该客户
机时的命令来启动复制过来的镜像。
动态迁移(热迁移)
如果源宿主机和目的宿主机共享存储系统,则只需要通过网络发送客户机的 vCPU 执行状
态、内存中的内容、虚机设备的状态到目的主机上。否则,还需要将客户机的磁盘存储发到目的主
机上。共享存储系统指的是源和目的虚机的镜像文件目录是在一个共享的存储上的。
在基于共享存储系统时,KVM 动态迁移的具体过程为:
1、迁移开始时,客户机依然在宿主机上运行,与此同时,客户机的内存页被传输到目的主机上。
2、QEMU/KVM 会监控并记录下迁移过程中所有已被传输的内存页的任何修改,并在所有内存页都传
输完成后即开始传输在前面过程中内存页的更改内容。
3、QEMU/KVM 会估计迁移过程中的传输速度,当剩余的内存数据量能够在一个可以设定的时间周期
(默认 30 毫秒)内传输完成时,QEMU/KVM 会关闭源宿主机上的客户机,再将剩余的数据量传输
到目的主机上,最后传输过来的内存内容在目的宿主机上恢复客户机的运行状态。
4、至此,KVM 的动态迁移操作就完成了。迁移后的客户机尽可能与迁移前一致,除非目的主机上
缺少一些配置,比如网桥等。
注意,当客户机中内存使用率非常大而且修改频繁时,内存中数据不断被修改的速度大于KVM能够
传输的内存速度时,动态迁移的过程是完成不了的,这时候只能静态迁移。
关于实时迁移的效率,业界不少人提出了改进的建议,比如通过使用内存压缩技术,减少需要传输
的内存的大小
迁移注意事项:
1、最好迁移的服务器cpu品牌一样
2、64位只能在64位宿主机间迁移,32位可以迁移32位和64位宿主机
3、宿主机中的虚拟机名字不能冲突
4、目的宿主机和源宿主机软件配置尽可能的相同,如 有相同的桥接网卡,资源池等。
5、两台迁移的主机 cat /proc/cpuinfo |grep nx 的设置是相同的NX,全名为“No eXecute”,即“禁止运行”,是应用在CPU的一种技术,用作把存储器区域分隔为只供存储处理器指令集,或只供数据使用。任何使用NX技术的存储器,代表仅供数据使用,因此处理器的指令集并不能在这些区域存储。这种技术可防止大多数的缓冲溢出*,即一些恶意程序,把自身的恶意指令集放在其他程序的数据存储区并运行,从而把整台计算机控制。
静态迁移**
1.拷贝镜像文件和虚拟机配置文件2.重新定义此虚拟机
动态迁移:
1.创建共享存储
2.两台机器挂载共享存储(手工挂载;使用资源池)
3.启动动态迁移
4.创建迁移后的虚拟机配置文件
5.重新定义虚拟机
1.冷迁移(静态迁移)
test01 test02
192.168.1.12 192.168.1.13
(1)两台虚拟机防火墙全部关闭,禁用selinux
[ ~]# systemctl stop firewalld //关闭防火墙 [ ~]# vim /etc/selinux/config //修改selinux状态,需重启linux生效
[ ~]# getenforce
Disabled //查看selinux状态
//迁移和克隆差不多,都需要对磁盘文件和xml配置文件进行操作
先做在虚拟机做一个测试文件一个
[ ~]# virsh start test01
域 test01 已开始 //先打开虚拟机
[ ~] vi xgp
Xgp666
然后虚拟机关机
Kvm01
[ ~]# scp /etc/libvirt/qemu/test01.xml :/etc/libvirt/qemu/
//复制配置文件
[ ~]# scp /kvm-vm/centos.raw :/kvm-vm/
Kvm02
[ ~]# cd /etc/libvirt/qemu/ //进入虚拟机配置文件路径 [ qemu]# virsh define test01.xml 定义域 test01(从 test01.xml) [ qemu]# virsh start test01 //开启test01
验证一下虚拟机里是否有刚刚在kvm01创建的文件
热迁移(动态迁移)
test01 test02 nfx
192.168.1.12 192.168.1.13 192.168.1.80
1)在nfs服务器上的操作
[ ~]# yum -y install nfs-utils //安装nfs工具 [ ~]# mkdir /kvmshare //创建一个共享目录 [ ~]# vim /etc/exports //允许用户名单和权限 /kvmshare *(rw,sync,no_root_squash)
//可读写,同步到磁盘,相当于使用root权限(如果没有这条需要有777权限)
开启各项服务
[ ~]# systemctl start rpcbind [ ~]# systemctl enable rpcbind [ ~]# systemctl start nfs-server [ ~]# systemctl enable nfs-server [ ~]# systemctl stop firewalld //关闭防火墙 [ ~]# setenforce 0 //禁用selinux
两台kvm测试能否访问到nfs
[ ~]# showmount -e 192.168.1.80
`
[ ~]# showmount -e 192.168.1.80
2)kvm01上基于NFS服务创建虚拟机
验证:
1.12:
[ ~]# touch /opt/nfsshare/test
//创建一个文件
1.80:
[ ~]# ls /kvmshare/
centos7.qcow2 test //查看一下
//存储池和存储卷完成之后,直接创建虚拟机
配置虚拟机使用bridge桥接网路,使其能够ping的通外网。并且在这里我们执行一个ping百度的命令,并让他保持一直是ping着的状态,用来模拟迁移到kvm02上服务不中断。
Kvm01
然后最小化安装一个linux
然后给这个linux设置桥接网络
1)关闭虚拟机
[ kvm-vm]# virsh destroy centos7.0
域 test02 被删除
2)创建虚拟桥接网考br0
[ kvm-vm]# systemctl stop NetworkManage //关闭network管理工具关闭 [ kvm-vm]# virsh iface-bridge ens33 br0 //他会提示失败,没关系最后启用就行了 使用附加设备 br0 生成桥接 ens33 失败 已启动桥接接口 br0
3)修改kvm虚拟机域的xml配置文件(定位到interface)
[ network-scripts]# virsh edit centos7.0 编辑了域 centos7.0 XML 配置。 <interface type=‘bridge‘> #修改network <mac address=‘52:54:00:75:f0:8f‘/> #删除 <source bridge=‘br0‘/> #修改
4)开启虚拟机域,配置IP,验证 是否能够联通外网
[ network-scripts]# virsh start centos7.0
域 centos7.0 已开始
centos7.0虚拟机设置
vi /etc/sysconfig/network-scripts/ifcfg-eth0
systemctl restart network
测试ping baidu.com
配置虚拟机使用bridge桥接网络,使其可ping通外网
Kvm02操作,创建存储池和kvm01一样
这里创建完成之后,会看到之前在kvm01.上创建的test文件和centos.qcow2
的存储卷。
在KVM01上链接kvm02
//因为kvm01上用的是bridge br0网卡,所以Kvm02 也来一个桥接网络
1)创建虚拟桥接网考br0
[ kvm-vm]# systemctl stop NetworkManage //关闭network管理工具关闭 [ kvm-vm]# virsh iface-bridge ens33 br0 //他会提示失败,没关系最后启用就行了 使用附加设备 br0 生成桥接 ens33 失败 已启动桥接接口 br0 [ ~]# brctl show #查看一下 bridge name bridge id STP enabled interfaces br0 8000.000c29ccc9f4 yes ens33 virbr0 8000.5254008b52f8 yes virbr0-nic
在kvm01上迁移centos7.0
迁移之前在centos7.0里ping baidu.com
迁移完了之后在kvm上查看一下是否还在ping
迁移完毕
常见错误:
1、迁移时遇到的错误描述:
virsh migrate centos --live qemu+ssh://192.168.30.132/system
error: unable to connect to server at ‘KVM-2:49152‘: No route to host
原因:你的免密登录没有成功
解决方法:重新做免密登录即可
2、迁移时的存储错误:# virsh migrate centos --live qemu+ssh://192.168.30.132/system
error: Failed to open file ‘/mnt/CentOS6.8.qcow2‘: Input/output error
原因:存储没有挂载成功
解决方法:mount -o remount /dev/sdb /mnt
3、迁移时FQDN错误:
virsh migrate centos --live qemu+ssh://192.168.30.132/system
error: internal error hostname on destination resolved to localhost, but migration requires
an FQDN
原因:两台宿主机无法解析主机名
解决方法:重新配置主机名和ip的解析
4、迁移时语法错误:
virsh migrate centos --live qemu+ssh://192.168.30.132:/system
error: internal error Unable to parse URI qemu+ssh://192.168.30.132:/system
原因:qemu+ssh语法写错了
解 决 方 法 : 正 确 的 应 该 是 : virsh migrate centos --live
qemu+ssh://192.168.30.132/system
firewall-cmd --add-port=49152/tcp
KVM性能优化
1、KVM为什么要调优
性能的损耗是关键。KVM采用全虚拟化技术,全虚拟化要有一个软件来模拟硬件层,故有一
定的损耗,特别是I/O,因此需要优化。KVM性能优化主要在CPU、内存、I/O这几方面。当然
对于这几方面的优化,也是要分场景的,不同的场景其优化方向也是不同的。
2、KVM优化思路及步骤
KVM的性能已经很不错了,但还有一些微调措施可以进一步提高KVM性能。
1)CPU优化
要考虑CPU的数量问题,所有guestcpu的总数目不要超过物理机CPU的总数目。如果超
过,则将对性能带来严重影响,建议选择复制主机CPU配置,如图所示:
KSM(kernel samepage merging,相同页合并)
内存分配的最小单位是page(页面),默认大小是4KB。可以将host主机内容相同的内存
合并,以节省内存的使用,特别是在虚拟机操作系统都一样的情况下,肯定会有很多内容相
同的内存值,开启了KSM,则会将这些内存合并为一个,当然这个过程会有性能损耗,所以
开启与否,需要考虑使用场景。
而KSM对KVM环境有很重要的意义,当KVM上运行许多相同系统的客户机时,客户机之间
将有许多内存页是完全相同的,特别是只读的内核代码页完全可以在客户机之间共享,从而
减少客户机占用的内存资源,能同时运行更多的客户机。
通过/sys/kernel/mm/ksm目录下的文件可查看内存页共享的情况:
KSM主要有两个服务:ksm和ksmtuned。
ksm的配置文件:/sys/kernel/mm/ksm/*1
full_scans:已经对所有可合并的内存区域扫描过的次数。
pages_shared:正在使用中的共享内存页数量
pages_sharing:有多少内存页正在使用被合并的共享页,不包括合并内存页本
身。这是实际节省的内存页数量。
pages_to_scan:在ksmd进程休眠之前会去扫描的内存页的数量。
pages_unshared:无重复内容而不可以被合并的内存页数量。
pages_volatile:因为内容很容易变化而不被合并的内存页数量。
run:控制ksmd是否运行。0:停止运行但是保存合并的内存页;1:马上运行
ksmd;2:停止运行,并且分立已经合并的所有内存页。
sleep_millisecs:ksmd进程的休眠时间。
其中pages_to_scan、sleep_millisecs、run三个文件是可读写的,其他文件是
只读的。
2、配置和使用ksmtuned
配置文件:/etc/ksmtuned.conf
ksmtuned会一直保持循环执行,以调节ksm服务运行。
pages_shared文件记录了KSM共享的总页面数;
pages_sharing文件中记录了当前共享的页面数。
每个页面的大小为4KB,可计算出共享内存为:4 * 页面数 = 内存大小(KB)。
查看是否开启KSM,0是不开启,1是开启
[ ksm]# pwd
/sys/kernel/mm/ksm
[ ksm]# cat run
0
临时开启KSM,只能使用重定向,不支持用VI编辑器,可以在/etc/rc.local中添加
echo 1 > /sys/kernel/mm/ksm/run 让KSM开机自动运行[ ksm]# echo 1 > run
[ ksm]# cat run
1
定期扫描相同页,sleep_millisecs决定多长时间,pages_to_scan决定每次查看多少个
页面,默认为100,越大越好,超过2000无效,需要开启两个服务ksmtuned和tuned支持更多页面
KSM会影响系统性能甚到高达10%-50%,以效率换空间,如果系统的内存很宽裕,则无
须开启KSM,如果想尽可能多地并行运行KVM客户机,则可以打开KSM。
对内存设置限制
如果有多个虚拟机,为了防止某个虚拟机无节制的使用内存资源,导致其它虚拟机无法
正常使用,就需要对内存的使用进行限制。
查看当前虚拟机vm002内存的限制,单位为KB
[ ksm]# virsh memtune vm002
hard_limit : 无限制
soft_limit : 无限制
swap_hard_limit: 无限制
调整内存的语法:
[ ksm]# virsh memtune --help
...................
OPTIONS
[--domain] <string> domain name, id or uuid
--hard-limit <number> Max memory, as scaled integer (default KiB)
--soft-limit <number> Memory during contention, as scaled integer
(default KiB)
--swap-hard-limit <number> Max memory plus swap, as scaled integer
(default KiB)
--min-guarantee <number> Min guaranteed memory, as scaled integer
(default KiB)
//保证最小内存
--config affect next boot //下次启动生效
--live affect running domain //在线生效
--current affect current domain //只在当前生效
例如:设置vm002虚拟机强制最大内存1024M,并在线生效
[ ksm]# virsh memtune vm002 --hard-limit 1024000 --live大页后端内存(Huge Page Backed Memory)
在逻辑地址向物理地址转换时,CPU保持一个翻译后备缓冲期TLB(Translation
Lookaside Buffer转换检测缓冲区),用来缓存转换结果,而TLB容量很小,所以如果page很
小,TLB很容易就充满,这样就容易导致cache miss,相反page变大,TLB需要保存的缓存项
就变少,就会减少cache miss。通过为客户机提供大页后端内存,就能减少客户机消耗的内
存并提高TLB命中率,从而提高KVM性能。
Intel的x86 CPU通常使用4KB内存页,但是经过配置,也能够使用大页(huge
page)
使用大页,KVM的虚拟机的页表将使用更少的内存,并且将提高CPU的效率。
查看大页功能是否开启,默认是开启的
[ ksm]# cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never
默认情况下,大页的数目为0,通过下面的方式可以查看到:
[ ksm]# cat /proc/meminfo | grep -i hugepages
AnonHugePages: 790528 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
设置系统的大页数量,即大页需要的内存页面数,临时生效
[ ksm]# echo 25000 > /proc/sys/vm/nr_hugepages
[ ksm]# cat /proc/meminfo | grep -i hugepages
AnonHugePages: 856064 kB
HugePages_Total: 766
HugePages_Free: 766 //现在没有任何软件在使用大页
HugePages_Rsvd: 0
HugePages_Surp: 0
指定大页需要的内存页面数永久生效
[ ksm]# sysctl -w vm.nr_hugepages=25000
vm.nr_hugepages = 25000
或者在/etc/sysctl.conf中添加vm.nr_hugepages=25000来持久设定大页文件系统
需要的内存页面数。
注意:大页文件系统需要的页面数可以由客户机需要的内存除以页面大小大体估
算关闭虚拟机vm002
[ ksm]# virsh destroy vm002
setlocale: No such file or directory
Domain vm002 destroyed
编辑虚拟机的XML配置文件使用大页来分配内存
[ ksm]# virsh edit vm002
<name>vm002</name>
<uuid>e144e9ba-a125-4a97-9cf1-1c571f58817a</uuid>
<memory unit=‘KiB‘>1048576</memory>
<currentMemory unit=‘KiB‘>1048576</currentMemory>
<memoryBacking><hugepages/></memoryBacking> //添加,使用大页
挂载hugetlbfs文件系统
[ ksm]# mount -t hugetlbfs hugetlbfs /dev/hugepages/
重启libvirtd服务
[ ksm]# systemctl restart libvirtd
启动虚拟机vm002
[ ksm]# virsh start vm002
setlocale: No such file or directory
Domain vm002 started
[ ksm]# virsh list
setlocale: No such file or directory
Id Name State
1 vm002 running
查看使用情况
[ ksm]# cat /proc/meminfo |grep -i hugepage
AnonHugePages: 55296 kB
HugePages_Total: 1033
HugePages_Free: 513
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
可以看到消耗了520个大页(1033-513),每个页面大小为2M,正好是虚拟机vm002消耗
的内存。
让系统开机自动挂载hugetlbfs文件系统,在/etc/fstab中添加:hugetlbfs /dev/hugepages hugetlbfs defaults 0 0
I/O的优化
在实际的生产环境中,为了避免过度消耗磁盘资源而对其它的虚拟机造成影响,我
们希望每台虚拟机对磁盘资源的消耗是可以控制的。比如多个虚拟机往硬盘中写数据,谁可
以优先写,就可以调整I/O的权重weight,权重越高写入磁盘的优先级越高。
对磁盘的I/O控制有两种方式:
1)在整体中的权重,范围在100-1000
2)限制具体的I/O。
[ ~]# virsh blkiotune vm002
weight : 1000
device_weight :
device_read_iops_sec:
device_write_iops_sec:
device_read_bytes_sec:
device_write_bytes_sec:
设置权重为500
[ ~]# virsh blkiotune vm002 --weight 500
[ ~]# virsh blkiotune vm002
weight : 500
device_weight :
device_read_iops_sec:
device_write_iops_sec:
device_read_bytes_sec:
device_write_bytes_sec:
编辑虚拟机的XML配置文件:
还可以使用blkdeviotune设置虚拟机的读写速度,语法如下:
[ ~]# virsh blkdeviotune --help
.........--total-bytes-sec <number> total throughput limit, as scaled integer
(default bytes)
--read-bytes-sec <number> read throughput limit, as scaled integer
(default bytes)
--write-bytes-sec <number> write throughput limit, as scaled integer
(default bytes)
--total-iops-sec <number> 以每秒字节数位单位的总 I/O 操作限制
--read-iops-sec <number> 以每秒字节数位单位的读取 I/O 操作限制
--write-iops-sec <number> 以每秒字节数位单位的写入 I/O 限制
--total-bytes-sec-max <number> total max, as scaled integer (default
bytes)
--read-bytes-sec-max <number> read max, as scaled integer (default
bytes)
--write-bytes-sec-max <number> write max, as scaled integer (default
bytes)
--total-iops-sec-max <number> total I/O operations max
--read-iops-sec-max <number> read I/O operations max
--write-iops-sec-max <number> write I/O operations max
--size-iops-sec <number> I/O size in bytes
--group-name <string> group name to share I/O quota between
multiple drives
--total-bytes-sec-max-length <number> duration in seconds to allow total
max bytes
--read-bytes-sec-max-length <number> duration in seconds to allow read
max bytes
--write-bytes-sec-max-length <number> duration in seconds to allow write max
bytes
--total-iops-sec-max-length <number> duration in seconds to allow total I/O
operations max
--read-iops-sec-max-length <number> duration in seconds to allow read I/O
operations max
--write-iops-sec-max-length <number> duration in seconds to allow write I/O
operations max
--config 影响下一次引导
--live 影响运行的域--current 影响当前域
系统调优工具tuned/tuned-adm
CentOS在6.3版本以后引入了一套新的 系统调优工具tuned/tuned-adm,其中,
tuned是服务端程序,用来监控和收集系统各个组件的数据,并依据数据提供的信息动态调
整系统设置,达到动态优化系统的目的;tuned-adm是客户端程序,用来和tuned打交
道,用命令行的方式管理和配置tuned,tuned-adm提供了一些预先配置的优化方案可供
直接使用。当然不同的系统和应用场景有不同的优化方案,tuned-adm预先配置的优化策
略不是总能满足要求,这时候就需要定制,tuned-adm允许用户自己创建和定制新的调优
方案。
安装tuned工具
[ ~]# yum install tuned -y
开机启动并开启tuned服务
[ ~]# systemctl start tuned
[ ~]# systemctl enable tuned
[ ~]# systemctl status tuned
● tuned.service - Dynamic System Tuning Daemon
Loaded: loaded (/usr/lib/systemd/system/tuned.service; enabled; vendor
preset: enabled)
Active: active (running) since 二 2017-10-17 08:36:52 CST; 5h 56min ago
Main PID: 1332 (tuned)
CGroup: /system.slice/tuned.service
└─
1332 /usr/bin/python -Es /usr/sbin/tuned -l -P
10月 17 08:36:52 kvm001 systemd[1]: Starting Dynamic System Tuning
Daemon...
10月 17 08:36:52 kvm001 systemd[1]: Started Dynamic System Tuning
Daemon.
查看当前优化方案
[ ~]# tuned-adm active
Current active profile: virtual-guest
查看预先设定好的优化方案
[ ~]# tuned-adm list
Available profiles:
- balanced - General non-specialized tuned profile
- desktop - Optmize for the desktop use-case- latency-performance - Optimize for deterministic performance at
the cost of increased power consumption \延迟性能调试的服务器配置,以提高功耗
为代价优化确定性性能 - network-latency - Optimize for deterministic performance at the
cost of increased power consumption, focused on low latency network
performance - network-throughput - Optimize for streaming network throughput.
Generally only necessary on older CPUs or 40G+ networks. - powersave - Optimize for low power consumption
- throughput-performance - Broadly applicable tuning that provides
excellent performance across a variety of common server workloads. This is the
default profile for RHEL7.
//吞吐性能调整的服务器profile。如果系统没有企业级存储,则建议使用这个
profile - virtual-guest - Optimize for running inside a virtual guest.
\企业级服务器配置中使用这个profile,其中包括电池备份控制程序、缓存保护
及管理磁盘缓存 - virtual-host - Optimize for running KVM guests
\根据enterprise-storage配置,virtual-host还可减少可置换的虚拟内存,并启
用更多集合脏页写回。同时推荐在虚拟化主机中使用这个配置,包括KVM和红帽企业版
linux虚拟化主机
Current active profile: virtual-guest
修改优化方案为virtual-host
[ ~]# tuned-adm profile virtual-host
[ ~]# tuned-adm active
Current active profile: virtual-host
如果预定的方案不是总能满足要求,用户可以为自己的需求定制自己的优化方案。
自己定制很容易,只需切换到优化方案的配置目录:/usr/lib/tuned/,不同的profile以目录
的形式存在,拷贝其中一个例子,然后编辑里面的相关参数就可以了,使用tuned-adm list
命令就能看到新创建的方案。
[ tuned]# pwd
/usr/lib/tuned
[ tuned]# cp -r virtual-host/ my-server
[ tuned]# lsbalanced functions my-server network-throughput
recommend.conf virtual-guest
desktop latency-performance network-latency powersave
throughput-performance virtual-host
编辑my-server目录中的文件添加调优参数即可:
[ tuned]# tuned-adm list
Available profiles: - balanced - General non-specialized tuned profile
- desktop - Optmize for the desktop use-case
- latency-performance - Optimize for deterministic performance at
the cost of increased power consumption - my-server - Optimize for running KVM guests
- network-latency - Optimize for deterministic performance at the
cost of increased power consumption, focused on low latency network
performance - network-throughput - Optimize for streaming network throughput.
Generally only necessary on older CPUs or 40G+ networks. - powersave - Optimize for low power consumption
- throughput-performance - Broadly applicable tuning that provides
excellent performance across a variety of common server workloads. This is the
default profile for RHEL7. - virtual-guest - Optimize for running inside a virtual guest.
- virtual-host - Optimize for running KVM guests
Current active profile: virtual-host