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

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.92C4G(桌面)kvm01192.168.93.11Qemu-kvm、libvirt
CentOS 7.92C4G(桌面)kvm02192.168.93.12Qemu-kvm、libvirt、qemu-kvm-ev
CentOS 7.92C4G(mini)kvmnfs192.168.93.101nfs-utils
win 11192.168.93.200VNC 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 525 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 229 17:31 networks
-rw-r--r--  1 root root 3301 525 17:36 test01.xml
[root@kvm02 ~]# ls -l /data/store/
总用量 10487616
-rw------- 1 root root 10739318784 525 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 229 17:31 networks
-rw-------  1 root root 3524 525 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 525 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 525 19:15 full_scans
-rw-r--r-- 1 root root 4096 525 19:15 max_page_sharing
-rw-r--r-- 1 root root 4096 525 19:15 merge_across_nodes
-r--r--r-- 1 root root 4096 525 19:15 pages_shared
-r--r--r-- 1 root root 4096 525 19:15 pages_sharing
-rw-r--r-- 1 root root 4096 525 19:15 pages_to_scan
-r--r--r-- 1 root root 4096 525 19:15 pages_unshared
-r--r--r-- 1 root root 4096 525 19:15 pages_volatile
-rw-r--r-- 1 root root 4096 525 18:49 run
-rw-r--r-- 1 root root 4096 525 19:15 sleep_millisecs
-r--r--r-- 1 root root 4096 525 19:15 stable_node_chains
-rw-r--r-- 1 root root 4096 525 19:15 stable_node_chains_prune_millisecs
-r--r--r-- 1 root root 4096 525 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,说明节约了系统内存

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/644810.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue+iview tabs context-menu 弹出框怎么修改样式

今天遇到一个需求说页面顶部的菜单右键弹出框离得有点远 代码是这样 <Tabs type"card" closable class"main-tags-col-tabs" v-model"activeTab" on-click"handleClickTag" :before-remove"handleBeforeRemove" capt…

没有telnet情况下判断主机端口是否开放的方法

没有telnet情况下判断主机端口是否开放的方法 方式一 ssh -v 101.132.64.231 -p 80显示结果 如果有显示 debug1: Connection established. 就说明端口是开放的 端口未开放的情况是显示 方式二 echo >/dev/tcp/101.132.64.231/3306效果如下 如果没有任何输出&#xff0c;…

深入了解Nodejs模块机制

深入了解Nodejs模块机制 我们都知道Nodejs遵循的是CommonJS规范&#xff0c;当我们require(moduleA)时&#xff0c;模块是怎么通过名字或者路径获取到模块的呢&#xff1f;首先要聊一下模块引用、模块定义、模块标识三个概念。 1 CommonJS规范 1.1 模块引用 模块上下文提供…

009-Linux的管道和重定向

文章目录 前言 一、重定向 1.1、FD简介 1.2、FD举例 1.3、重定向简介 1.3.1、输出重定向 正确输出&#xff1a; 错误输出 案例1&#xff1a;正确输出重定向 案例2&#xff1a;错误输出重定向 ​编辑 案例3&#xff1a;正确和错误都输出重定向到相同位置 1.3.2、输…

Redis - 缓存场景

学习资料 学习的黑马程序员哔站项目黑马点评&#xff0c;用作记录和探究原理。 Redis缓存 缓存 &#xff1a;就是数据交换的缓冲区&#xff0c;是存储数据的临时地方&#xff0c;读写性能较高 缓存常见的场景: 数据库查询加速&#xff1a;通过将频繁查询的数据缓存起来&…

C从零开始实现贪吃蛇大作战

个人主页&#xff1a;星纭-CSDN博客 系列文章专栏 : C语言 踏上取经路&#xff0c;比抵达灵山更重要&#xff01;一起努力一起进步&#xff01; 有关Win32API的知识点在上一篇文章&#xff1a; 目录 一.地图 1.控制台基本介绍 2.宽字符 1.本地化 2.类项 3.setlocale函…

推荐10款优秀的组件库(一)

1.Ant Desgin UI 网址&#xff1a; https://ant-design-mobile.antgroup.com/zh Ant Design - 一套企业级 UI 设计语言和 React 组件库 "Ant Design Mobile"是一个在线的移动端Web体验平台&#xff0c;让你探索移动端Web的体验极限。 添加图片注释&#xff0c;不…

5月26(信息差)

&#x1f30d; 珠峰登顶“堵车”后冰架断裂 5人坠崖 2人没爬上来&#xff01; 珠峰登顶“堵车”后冰架断裂 5人坠崖 2人没爬上来&#xff01; &#x1f384; Windows 11 Beta 22635.3646 预览版发布&#xff1a;中国大陆地区新增“微软电脑管家”应用 ✨ 成都限购解除即将满…

