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_64test01 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 1500inet 192.168.93.139  netmask 255.255.255.0  broadcast 192.168.93.255inet6 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 0TX 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 --allId    名称                         状态
----------------------------------------------------2     test01                         running
2.2.2、关闭虚拟机test01
[root@kvm01 ~]# virsh shutdown test01
域 test01 被关闭
[root@kvm01 ~]# virsh list --allId    名称                         状态
-----------------------------------------------------     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 --allId    名称                         状态
----------------------------------------------------
[root@kvm02 ~]# virsh define /etc/libvirt/qemu/test01.xml 
定义域 test01(从 /etc/libvirt/qemu/test01.xml)
[root@kvm02 ~]# virsh list --allId    名称                         状态
-----------------------------------------------------     test01                         关闭
3.1.3、启动虚拟机test01
[root@kvm02 ~]# virsh start test01
域 test01 已开始[root@kvm02 ~]# virsh list --allId    名称                         状态
----------------------------------------------------1     test01                         running
3.1.4、连接虚拟机验证IP地址信息
[root@kvm02 ~]# virsh console test01
连接到域 test01
换码符为 ^]		# 输入Enter键进入test01CentOS Linux 7 (Core)
Kernel 3.10.0-1160.71.1.el7.x86_64 on an x86_64test01 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 1500inet 192.168.93.139  netmask 255.255.255.0  broadcast 192.168.93.255inet6 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 0TX 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 --allId    名称                         状态
----------------------------------------------------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_64test02 login: root
密码:
Last login: Sat May 25 18:22:55 on tty1
[root@test02 ~]# ifconfig ens3
ens3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet 192.168.93.140  netmask 255.255.255.0  broadcast 192.168.93.255inet6 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 0TX 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 --allId    名称                         状态
----------------------------------------------------4     test02                         running-     test01                         关闭
# kvm02上无test02  
[root@kvm02 ~]# virsh list --allId    名称                         状态
----------------------------------------------------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 --allId    名称                         状态
-----------------------------------------------------     test01                         关闭-     test02                         关闭
[root@kvm02 ~]# virsh list --allId    名称                         状态
----------------------------------------------------1     test01                         running2     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键进入test02CentOS Linux 7 (Core)
Kernel 3.10.0-1160.71.1.el7.x86_64 on an x86_64test01 login: root
密码:
Last login: Sat May 25 17:24:47 on ttyS0
[root@test02 ~]# ifconfig ens3
ens3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet 192.168.93.140  netmask 255.255.255.0  broadcast 192.168.93.255inet6 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 0TX 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 --allId    名称                         状态
-----------------------------------------------------     test01                         关闭-     test02                         关闭
[root@kvm01 ~]# virsh start test01
域 test01 已开始
[root@kvm01 ~]# virsh list --allId    名称                         状态
----------------------------------------------------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 --allId    名称                         状态
----------------------------------------------------2     test02                         running-     test01                         关闭
[root@kvm02 ~]# virsh undefine test01
域 test01 已经被取消定义
[root@kvm02 ~]# rm -rf /data/store/test01.qcow2 
[root@kvm02 ~]# virsh list --allId    名称                         状态
----------------------------------------------------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 --allId    名称                         状态
-----------------------------------------------------     test02                         关闭# kvm02上test01处于开启状态
[root@kvm02 ~]# virsh list --allId    名称                         状态
----------------------------------------------------2     test02                         running3     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 -hmtotal        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 -hmtotal        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,说明节约了系统内存

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Gradle的settings.gradle.kts你真的理解吗?

你还在用.gradle文件吗&#xff1f;例如build.gradle、settings.gradle&#xff0c;那么你就out了。现在我们有必要了解一下kts脚本了。在Android项目中&#xff0c;默认有3个文件可以替换成kts脚本&#xff0c;即project的build.gradle、app模块的build.gradle和project的sett…

DDR5—新手入门学习(一)【1-5】

目录 1、DDR背景 &#xff08;1&#xff09;SDR SDRAM时代 &#xff1a; &#xff08;2&#xff09;DDR SDRAM的创新 &#xff1a; &#xff08;3&#xff09;DDR技术的演进 &#xff1a; &#xff08;4&#xff09;需求推动&#xff1a; 2、了解内存 &#xff08;1&…

go学习笔记-从圣经中抄录的接口值的思考

接口值 接口值&#xff0c;由两个部分组成&#xff0c;一个具体的类型和那个类型的值 下面4个语句中&#xff0c;变量w得到了3个不同的值。&#xff08; 开始和最后的值是相同的&#xff09; var w io.Writer w os.Stdout w new(bytes.Buffer) w nil var w io.Writer var…

Python中的数据类型与函数之美

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、Python中的数据类型初探 代码案例&#xff1a; 二、Python内置函数的魅力 代码案例&a…

我用 Midjourney 的这种风格治愈了强迫症

在 Midjourney 能够实现的各种布局之中&#xff0c;有两种风格因其简洁、有序而独居魅力&#xff0c;它们就是平铺 (Flat Lay) 和 Knolling (Knolling 就是 Knolling, 无法翻译&#x1f923;)。要在现实生活中实现这样的美学效果并不容易&#xff0c;你需要精心挑选各种小物件&…

Mac JDK和SDK环境变量配置

