KVM高级功能部署
文章目录
- KVM高级功能部署
- 资源列表
- 基础环境
- 一、静态迁移
- 1.1.在源宿主机上准备虚拟机
- 1.1.1、调试VNC
- 1.1.2、创建虚拟机test01
- 1.1.3、console登录test01虚拟机
- 1.1.4、标记虚拟机test01当前IP地址
- 2.1、提取磁盘和配置文件
- 2.2.1、查看虚拟机test01当前状态
- 2.2.2、关闭虚拟机test01
- 2.2.3、导出虚拟机test01的xml配置文件
- 2.2.4、定位虚拟机test01的磁盘文件
- 2.2.5、拷贝配置文件和磁盘文件到目标宿主机kvm02上
- 3.1、配置和启动目标虚拟机
- 3.1.1、查看被迁移过来的配置文件和磁盘文件
- 3.1.2、重新定义虚拟机test01
- 3.1.3、启动虚拟机test01
- 3.1.4、连接虚拟机验证IP地址信息
- 二、基于共享存储的动态迁移
- 2.1、配置NFS共享存储
- 2.1.1、在kvmnfs服务器上安装NFS服务
- 2.1.2、配置共享目录
- 2.1.3、启动并查看NFS服务
- 3.1、挂载NFS目录
- 3.1.1、源宿主机kvm02上查看NFS共享目录
- 3.1.2、源宿主机kvm01上创建kgc目录
- 3.3.3、源宿主机kvm01上挂载共享目录
- 3.3.4、源宿主机kvm01上设置自动挂载
- 4.1、创建动态迁移的虚拟机
- 4.1.1、创建虚拟机test01
- 4.1.2、登录虚拟机test02并查看IP地址
- 5.1、动态迁移
- 5.1.1、查看kvm和kvm02两台宿主机上虚拟机的运行状态
- 5.1.2、在源宿主机kvm02上执行迁移命令
- 5.1.3、查看迁移过程是否中断
- 5.1.4、查看迁移后虚拟机的状态
- 5.1.5、生成配置文件
- 5.1.6、验证迁移结果
- 三、基于数据块的动态迁移
- 3.1、依赖包安装
- 3.2、迁移前准备工作
- 3.2.1、源宿主机kvm01上的准备
- 2.3.2、目标宿主机kvm02上的准备
- 3.3、检查资源池
- 3.4、创建同名磁盘文件
- 3.5、执行迁移操作
- 3.6、验证迁移结果
- 四、KSM内存也合并技术
- 4.1、KSM服务介绍
- 4.2、配置KSM优化内存
- 4.2.1、克隆虚拟机
- 4.2.2、记录开启KSM之前内存使用情况
- 4.2.3、启动KSM服务
- 4.2.4、对比KSM开启之后的内存使用情况
资源列表
操作系统 | 配置 | 主机名 | IP | 所需软件 |
---|---|---|---|---|
CentOS 7.9 | 2C4G(桌面) | kvm01 | 192.168.93.11 | Qemu-kvm、libvirt |
CentOS 7.9 | 2C4G(桌面) | kvm02 | 192.168.93.12 | Qemu-kvm、libvirt、qemu-kvm-ev |
CentOS 7.9 | 2C4G(mini) | kvmnfs | 192.168.93.101 | nfs-utils |
win 11 | 无 | 无 | 192.168.93.200 | VNC Viewer |
基础环境
- 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
- 关闭内核安全机制
setenforce 0
sed -i "s/^SELINUX=.*/SELINUX=disabled/g" /etc/selinux/config
- 修改主机名
hostnamectl set-hostname kvm01
hostnamectl set-hostname kvm02
hostnamectl set-hostname kvmnfs
一、静态迁移
- 使用源宿主机kvm01和目标宿主机kvm02来完成静态迁移。首先在源宿主机kvm01上创建虚拟机test01,虚拟机test01的数据放在本地磁盘。然后讲虚拟机test01从源宿主机kvm01迁移到目标宿主机kvm02上,并进行一些相应配置
1.1.在源宿主机上准备虚拟机
1.1.1、调试VNC
-
在源宿主机kvm01上进行迁移前的准备工作
-
创建虚拟机test01的方法可以参考之前章节使用virt-manager图形界面创建虚拟机,也可以在文本格式下使用virt-install命令来创建虚拟机。本次使用virt-install命令在源宿主机kvm01上面创建虚拟机test01。在执行virt-install命令之前,需要提前准备VNC Viewer软件,其主要作用是在本地Windows上来连接KVM虚拟机,方便管理
-
“VNC Server”和“Name”填写kvm01宿主机IP地址。其中“5901”是执行virt-install安装命令式分配对对应虚拟机的端口。可以自己定义,通常都是以5901开始递增
-
单击“OK”确认之后,会生成对用的连接
1.1.2、创建虚拟机test01
- 以上VNC的相关配置完成后,就可以通过文本方式创建test01虚拟机了
- 提前创建想磁盘文件目录和镜像文件目录,并且把镜像文件提前移动到相对应目录下
[root@kvm01 ~]# virt-install -n test01 -r 1024 --vcpus=1 --disk path=/data/store/test01.qcow2,size=10 -w bridge:br0 --virt-type=kvm --accelerate --autostart -c /data/iso/CentOS-7-x86_64-DVD-2207-02.iso --vnc --vncport=5901 --vnclisten=0.0.0.0
# virt-install安装命令各选项的具体作用如下所示
-n:指定虚拟机的名字
-r:执行内存大小
--vcpus:指定虚拟CPU个数
--disk:指定磁盘文件存放位置及大小
-w:指定所使用的网桥
--virt-type:指定虚拟化类型
--accelerate:启动KVM硬件加速
--autostart:当宿主机启动时,虚拟机也会自动启动
-c:指定安装虚拟机ISO文件路径
--vnc:启动VNC图形控制台
--vncport:通过vnc viewer连接的端口
--vnclisten:通过vnc viewer连接的IP
# 上述命令执行后忽略如下所示报错信息,立即打开windows上的VNC Viewer创建的连接“192.168.93.11:5901”,之所以会出现上述“WARNING”和“ERROR”信息,是因为宿主机的CentOS系统采用了文本方式安装,没有图形化界面。这种情况不影响虚拟机的正常使用,可使用VNC Viewer软件来开始CentOS系统的安装
###############################################################
WARNING 未检测到操作系统,虚拟机性能可能会受到影响。使用 --os-variant 选项指定操作系统以获得最佳性能。
WARNING 无法连接到图形控制台:没有安装 virt-viewer。请安装 'virt-viewer' 软件包。
WARNING 没有控制台用于启动客户机,默认为 --wait -1
开始安装......
正在分配 'test01.qcow2' | 10 GB 00:00
ERROR unsupported format character '奠(0xffffffe7) at index 47
域安装失败,您可以运行下列命令重启您的域:
'virsh start virsh --connect qemu:///system start test01'
否则请重新开始安装。
###############################################################
1.1.3、console登录test01虚拟机
- 如果在宿主机kvm01上想要实现通过virsh console命令连接到虚拟机test01,需要在test01虚拟机上进行如下配置
# 修改虚拟机的主机名
[root@localhost~]# hostnamectl set-hostname test01
# 添加ttyS0终端
[root@test01 ~]# grubby --update-kernel=ALL --args="console=ttyS0"
[root@test01 ~]# reboot
1.1.4、标记虚拟机test01当前IP地址
# 字符页面控制虚拟机
[root@kvm01 ~]# virsh console test01
连接到域 test01
换码符为 ^] # 输入Enter键
CentOS Linux 7 (Core)
Kernel 3.10.0-1160.71.1.el7.x86_64 on an x86_64
test01 login: root
密码:
Last login: Sat May 25 17:24:33 on tty1
[root@test01 ~]#
# 激活网卡,虚拟机网卡名称为ens3
[root@test01 ~]# ifup ens3
# 安装ifconfig查看IP工具
[root@test01 ~]# yum -y install net-tools
# 虚拟机开启dhcp,然后kvm自动获取ip
[root@test01 ~]# ifconfig ens3
ens3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.93.139 netmask 255.255.255.0 broadcast 192.168.93.255
inet6 fe80::71aa:3922:7687:344a prefixlen 64 scopeid 0x20<link>
ether 52:54:00:be:66:c8 txqueuelen 1000 (Ethernet)
RX packets 24555 bytes 36266971 (34.5 MiB)
RX errors 0 dropped 116 overruns 0 frame 0
TX packets 2871 bytes 159915 (156.1 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
###############################################################
从上述命令执行结果中可以得知,迁移前虚拟机test01的IP地址是192.168.93.139.若想从虚拟机test01中退出,额可以使用“Ctrl+]”
2.1、提取磁盘和配置文件
- 在宿主机kvm01上,将虚拟机test01的磁盘文件和xml配置文件上传到目标宿主机kvm02上
2.2.1、查看虚拟机test01当前状态
[root@kvm01 ~]# virsh list --all
Id 名称 状态
----------------------------------------------------
2 test01 running
2.2.2、关闭虚拟机test01
[root@kvm01 ~]# virsh shutdown test01
域 test01 被关闭
[root@kvm01 ~]# virsh list --all
Id 名称 状态
----------------------------------------------------
- test01 关闭
2.2.3、导出虚拟机test01的xml配置文件
[root@kvm01 ~]# virsh dumpxml test01 > ./test01.xml
[root@kvm01 ~]# ll test01.xml
-rw-r--r-- 1 root root 3301 5月 25 17:34 test01.xml
2.2.4、定位虚拟机test01的磁盘文件
[root@kvm01 ~]# virsh domblklist test01
目标 源
------------------------------------------------
hda /data/store/test01.qcow2
hdb -
2.2.5、拷贝配置文件和磁盘文件到目标宿主机kvm02上
[root@kvm01 ~]# scp test01.xml root@192.168.93.12:/etc/libvirt/qemu/
root@192.168.93.12's password:
test01.xml 100% 3301 5.3MB/s 00:00
# 目标宿主机kvm02需要提前创建/data/store磁盘文件目录
[root@kvm01 ~]# scp /data/store/test01.qcow2 root@192.168.93.12:/data/store/
root@192.168.93.12's password:
test01.qcow2 100% 10GB 158.2MB/s 01:04
3.1、配置和启动目标虚拟机
- 在目标宿主机kvm02上,对拷贝过来的虚拟机test01的数据进行重新定义,启动之后验证虚拟机test01的IP地址是否正确
3.1.1、查看被迁移过来的配置文件和磁盘文件
[root@kvm02 ~]# ls -l /etc/libvirt/qemu
总用量 4
drwx------. 3 root root 42 2月 29 17:31 networks
-rw-r--r-- 1 root root 3301 5月 25 17:36 test01.xml
[root@kvm02 ~]# ls -l /data/store/
总用量 10487616
-rw------- 1 root root 10739318784 5月 25 17:43 test01.qcow2
3.1.2、重新定义虚拟机test01
[root@kvm02 ~]# virsh list --all
Id 名称 状态
----------------------------------------------------
[root@kvm02 ~]# virsh define /etc/libvirt/qemu/test01.xml
定义域 test01(从 /etc/libvirt/qemu/test01.xml)
[root@kvm02 ~]# virsh list --all
Id 名称 状态
----------------------------------------------------
- test01 关闭
3.1.3、启动虚拟机test01
[root@kvm02 ~]# virsh start test01
域 test01 已开始
[root@kvm02 ~]# virsh list --all
Id 名称 状态
----------------------------------------------------
1 test01 running
3.1.4、连接虚拟机验证IP地址信息
[root@kvm02 ~]# virsh console test01
连接到域 test01
换码符为 ^] # 输入Enter键进入test01
CentOS Linux 7 (Core)
Kernel 3.10.0-1160.71.1.el7.x86_64 on an x86_64
test01 login: root
密码:
Last login: Sat May 25 17:24:47 on ttyS0
[root@test01 ~]# ifup ens3
连接已成功激活(D-Bus 活动路径:/org/freedesktop/NetworkManager/ActiveConnection/1)
[root@test01 ~]# ifconfig ens3
ens3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.93.139 netmask 255.255.255.0 broadcast 192.168.93.255
inet6 fe80::71aa:3922:7687:344a prefixlen 64 scopeid 0x20<link>
ether 52:54:00:be:66:c8 txqueuelen 1000 (Ethernet)
RX packets 21 bytes 1962 (1.9 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 21 bytes 1998 (1.9 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
二、基于共享存储的动态迁移
- 在kvmnfs服务器上部署NFS服务并创建共享目录实现共享存储。在源宿主机kvm01和目标宿主机kvm02上分别挂载共享目录。被迁移虚拟机的磁盘文件存储在共享目录内,最终实现虚拟机从源宿主机kvm01迁移到目标宿主机kvm02上
2.1、配置NFS共享存储
2.1.1、在kvmnfs服务器上安装NFS服务
[root@kvmnfs ~]# yum -y install nfs-utils rpcbind
2.1.2、配置共享目录
- 在NFS服务的配置文件/etc/exports中,配置共享目录及相应权限。设置192.168.93.0/24网段对/data目录可读写、同步共享目录等权限
[root@kvmnfs ~]# mkdir /data
[root@kvmnfs ~]# vim /etc/exports
/data 192.168.93.0/24(rw,sync,no_root_squash)
2.1.3、启动并查看NFS服务
[root@kvmnfs ~]# systemctl enable nfs
[root@kvmnfs ~]# systemctl enable rpcbind
[root@kvmnfs ~]# systemctl start rpcbind
[root@kvmnfs ~]# systemctl start nfs
[root@kvmnfs ~]# showmount -e localhost
Export list for localhost:
/data 192.168.93.0/24
3.1、挂载NFS目录
- 在kvm01和kvm02两台宿主机上,先创建本地数据目录,之后再分别挂载NFS目录,并设置开启自动挂载。下面以宿主机kvm01为例进行操作演示
3.1.1、源宿主机kvm02上查看NFS共享目录
[root@kvm01 ~]# showmount -e 192.168.93.101
Export list for 192.168.93.101:
/data 192.168.93.0/24
3.1.2、源宿主机kvm01上创建kgc目录
[root@kvm01 ~]# mkdir /data/kgc
3.3.3、源宿主机kvm01上挂载共享目录
[root@kvm01 ~]# mount -t nfs 192.168.93.101:/data /data/kgc/
[root@kvm01 ~]# df -hT | grep nfs
192.168.93.101:/data nfs4 50G 2.0G 49G 4% /data/kgc
3.3.4、源宿主机kvm01上设置自动挂载
[root@kvm01 ~]# echo "192.168.93.101:/data /data/kgc/ nfs defaults 0 0 " >> /etc/fstab
4.1、创建动态迁移的虚拟机
- 再源宿主机kmv01上,新建虚拟机test02,用于测试基于共享存储的动态迁移
4.1.1、创建虚拟机test01
- 参考静态迁移虚拟机的方法创建虚拟机test02,创建完后查看虚拟机test02当前状态。虚拟机test02的虚拟磁盘存放到/data/kgc共享目录下
[root@kvm01 ~]# virsh list --all
Id 名称 状态
----------------------------------------------------
4 test02 running
- test01 关闭
# 查看磁盘存放位置
[root@kvm01 ~]# virsh domblklist test02
目标 源
------------------------------------------------
hda /data/kgc/test02.qcow2
hdb -
4.1.2、登录虚拟机test02并查看IP地址
[root@kvm01 ~]# virsh console test02
连接到域 test02
换码符为 ^] # 输入Enter键
CentOS Linux 7 (Core)
Kernel 3.10.0-1160.71.1.el7.x86_64 on an x86_64
test02 login: root
密码:
Last login: Sat May 25 18:22:55 on tty1
[root@test02 ~]# ifconfig ens3
ens3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.93.140 netmask 255.255.255.0 broadcast 192.168.93.255
inet6 fe80::db48:e203:9cdc:d83 prefixlen 64 scopeid 0x20<link>
ether 52:54:00:83:ea:52 txqueuelen 1000 (Ethernet)
RX packets 24534 bytes 36282180 (34.6 MiB)
RX errors 0 dropped 146 overruns 0 frame 0
TX packets 3980 bytes 220461 (215.2 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
# 从上述命令执行结果可以得知,虚拟机test02的IP地址是192.168.93.140
5.1、动态迁移
5.1.1、查看kvm和kvm02两台宿主机上虚拟机的运行状态
# kvm01上test02运行状态
[root@kvm01 ~]# virsh list --all
Id 名称 状态
----------------------------------------------------
4 test02 running
- test01 关闭
# kvm02上无test02
[root@kvm02 ~]# virsh list --all
Id 名称 状态
----------------------------------------------------
1 test01 running
5.1.2、在源宿主机kvm02上执行迁移命令
- 在开始迁移操作之前,首先在本地windows机器上ping虚拟机test02的IP地址,用于迁移过程中观察是否存在网络中断情况
C:\Users\Lenovo>ping 192.168.93.140 -t
- 下面开始执行迁移操作
[root@kvm01 ~]# virsh migrate --live --verbose test02 qemu+ssh://192.168.93.12/system tcp://192.168.93.12 --unsafe
root@192.168.93.12's password:
迁移: [100 %]
5.1.3、查看迁移过程是否中断
- 可以看到,在迁移过程中,只造成了一点点的延迟,可以忽略不计
来自 192.168.93.140 的回复: 字节=32 时间<1ms TTL=64
来自 192.168.93.140 的回复: 字节=32 时间=2ms TTL=64
来自 192.168.93.140 的回复: 字节=32 时间<1ms TTL=64
5.1.4、查看迁移后虚拟机的状态
[root@kvm01 ~]# virsh list --all
Id 名称 状态
----------------------------------------------------
- test01 关闭
- test02 关闭
[root@kvm02 ~]# virsh list --all
Id 名称 状态
----------------------------------------------------
1 test01 running
2 test02 running
# 迁移之后源宿主机kvm01上虚拟机test02被关闭,目标宿主机kvm02上虚拟机test02处于启动状态
5.1.5、生成配置文件
- 目标主机没有kvm配置文件,如果关闭kvm,则不能正常启动
- 完成上述操作之后,基于共享存储迁移已经实现了虚拟机test02从源宿主机kvm01迁移到目标宿主机kvm02上,但是其配置文件没有一起迁移过来,此时还需要根据当前运行的虚拟机test02生成对应的配置文件,并重新定义
# 创建虚拟机test02配置文件
[root@kvm02 ~]# ls -l /etc/libvirt/qemu
总用量 4
drwx------. 3 root root 42 2月 29 17:31 networks
-rw------- 1 root root 3524 5月 25 17:48 test01.xml
[root@kvm02 ~]# virsh dumpxml test02 > /etc/libvirt/qemu/test02.xml
[root@kvm02 ~]# ll /etc/libvirt/qemu/test02.xml
-rw-r--r-- 1 root root 4278 5月 25 18:39 /etc/libvirt/qemu/test02.xml
# 定义虚拟机test02配置文件
[root@kvm02 ~]# virsh define /etc/libvirt/qemu/test02.xml
定义域 test02(从 /etc/libvirt/qemu/test02.xml)
5.1.6、验证迁移结果
- 查看虚拟机test02的IP地址,验证迁移是否成功
[root@kvm02 ~]# virsh console test02
连接到域 test02
换码符为 ^] # 输入Enter键进入test02
CentOS Linux 7 (Core)
Kernel 3.10.0-1160.71.1.el7.x86_64 on an x86_64
test01 login: root
密码:
Last login: Sat May 25 17:24:47 on ttyS0
[root@test02 ~]# ifconfig ens3
ens3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.93.140 netmask 255.255.255.0 broadcast 192.168.93.255
inet6 fe80::db48:e203:9cdc:d83 prefixlen 64 scopeid 0x20<link>
ether 52:54:00:83:ea:52 txqueuelen 1000 (Ethernet)
RX packets 25592 bytes 36343694 (34.6 MiB)
RX errors 0 dropped 146 overruns 0 frame 0
TX packets 4857 bytes 284873 (278.1 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
三、基于数据块的动态迁移
- 要实现基于数据块的动态迁移,首先要安装qemu-kvm-ev。并且在目标宿主机上提前生成同名的空白磁盘文件,最后再通过数据块进行动态迁移
3.1、依赖包安装
# kvm01和kvm02都需要安装虚拟化程序
yum -y install centos-release-qemu-ev
yum -y install qemu-kvm-ev
3.2、迁移前准备工作
3.2.1、源宿主机kvm01上的准备
# 绑定主机映射关系
[root@kvm01 ~]# cat >> /etc/hosts << EOF
> 192.168.93.11 kvm01
> 192.168.93.12 kvm02
> EOF
[root@kvm01 ~]# virsh list --all
Id 名称 状态
----------------------------------------------------
- test01 关闭
- test02 关闭
[root@kvm01 ~]# virsh start test01
域 test01 已开始
[root@kvm01 ~]# virsh list --all
Id 名称 状态
----------------------------------------------------
5 test01 running
- test02 关闭
2.3.2、目标宿主机kvm02上的准备
[root@kvm02 ~]# cat >> /etc/hosts << EOF
> 192.168.93.11 kvm01
> 192.168.93.12 kvm02
> EOF
[root@kvm02 ~]# virsh shutdown test01
[root@kvm02 ~]# virsh list --all
Id 名称 状态
----------------------------------------------------
2 test02 running
- test01 关闭
[root@kvm02 ~]# virsh undefine test01
域 test01 已经被取消定义
[root@kvm02 ~]# rm -rf /data/store/test01.qcow2
[root@kvm02 ~]# virsh list --all
Id 名称 状态
----------------------------------------------------
2 test02 running
3.3、检查资源池
- 确保kvm01和kvm02两台宿主机拥有相同的资源池,若没有,则需要创建
# kvm01
[root@kvm01 ~]# virsh pool-list --all
名称 状态 自动开始
-------------------------------------------
default 活动 是
iso 活动 是
kgc 活动 是
store 活动 是
# kvm02
[root@kvm02 ~]# virsh pool-list --all
名称 状态 自动开始
-------------------------------------------
default 活动 是
iso 活动 是
kgc 活动 是
store 活动 是
3.4、创建同名磁盘文件
# 创建的磁盘文件要确保与kvm01上需要迁移的虚拟机磁盘文件空间大小一致
[root@kvm02 ~]# qemu-img create -f qcow2 /data/store/test01.qcow2 10G
Formatting '/data/store/test01.qcow2', fmt=qcow2 size=10737418240 cluster_size=65536 lazy_refcounts=off refcount_bits=16
3.5、执行迁移操作
[root@kvm01 ~]# virsh migrate test01 qemu+ssh://192.168.93.12/system --live --persistent --undefinesource --copy-storage-all --verbose
root@192.168.93.12's password:
迁移: [100 %]
3.6、验证迁移结果
# kvm01test01已经被迁移走
[root@kvm01 ~]# virsh list --all
Id 名称 状态
----------------------------------------------------
- test02 关闭
# kvm02上test01处于开启状态
[root@kvm02 ~]# virsh list --all
Id 名称 状态
----------------------------------------------------
2 test02 running
3 test01 running
四、KSM内存也合并技术
- 当前主流的操作系统大多数都支持KSM,因为KSM可以合并相同的内存页,减少虚拟内存的使用量,这样有利于提高CPU的工作效率,加快数据缓存效率,同时可以节省更多的内存空间来缓存额外的磁盘数据。
- KSM适用于宿主机过载的情况下。KSM通过减少每个虚拟机实际占用的内存数,可以让多个虚拟机分配的内存数量之和大于物理内存数量。而对于相同类型的虚拟机,在物理内存不变的情况下,可以在一个宿主机中创建更多虚拟机,从而提高虚拟化部署的密度,同时也可以提高物理资源的利用效率
4.1、KSM服务介绍
- KSM是在Linux 2.6内核版本中被添加进去的,目前多数常用的、主流的Linux’发行版都默认支持KSM技术,执行以下命令可以查看当前Linux系统是否支持KSM
# 结果为y则表示支持KSM技术
[root@kvm01 ~]# egrep -i ksm /boot/config-3.10.0-1160.71.1.el7.x86_64
CONFIG_KSM=y
- KSM服务在CentOS 7内是以ksmd作为守护进程的,针对该服务的一些配置文件,都在目录“/sys/kernel/mm/ksm”下
[root@kvm02 ~]# ls -l /sys/kernel/mm/ksm/
总用量 0
-r--r--r-- 1 root root 4096 5月 25 19:15 full_scans
-rw-r--r-- 1 root root 4096 5月 25 19:15 max_page_sharing
-rw-r--r-- 1 root root 4096 5月 25 19:15 merge_across_nodes
-r--r--r-- 1 root root 4096 5月 25 19:15 pages_shared
-r--r--r-- 1 root root 4096 5月 25 19:15 pages_sharing
-rw-r--r-- 1 root root 4096 5月 25 19:15 pages_to_scan
-r--r--r-- 1 root root 4096 5月 25 19:15 pages_unshared
-r--r--r-- 1 root root 4096 5月 25 19:15 pages_volatile
-rw-r--r-- 1 root root 4096 5月 25 18:49 run
-rw-r--r-- 1 root root 4096 5月 25 19:15 sleep_millisecs
-r--r--r-- 1 root root 4096 5月 25 19:15 stable_node_chains
-rw-r--r-- 1 root root 4096 5月 25 19:15 stable_node_chains_prune_millisecs
-r--r--r-- 1 root root 4096 5月 25 19:15 stable_node_dups
# KSM的常用配置的作用分别如下所示
max_page_sharing:设置每个KSM页面允许的最大共享数量。这个配置设置了重复数据删除限制,以避免虚拟内存rmap列表变得太大。max_page_sharing最小值为2因为新创建的KSM页面至少需要两个共享器
merge_across_nodes:指定是否可以合并来自不同numa节点的页面。当设置为0时,ksm只合并物理页面并驻留在同一unma节点的内存区域中,可以降低访问共享页面的延迟
pages_to_scan:在KSM进程休眠之前会去扫描的内存数量
run:控制ksmd进程是否运行,默认值为0.要激活ksm必须设置其值为1。如果设置为0,表示停止运行ksmd,但会保留已经合并的内存页;如果设置为1,表示马上运行ksmd进程;设置为2表示停止运行ksmd,并分离已经合并的所有内存页,但是保留已经注册为合并的内存区域给下一次使用
sleep_millisecs:设置ksmd进程休眠的时间(单位:毫秒),即为ksmd进程两次运行之前的间隔
stable_node_chains_prune_millisecs:在 stable_node“链”中链接的整个stable_node“dups”列表被周期性地扫描,以删除陈旧的stable_nodes。该参数的值用于调节重复扫描的时间(单位:毫秒)
4.2、配置KSM优化内存
- 在目标宿主机kvm02上,有test01和test02两台虚拟机。现在通过克隆的方式再创建两台新的虚拟机。然后开启这四台虚拟机,等四台虚拟机都启动后,观察内存使用的情况。等内存使用量不再变化后,启动KSM服务,过5分钟,观察内存使用量的变化情况
4.2.1、克隆虚拟机
[root@kvm02 ~]# virsh shutdown test02
[root@kvm02 ~]# virt-clone -o test02 -n test03 -f /data/store/test03.qcow2
[root@kvm02 ~]# virt-clone -o test02 -n test04 -f /data/store/test04.qcow2
4.2.2、记录开启KSM之前内存使用情况
# 确保虚拟机都启动好后,内存不再变化
[root@kvm02 ~]# free -hm
total used free shared buff/cache available
Mem: 3.7G 2.1 125M 50M 1.5G 1.4G
Swap: 3.9G 94M 3.8G
4.2.3、启动KSM服务
- 通过ksm和ksmtuned两个服务来动态调节KSM的运行情况
[root@kvm02 ~]# systemctl start ksm
[root@kvm02 ~]# systemctl start ksmtuned.service
- 当ksm服务启动后,需要检查/sys/kernel/mm/ksm/run文件的值是否为1,若为0则KSM功能不会生效,需要将其调整为1
[root@kvm02 ~]# echo "1" > /sys/kernel/mm/ksm/run
- 在KSM服务启动之后,KSM能够最多共享系统物理能存的一半的内存页。而ksmtuned服务一直保持循环执行,以调用ksm服务来运行
4.2.4、对比KSM开启之后的内存使用情况
[root@kvm02 ~]# free -hm
total used free shared buff/cache available
Mem: 3.7G 1.6G 228M 50M 1.5G 1.5G
Swap: 3.9G 94M 3.8G
# 对比KSM开启前后内存的使用情况,“used”从开始的2.1G讲到了1.6G,说明节约了系统内存