5.23.12 计算机视觉的 Inception 架构

1. 介绍 分类性能的提升往往会转化为各种应用领域中显着的质量提升&#xff0c;深度卷积架构的架构改进可用于提高大多数其他计算机视觉任务的性能&#xff0c;这些任务越来越依赖于高质量的学习视觉特征。在 AlexNet 功能无法与手工设计、制作的解决方案竞争的情况下&#xf…

能找伴侣的相亲婚恋平台有哪些?6款值得信赖的恋爱交友软件体验测评

在这个超快节奏的社会里&#xff0c;好多人都忙着搞事业和搞钱&#xff0c;却把终身大事给忽略了。但是随着年龄越来越大&#xff0c;来自长辈和社会的压力也越来越大&#xff0c;因此网络上的相亲交友软件&#xff0c;就成了大多数单身贵族的脱单首选了。下面就来给大家讲讲我…

Day06:Flex 布局

目标&#xff1a;熟练使用 Flex 完成结构化布局 一、标准流 标准流也叫文档流&#xff0c;指的是标签在页面中默认的排布规则&#xff0c;例如&#xff1a;块元素独占一行&#xff0c;行内元素可以一行显示多个。 二、浮动 1、基本使用 作用&#xff1a;让块元素水平排列。 …

【C++题解】1698. 请输出带有特殊尾数的数

问题&#xff1a;1698. 请输出带有特殊尾数的数 类型&#xff1a; 题目描述&#xff1a; 请输出1∼n 中所有个位为 1、3、5、7中任意一个数的整数&#xff0c;每行 1 个。( n<1000 ) 比如&#xff0c;假设从键盘读入 20&#xff0c;输出结果如下&#xff1a; 1 3 5 7 11 1…

树莓派4B 有电但无法启动

试过多个SD卡&#xff0c;反复烧系统镜像都无法启动。接HDMI显示器没有信号输出&#xff0c;上电后PWR红灯长亮&#xff0c;ACT绿灯闪一下就不亮了&#xff0c;GPIO几个电源脚有电&#xff0c;芯片会发热&#xff0c;测量多个TP点电压好像都正常。 ……

N进制计数器【01】

N进制计数器 前面介绍过二进制计数器和十进制计数器&#xff0c;但是在很多时候需要到其他进制的计数器&#xff0c;我们把这些任意进制的计数器简称为 N 进制计数器 设计 N 进制计数器的方法有两种&#xff1a; 用时钟触发器和门电路设计&#xff08;前面常用的方法&#xf…

【Telemac】Telemac相关报错记录

文章目录 1.下载BlueKenue后缀为man解决办法2.运行Telemac项目提示Fortran报错解决办法1.下载BlueKenue后缀为man BlueKenue官方下载链接: 可以看到下载器请求时出现了问题,下载BlueKenue后缀为man. 解决办法 修改下载后的文件后缀为msi即可 2.运行Telemac项目提示Fortr…

Git时光机、Git标签、Git分支、GitHub协作

Git时光机&#xff08;切换版本&#xff09; 1.查看提交历史 HEAD指针指向这次分支的最后一次提交 版本信息一行显示【git log --prettyoneline】 2.引用日志【git reflog】 &#xff08;只在自己的工作区中存在&#xff09; 非常重要&#xff1a;当HEAD指针进行切换之后&…

el-switch自动触发更新事件

比如有这样一个列表&#xff0c;允许修改单条数据的状态。希望在更改el-switch状态时能够有个弹框做二次确认&#xff0c;没问题&#xff0c;el-switch已经帮我们想到了&#xff0c;所以它提供了beforeChange&#xff0c;根据beforeChange的结果来决定是否修改状态。一般确认修…

qt-C++笔记之使用QtConcurrent异步地执行槽函数中的内容,使其不阻塞主界面

qt-C笔记之使用QtConcurrent异步地执行槽函数中的内容&#xff0c;使其不阻塞主界面 code review! 文章目录 qt-C笔记之使用QtConcurrent异步地执行槽函数中的内容&#xff0c;使其不阻塞主界面1.QtConcurrent::run基本用法基本用法启动一个全局函数或静态成员函数使用 Lambda…

C++进阶之路:何为拷贝构造函数,深入理解浅拷贝与深拷贝(类与对象_中篇)

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

脚注:书籍的小秘密,躲藏在脚注间

脚注&#xff1a;书籍的小秘密&#xff0c;躲藏在脚注间 脚注是一种在文本中提供补充信息、引用出处或注解的方式&#xff0c;有助于读者更全面地理解文中内容&#xff0c;并为进一步研究提供参考和跳转点。 在一书本中&#xff0c;脚注是额外提供给读者的文字信息&#xff0…