一、Java JDK配置 1.下载并安装Java jdk1.8及以上&#xff0c;这个可以在网上自行搜索下载&#xff0c;这里不在详细描述 2.如果不知道JAVA_HOME的安装路径&#xff0c;可以输入命令查看&#xff1a;/usr/libexec/java_home -V &#xff0c;如图 3.在终端输入命令&#xff1…

算法之堆排序

堆排序是一种基于比较的排序算法&#xff0c;通过构建二叉堆&#xff08;Binary Heap&#xff09;&#xff0c;可以利用堆的性质进行高效的排序。二叉堆是一个完全二叉树&#xff0c;可以有最大堆和最小堆两种形式。在最大堆中&#xff0c;父节点的值总是大于或等于其子节点的值…

UIKit之猜图器Demo

需求 实现猜图器Demo 功能分解&#xff1a; 1>下一题切换功能 2>点击图片后能放大并背景变暗&#xff08;本质是透明度的变化&#xff09;。再次点击则缩小&#xff0c;删除暗色背景。 3> 答案区按钮点击则文字消失&#xff0c;选择区对应文字恢复。 4> 选择区…

springboot项目,@Test写法 @Before @After

某文件示例 package cn.xxx.crm.boss;import cn.xxxx.crm.manager.mq.rabbit.AliyunCredentialsProvider; import com.rabbitmq.client.AMQP; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory; im…

第十九届全国环境友好科技竞赛(绿色创业类)正式启动

近日&#xff0c;第十九届全国环境友好科技竞赛&#xff08;绿色创业类&#xff09;正式拉开帷幕。本次竞赛由清华大学、同济大学、西安建筑科技大学及中国环境科学学会共同主办&#xff0c;旨在通过学科竞赛的方式鼓励全国高校学生积极参与到资源节约型和环境友好型的和谐社会…

探索python字典:遍历与访问的艺术

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、获取字典的键与值 1. 获取字典的键 2. 获取字典的值 二、遍历字典的键值对 1. 使用 …

【全开源】二手车置换平台系统小程序(FastAdmin+ThinkPHP+Uniapp)

二手车置换平台系统 特色功能&#xff1a; 车辆评估&#xff1a;系统提供车辆状况、性能和价值的评估功能&#xff0c;通过拍照、上传图片等方式自动识别车辆信息并给出估价建议&#xff0c;帮助买家和卖家更准确地了解车辆价值。 在线交易&#xff1a;平台提供在线购车、售车…

Idea中flume的Interceptor的编写教程

1.新建-项目-新建项目 注意位置是将来打包文件存放的位置&#xff0c;即我们打包好的文件在这/export/data个目录下寻找 2. 在maven项目中导入依赖 Pom.xml文件中写入 <dependencies> <dependency> <groupId>org.apache.flume</groupId> <artifa…

❤Element的使用element

❤Element的使用 1、input输入框 禁止自动补全和下拉提示 input 输入框在输入后浏览器会记录用户输入的值&#xff0c;在下次输入的时候会将记录的值提示在输入框的下面&#xff0c;当输入框是密码的时候&#xff0c;这样可以看见上次输入的密码&#xff0c;这样用户体验不好…

python使用jsonpath来查找key并赋值

目录 一、引言 二、JsonPath简介 三、Python中的JsonPath库 四、使用JsonPath查找JSON Key 五、使用JsonPath赋值JSON Key 六、高级用法 七、结论 一、引言 在数据驱动的现代应用中&#xff0c;JSON&#xff08;JavaScript Object Notation&#xff09;已成为一种广泛使…

基于大数据的支付风险智能防控技术规范

随着大数据、移动互联、人工智能、生物特征识别等技术的快速发展&#xff0c;支付方式正在发生着巨大而深刻的变革&#xff0c;新技术在丰富支付手段、提高支付效率的同时&#xff0c;带来了新的隐患&#xff0c;也对从业机构的风险防控能力提出了更高的要求。 传统的风控技术…

01-02.Vue的常用指令(二)

01-02.Vue的常用指令&#xff08;二&#xff09; 前言v-model&#xff1a;双向数据绑定v-model举例&#xff1a;实现简易计算器Vue中通过属性绑定为元素设置class 类样式引入方式一&#xff1a;数组写法二&#xff1a;在数组中使用三元表达式写法三&#xff1a;在数组中使用 对…

【全部更新完毕】2024电工杯B题详细思路代码成品文章教学:大学生平衡膳食食谱的优化设计及评价

大学生平衡膳食食谱的优化设计及评价 摘要 大学阶段是学生获取知识和身体发育的关键时期&#xff0c;也是形成良好饮食习惯的重要阶段。然而&#xff0c;当前大学生中存在饮食结构不合理和不良饮食习惯的问题&#xff0c;主要表现为不吃早餐或早餐吃得马虎&#xff0c;经常食用…

宝塔面板修改端口后无法登入

今天通过宝塔面板登录腾讯云主机&#xff0c;看到下面的提醒&#xff0c;顺便点进去随便改了个端口 本以为改端口是很简单事情&#xff0c;结果我改完之后面板立马登不上了&#xff0c;接下来我改了登录地址和端口也不行&#xff0c;我以为是防火墙的问题&#xff0c;增加了防火…