KVM热迁移虚拟机+KSM内存页合并

KVM高级功能部署

文章目录

资源列表

操作系统 配置 主机名 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

基础环境

  • 关闭防火墙
shell 复制代码
systemctl stop firewalld
systemctl disable firewalld
  • 关闭内核安全机制
shell 复制代码
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虚拟机了
  • 提前创建想磁盘文件目录和镜像文件目录,并且把镜像文件提前移动到相对应目录下
shell 复制代码
[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虚拟机上进行如下配置
shell 复制代码
# 修改虚拟机的主机名
[root@localhost~]# hostnamectl set-hostname test01
# 添加ttyS0终端
[root@test01 ~]# grubby --update-kernel=ALL --args="console=ttyS0"
[root@test01 ~]# reboot
1.1.4、标记虚拟机test01当前IP地址
shell 复制代码
# 字符页面控制虚拟机
[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当前状态
shell 复制代码
[root@kvm01 ~]# virsh list --all
 Id    名称                         状态
----------------------------------------------------
 2     test01                         running
2.2.2、关闭虚拟机test01
shell 复制代码
[root@kvm01 ~]# virsh shutdown test01
域 test01 被关闭
[root@kvm01 ~]# virsh list --all
 Id    名称                         状态
----------------------------------------------------
 -     test01                         关闭
2.2.3、导出虚拟机test01的xml配置文件
shell 复制代码
[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的磁盘文件
shell 复制代码
[root@kvm01 ~]# virsh domblklist test01
目标     源
------------------------------------------------
hda        /data/store/test01.qcow2
hdb        -
2.2.5、拷贝配置文件和磁盘文件到目标宿主机kvm02上
shell 复制代码
[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、查看被迁移过来的配置文件和磁盘文件
shell 复制代码
[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
shell 复制代码
[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
shell 复制代码
[root@kvm02 ~]# virsh start test01
域 test01 已开始

[root@kvm02 ~]# virsh list --all
 Id    名称                         状态
----------------------------------------------------
 1     test01                         running
3.1.4、连接虚拟机验证IP地址信息
shell 复制代码
[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服务
shell 复制代码
[root@kvmnfs ~]# yum -y install nfs-utils rpcbind
2.1.2、配置共享目录
  • 在NFS服务的配置文件/etc/exports中,配置共享目录及相应权限。设置192.168.93.0/24网段对/data目录可读写、同步共享目录等权限
shell 复制代码
[root@kvmnfs ~]# mkdir /data
[root@kvmnfs ~]# vim /etc/exports
/data 192.168.93.0/24(rw,sync,no_root_squash)
2.1.3、启动并查看NFS服务
shell 复制代码
[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共享目录
shell 复制代码
[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目录
shell 复制代码
[root@kvm01 ~]# mkdir /data/kgc
3.3.3、源宿主机kvm01上挂载共享目录
shell 复制代码
[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上设置自动挂载
shell 复制代码
[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共享目录下
shell 复制代码
[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地址
shell 复制代码
[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两台宿主机上虚拟机的运行状态
shell 复制代码
# 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地址,用于迁移过程中观察是否存在网络中断情况
shell 复制代码
C:\Users\Lenovo>ping 192.168.93.140 -t
  • 下面开始执行迁移操作
shell 复制代码
[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、查看迁移过程是否中断
  • 可以看到,在迁移过程中,只造成了一点点的延迟,可以忽略不计
shell 复制代码
来自 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、查看迁移后虚拟机的状态
shell 复制代码
[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生成对应的配置文件,并重新定义
shell 复制代码
# 创建虚拟机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地址,验证迁移是否成功
shell 复制代码
[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、依赖包安装

shell 复制代码
# kvm01和kvm02都需要安装虚拟化程序
yum -y install centos-release-qemu-ev
yum -y install qemu-kvm-ev

3.2、迁移前准备工作

3.2.1、源宿主机kvm01上的准备
shell 复制代码
# 绑定主机映射关系
[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上的准备
shell 复制代码
[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两台宿主机拥有相同的资源池,若没有,则需要创建
shell 复制代码
# kvm01
[root@kvm01 ~]# virsh pool-list --all
 名称               状态     自动开始
-------------------------------------------
 default              活动     是       
 iso                  活动     是       
 kgc                  活动     是       
 store                活动     是   
 
# kvm02
[root@kvm02 ~]# virsh pool-list --all
 名称               状态     自动开始
-------------------------------------------
 default              活动     是       
 iso                  活动     是       
 kgc                  活动     是       
 store                活动     是

3.4、创建同名磁盘文件

shell 复制代码
# 创建的磁盘文件要确保与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、执行迁移操作

shell 复制代码
[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、验证迁移结果

shell 复制代码
# 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
shell 复制代码
# 结果为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"下
shell 复制代码
[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、克隆虚拟机
shell 复制代码
[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之前内存使用情况
shell 复制代码
# 确保虚拟机都启动好后,内存不再变化
[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的运行情况
shell 复制代码
[root@kvm02 ~]# systemctl start ksm
[root@kvm02 ~]# systemctl start ksmtuned.service
  • 当ksm服务启动后,需要检查/sys/kernel/mm/ksm/run文件的值是否为1,若为0则KSM功能不会生效,需要将其调整为1
shell 复制代码
[root@kvm02 ~]# echo "1" > /sys/kernel/mm/ksm/run
  • 在KSM服务启动之后,KSM能够最多共享系统物理能存的一半的内存页。而ksmtuned服务一直保持循环执行,以调用ksm服务来运行
4.2.4、对比KSM开启之后的内存使用情况
shell 复制代码
[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,说明节约了系统内存
相关推荐
不爱学习的YY酱17 小时前
【操作系统不挂科】<CPU调度(13)>选择题(带答案与解析)
java·linux·前端·算法·操作系统
钰爱&1 天前
【操作系统】Linux之网络编程(UDP)(头歌作业)
linux·操作系统
清酒伴风(面试准备中......)1 天前
操作系统基础——针对实习面试
笔记·面试·职场和发展·操作系统·实习
志凌海纳SmartX3 天前
概念解读|K8s/容器云/裸金属/云原生...这些都有什么区别?
云原生·容器·kubernetes·虚拟化
安全二次方security²5 天前
2024 RISC-V中国峰会 安全相关议题汇总
安全·虚拟化·risc-v·中国峰会·侧信道攻击·riscv optee·riscv hsm
架构师Wu老七5 天前
【软考】系统架构设计师-计算机系统基础(2):操作系统
系统架构·操作系统·软考·系统架构设计师
不爱学习的YY酱6 天前
【操作系统不挂科】<线程概念(6)>选择题&简答题(带答案与解析)
linux·开发语言·操作系统
修修修也9 天前
【Linux】进程间通信
linux·运维·服务器·操作系统·进程通信
Pandaconda11 天前
【操作系统】每日 3 题(十八)
linux·服务器·开发语言·数据结构·笔记·后端·操作系统
vincent_woo11 天前
再学安卓 - 系统环境安装
操作系统