开发者
资源
鲲鹏降内存配置高性价比参考实践

鲲鹏降内存配置高性价比参考实践

鲲鹏处理器弹性内存虚拟机计算商业SMECE

发表于 2026/06/26

0

1 非商用声明

该文档提供的内容为参考实践,仅供用户参考使用,用户可参考实践文档构建自己的软件,按需进行安全、可靠性加固,但不建议直接将相关Demo或镜像文件集成到商用产品中。

2 方案介绍

2.1 背景介绍

在数字化转型背景下,随着企业虚拟化应用的普及和数据量的持续增长,内存资源管理面临新的挑战。其中,冷热数据的区分尤为关键:热数据是指访问频率高、对响应时间要求严格的数据,而冷数据则是长时间不被访问或访问频率极低的数据。

在虚拟化环境中,由于缺乏智能的数据分层管理机制,大量冷数据往往长期占用内存却无法自动释放。这主要是因为传统内存管理方式难以动态识别数据访问模式,无法将低频访问的冷数据迁移至低成本存储介质。

据统计,在典型的虚拟化场景中,内存中的冷数据占比可达50%甚至更高。这种情况导致昂贵的内存资源被大量闲置数据占用,造成资源配置成本高企、整体资源利用率低下,尤其对成本敏感的中小企业形成了显著的IT成本压力。

因此,亟需一种创新的内存优化解决方案,能够智能识别并管理冷热数据,将不常访问的冷数据从昂贵的内存迁移至低成本存储介质,从而在保障业务性能的同时,显著降低内存资源配置需求与总体拥有成本。

2.2 方案简介

针对虚拟化场景中内存冷热数据分布不均的问题,本方案旨在利用memlink模块识别冷热数据,并使用ZRAM模块对虚拟机冷页内存进行压缩存储,并结合KAE硬件加速技术提升压缩效率,同时解决大页内存不支持swap的问题,实现内存资源的高效利用,从而在有限物理内存下部署更多虚拟机。

方案涉及组件及基本功能介绍如下表:

表1 弹性内存组件基本功能介绍

组件名称功能配套下载路径
ZRAM组件利用内存作为交换区,将swap组件回收的冷页内存进行压缩存储以节省物理内存。

https://gitcode.com/boostkit/cloud-virtual



大页内存管理工具实现用户态大页内存冷热分级与主动swap回收。
memlinkmemlink sdk为大页内存管理工具提供接口调用,

   memlinkd 提供底层能力服务,用于识别虚拟机冷热页内存以及判断内存压力情况。
https://gitcode.com/openeuler/memlinkd
KAE硬加速组件为ZRAM压缩/解压缩操作提供硬件级加速,提升压缩效率,降低CPU占用率。https://gitcode.com/boostkit/KAE


整体架构见下图:


2.3 约束

1. 本方案当前版本适用于虚拟化场景,物理机场景后续版本支持。

2. 本方案要求虚拟化采用2MB大页内存配置。


3 使用指导

3.1 环境要求

表1 软件信息

类别软件版本
OSOpenEuler 24.03 LTS-SP3
Libvirt9.10.0(yum源)
QEMU8.2.0(yum源)
Redis6.2.0
Nginx1.24.0
wrk4.1.0


表2 硬件信息

类别硬件描述
CPU鲲鹏7270z
内存256GB
硬盘3*3.5TB NVMe硬盘


3.2 部署与配置流程

部署流程图如下:

配置流程图如下:

3.2.1 编译安装内核

3.2.1.1 配置编译环境

步骤1    安装编译依赖

yum -y install \
    rpm-build openssl-devel bc rsync gcc gcc-c++ flex bison m4 git \
    glib2-devel spice-protocol zlib-devel libffi-devel libgcrypt-devel \
    libnfs-devel libiscsi-devel libseccomp-devel libaio-devel \
    libcap-ng-devel librados2-devel librbd1-devel libfdt-devel \
    libpng-devel spice-server-devel numactl-devel dwarves \
    elfutils-libelf-devel ncurses-devel cmake make liburing-devel \
    ninja-build autoconf automake libtool patch libvirt-devel

            ----结束


3.2.1.2 获取内核源码与patch

步骤1    获取内核源码

cd /home
git clone https://gitcode.com/openeuler/kernel.git
cd kernel
git checkout 43da05a574398f23d7d5d1e9126689697c022775

步骤2    获取ZRAM支持KAEpatch

cd /home
git clone https://gitcode.com/boostkit/cloud-virtual.git

步骤3    用ZRAM支持KAEpatch。

cd /home/kernel
git apply /home/cloud-virtual/kernel/kernel-6.6.0/hugepage-reclaim/[zram]0001-zram-switch-to-async-acomp-and-mutex.patch
git apply /home/cloud-virtual/kernel/kernel-6.6.0/hugepage-reclaim/[hugepage-reclaim]0001-mm-hugetlb-preparatory-cleanups-for-HugeTLB-swap-sup.patch
git apply /home/cloud-virtual/kernel/kernel-6.6.0/hugepage-reclaim/[hugepage-reclaim]0002-mm-hugetlb-add-HugeTLB-anonymous-page-swap-support.patch
git apply /home/cloud-virtual/kernel/kernel-6.6.0/hugepage-reclaim/[hugepage-reclaim]0003-fs-hugetlbfs-add-file-backed-HugeTLB-page-swap-and-s.patch
git apply /home/cloud-virtual/kernel/kernel-6.6.0/hugepage-reclaim/[hugepage-reclaim]0004-mm-hugetlb-add-fault-time-reclaim-inactive-list-and-.patch

           ----结束              


3.2.1.3 编译并安装内核

步骤1    准备编译config。

cd /home/kernel 
cp /boot/config-6.6.0-132.0.0.111.oe2403sp3.aarch64 .config 
vim .config # 删除TRUSTED_KEYS CONFIG_SYSTEM_TRUSTED_KEYS=""

步骤2    生成编译配置

make menuconfig

待该窗口弹出后EXIT保存退出即可。

步骤3    编译内核,打包RPM包。

make rpm-pkg -j $(nproc)

步骤4    安装新内核(rpm包的路径以实际为准)。

rpm -ivh /root/rpmbuild/RPMS/aarch64/kernel-6.6.0+-1.aarch64.rpm --force 
rpm -ivh /root/rpmbuild/RPMS/aarch64/kernel-devel-6.6.0+-1.aarch64.rpm --force

步骤5    重启物理机,更换新内核,使配置生效。

reboot

重启后选择新内核。

           ----结束


3.2.2 安装相关组件及工具

组件以及工具介绍见2.2方案简介的表1弹性内存组件基本功能介绍。

3.2.2.1 编译安装KAE

步骤1    获取KAE源码。

cd /home
git clone https://gitcode.com/boostkit/KAE.git -b kae2

步骤2    编译安装KAE。

cd KAE
sh build.sh all

步骤3    检查KAE安装是否成功。

ll /sys/class/uacce/

执行指令后如果如下图显示对应的加速器hisi_hpre, hisi_sec, hisi_zip则安装成功。

           ----结束        

注意:有时候如果uacce框架已经安装运行过的话再执行编译安装KAE的脚本可能会报错,需要先执行sh build.sh cleanup清理旧的之后再执行sh build.sh all。

3.2.2.2 获取memlink工具

步骤1    获取memlink源码。

cd /home
git clone https://gitcode.com/openeuler/memlinkd.git

步骤2    编译源码。

cd memlinkd
yum-builddep memlinkd.spec
tar jcvf memlinkd.tar.bz2 --exclude=.git src
mkdir -p /root/rpmbuild/SOURCES/
cp memlinkd.tar.bz2 /root/rpmbuild/SOURCES/
rpmbuild -ba memlinkd.spec

步骤3    安装memlink SDK。

cd /root/rpmbuild/RPMS/aarch64/
rpm -ivh memlinkd-* 

           ----结束      


3.2.2.3 获取大页内存管理工具

步骤1    获取reclaim源码。

cd /home
git clone https://gitcode.com/boostkit/cloud-virtual.git

步骤2    编译源码。

cd cloud-virtual/tools/
gcc *reclaim.c -o reclaim  $(pkg-config --cflags --libs glib-2.0) -lvirt -lnuma -lmemlink_sdk -lboundscheck 

           ----结束      


3.2.3 特性配置使能

3.2.3.1 配置大页内存及虚拟机

步骤1    预分配大页内存数量。

编辑 /etc/grub2-efi.cfg 文件,添加大页内存参数,大页数量根据实际环境调整。

添加至linux所在行的"root=" 命令行末尾,如下图所示,大页数量一般取决于要启动的虚拟机总内存大小,建议设置为虚拟机总内存的80%。

以虚拟机所需总内存200GB为例,建议大页总内存为200*0.8=160GB, 大页数量为160*1024/2=81920个大页。

"default_hugepagesz=2M hugepagesz=2M hugepages=81920 hugetlb_swap=on"

重启物理机。

reboot

步骤2    动态配置大页内存数量(可选)。

步骤1 预分配大页内存会按照NUMA数量将设置好的大页内存平均分配到每一个NUMA上,用户可以按需动态调整每个NUMA节点的大页数量

(最大不超过总内存/NUMA数量),并且将虚拟机绑定在对应的NUMA以获取更好的性能。


以下示例为 将10000的大页内存分配到NUMA0上。

echo 10000 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages 

步骤3    配置虚拟机。

标签名



             说明
hugepages添加大页内存支持。
hugepage-ondemand开启大页pod选项,支持大页动态分配,无此配置默认关闭。
cputune对虚拟机进行绑核。
numatune对虚拟机进行绑内存。

编辑虚拟机XML配置文件,添加大页内存支持,开启大页pod选项,启用大页动态分配,并对虚拟机进行绑核/绑内存(核心与内存绑定需要根据实际情况配置):

<metadata>  <reclaim xmlns="http://reclaim.io"/></metadata>
<memoryBacking>
  <hugepages>
    <page size='2048' unit='KiB'/>
  </hugepages>
  <allocation mode='hugepage-ondemand'/>
</memoryBacking>
<cputune>
  <vcpupin vcpu='0' cpuset='10'/>
  <vcpupin vcpu='1' cpuset='11'/>
  <emulatorpin cpuset='10-11'/>
</cputune>
<numatune>
  <memnode cellid='0' mode='strict' nodeset='0'/>
</numatune>
<cpu mode="host-passthrough" check="none">
  <numa>
    <cell id='0' cpus='0-1' memory='8388608' unit='KiB' memAccess='shared'/>
  </numa>
</cpu>

编辑虚拟机XML配置文件,配置虚拟机内存回收策略标签。所有虚拟机都需要配置此标签,通过标签内容区分是否允许回收。

注意:回收标签为自定义元数据标签,若使用文档提供的大页内存管理工具,则将以下内容添加到虚拟机xml配置标签之前即可,若使用自行实现的大页内存管理工具,则填写自定义的标签配合大页内存管理工具使用。

允许内存回收(推荐配置):
<metadata>  <reclaim xmlns="http://reclaim.io"/></metadata>
禁止内存回收:
<metadata>  <no_reclaim xmlns="http://reclaim.io"/></metadata>

           ----结束      

3.2.3.2 启用KAE加速

步骤1    加载KAE内核模块。

rmmod hisi_zip
rmmod hisi_sec2
rmmod hisi_hpre
rmmod hisi_qm
rmmod uacce
modprobe hisi_zip uacce_mode=2 perf_mode=1 pf_q_num=256

步骤2    验证KAE加速是否生效。

执行以下命令,观察KAE队列是否存在,队列数是否与配置的队列数一致:

watch -n 1 "cat /sys/class/uacce/hisi_zip-*/available_instances"

           ----结束      


3.2.3.3 配置ZRAM与swap接口

步骤1     加载内核模块。

modprobe etmem_swap
modprobe zram

步骤2    配置zram块设备。

注意:zram块设备大小根据实际大页内存大小配置,建议配置为大页内存的50%。

echo deflate > /sys/block/zram0/comp_algorithm
echo 80G > /sys/block/zram0/disksize
mkswap /dev/zram0
swapon -p 100 /dev/zram0

步骤3    配置完成后检查KAE队列数量是否发生变化,若队列数量对比配置前减少,说明KAE加速已生效。

watch -n 1 "cat /sys/class/uacce/hisi_zip-*/available_instances"

 

         ----结束      


3.2.3.4 启用内存管理工具

步骤1    修改memlink配置,修改部分配置项如下:

vim /etc/memlinkd.conf
# 找到文件对应的这两行,将对应的值进行修改
page_score_enable=1 
page_score_poll_cycle_sec=5

步骤2    启动memlink工具。

modprobe etmem_scan
systemctl start memlinkd

步骤3    启动大页内存管理工具。

cd /home/cloud-virtual/tools/
./reclaim

           ----结束    

注意:该大页内存管理工具仅作为功能演示工具,提供大页内存冷热分级与主动swap回收功能的使用方法以及基本的内存管理策略,不建议直接在生产环境中使用,用户可以参考该工具,结合实际使用场景进行定制化配置。  


3.3 测试示例

3.3.1 测试准备

步骤1    物理机安装虚拟化相关组件。

yum install -y libvirt qemu edk2-aarch64

步骤2     物理机安装redis软件包用于执行redis-benchmark测试指令。

yum install -y redis

步骤3    虚拟机安装redis软件包。

yum install -y redis

           ----结束    


3.3.2 redis单虚拟机测试

由于单虚拟机冷数据较少,仅能从自身虚拟机进行内存回收,因此性能影响较大,该场景主要测试内存超分状态下,虚拟机仍正常运行无崩溃,不保证虚拟机性能。

该用例分配6GB的大页内存,启动一个2U8G的虚拟机运行redis,模拟 1000 个并发客户端,向 Redis 中写入 500 万个 1KB 大小的随机键值对进行测试。

步骤1    分配6GB大页内存到numa0, 对应为6*1024/2=3072大页。

echo 3072 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages

步骤2    配置并启动虚拟机。

vim vm-redis-single.xml
virsh define vm-redis-single.xml
virsh start vm-redis-single

虚拟机参考的配置如下:


配置的时候按需修改对应的CPU核心数量,内存,NUMA绑核,CPU绑核以及虚拟机使用的固件及qcow2路径,qcow2可以通过这个路径获取:qcow2获取路径,初始化登录账号为root, 密码为openEuler12#$。

以下示例为使用qcow2的方式直接启动虚拟机,也可以按需使用iso镜像的方式安装操作系统的方式启动虚拟机。

<domain type='kvm'>
  <name>vm-redis-single</name>
  <uuid>8696150c-8498-4025-b111-578626c13576</uuid>
  <memory unit='KiB'>8388608</memory>
  <currentMemory unit='KiB'>8388608</currentMemory>
  <vcpu placement='static'>2</vcpu>
  <metadata>  <reclaim xmlns="http://reclaim.io"/></metadata>
  <!-- 1. 内存后端:强制使用 2MB 大页 -->
  <memoryBacking>
    <hugepages>
      <!-- 这里的 size 必须对应宿主机 /proc/meminfo 中的 Hugepagesize (通常是 2048 kB) -->
      <page size='2048' unit='KiB'/>

    </hugepages>
    <allocation mode='immediate'/>
  </memoryBacking>
  <!-- 2. NUMA 绑定:严格限制在 Node 0 -->
  <numatune>
    <memnode cellid='0' mode='strict' nodeset='0'/>
  </numatune>
  <!-- 3. CPU 模式与拓扑 -->
  <cpu mode='host-passthrough' check='none'>
    <numa>
      <!-- 这里定义虚拟机的 NUMA 拓扑 -->
      <!-- 因为 vCPU 只有 2 个,全部放在 Cell 0 是合理的 -->
      <cell id='0' cpus='0-1' memory='8388608' unit='KiB' memAccess='shared'/>
    </numa>
  </cpu>
  <!-- 4. CPU 物理核绑定 -->
  <cputune>
    <!-- 要绑定对应的CPU,每个虚拟机绑定的CPU要错开 -->
    <vcpupin vcpu='0' cpuset='10'/>
    <vcpupin vcpu='1' cpuset='11'/>
    <emulatorpin cpuset='10-11'/>
  </cputune>
  <!-- 5. 操作系统引导配置 (关键修复部分) -->
  <os>
    <type arch='aarch64' machine='virt'>hvm</type>
    <!-- 指定 EFI 固件路径 (Loader) -->
    <loader readonly='yes' type='pflash'>/usr/share/edk2/aarch64/QEMU_EFI-pflash.raw</loader>
    <!-- 指定 NVRAM 存储 -->
    <nvram>/var/lib/libvirt/qemu/nvram/vm-redis-baseline-single_VARS.fd</nvram>
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
    <gic version='3'/>
  </features>
  <clock offset='utc'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>restart</on_crash>
  <devices>
    <emulator>/usr/libexec/qemu-kvm</emulator>
    <!-- 磁盘配置 -->
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2' cache='none' io='native' discard='unmap'/>
      <!-- 每个虚拟机绑定的qcow2要分开,不能使用同一个 -->
      <source file='/home/openEuler-24.03-LTS-SP3-aarch64.qcow2'/>
      <target dev='vda' bus='virtio'/>
    </disk>
    <!-- 网络配置:桥接模式 -->
    <interface type='bridge'>
      <source bridge='br0'/>
      <model type='virtio'/>
      <!-- 建议添加 mac 地址以避免冲突,如果没有可以删除下面这行 -->
      <!-- <mac address='52:54:00:12:34:56'/> -->
    </interface>
       <serial type='pty'>
      <target type='system-serial' port='0'/>
    </serial>
    <console type='pty'>
      <target type='serial' port='0'/>
    </console>
  </devices>
</domain>

步骤3    为虚拟机配置对应的ip。

步骤4    虚拟机安装redis软件包。

yum install -y redis

步骤5    在虚拟机中进行redis绑核,网络绑中断后启动redis。

#进入虚拟机并在虚拟机执行
cat /proc/interrupts | grep virtio # 查看后该虚拟机virtio的中断在60,61
echo > 0 /proc/irq/60/smp_affinity_list # 将中断号为60的中断绑定到cpu 0上
echo > 0 /proc/irq/61/smp_affinity_list # 将中断号为61的中断绑定到cpu 0上
taskset -c 1 redis-server /etc/redis.conf #将redis应用绑定到cpu 1上,与中断绑定的cpu错开

步骤6    启动大页内存管理工具。

cd /home/cloud-virtual/tools/
./reclaim

步骤7    在宿主机执行对于虚拟机的redis-benchmark测试。

redis-benchmark -h 192.168.25.100 -p 6379 -t set -c 1000 -r 5000000 -n 5000000 -d 1024

步骤8    观察虚拟机内存以及运行状态,当前配置8G虚拟机,只给6G内存的超分场景,在大压力测试下运行正常。

           ----结束    


3.3.3 redis多虚拟机测试

该场景验证多虚拟机内存超分情况下,对于多台虚拟机进行redis-benchmark测试,测试结果对比未超分状态下性能损耗<15%。

该用例使用3个2U8G的虚拟机,分别测试超分状态与未超分状态时redis的性能结果并进行比对:



未超分状态下,分配24GB的大页内存,启动3个2U8G的虚拟机运行redis,其中1个虚拟机空闲,另外两个虚拟机同时模拟 1000 个并发客户端,向 Redis 中写入 500 万个1KB 大小的随机键值对进行测试。

超分状态下,分配18GB的大页内存,启动3个2U8G的虚拟机运行redis,其中1个虚拟机空闲,另外两个虚拟机同时模拟 1000 个并发客户端,向 Redis 中写入 500 万个1KB 大小的随机键值对进行测试。

测试未超分状态下的性能结果(基线性能数据)

步骤1    分配24GB大页内存到numa0, 对应为24*1024/2=12288个大页。

echo 12288 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages

步骤2    配置并启动虚拟机。

vim vm-redis-multiple1.xml
vim vm-redis-multiple2.xml
vim vm-redis-multiple3.xml
virsh define vm-redis-multiple1.xml
virsh define vm-redis-multiple2.xml
virsh define vm-redis-multiple3.xml
virsh start vm-redis-multiple1
virsh start vm-redis-multiple2
virsh start vm-redis-multiple3

虚拟机配置参考3.3.2 redis单虚拟机测试的虚拟机配置部分, 其中大页的allocationmode标签使用immediate。

<metadata>  <reclaim xmlns="http://reclaim.io"/></metadata>
<memoryBacking>
    <hugepages>
      <!-- 这里的 size 必须对应宿主机 /proc/meminfo 中的 Hugepagesize (通常是 2048 kB) -->
      <page size='2048' unit='KiB'/>
    </hugepages>
    <allocation mode='immediate'/>
  </memoryBacking>

步骤3     为虚拟机配置对应的ip。

步骤4    虚拟机安装redis软件包。

yum install -y redis

步骤5   在虚拟机中进行redis绑核,网络绑中断后启动redis。

#进入虚拟机并在虚拟机执行
cat /proc/interrupts | grep virtio # 查看后该虚拟机virtio的中断在60,61
echo > 0 /proc/irq/60/smp_affinity_list # 将中断号为60的中断绑定到cpu 0上
echo > 0 /proc/irq/61/smp_affinity_list # 将中断号为61的中断绑定到cpu 0上
taskset -c 1 redis-server /etc/redis.conf #将redis应用绑定到cpu 1上,与中断绑定的cpu错开

步骤6    在宿主机执行对于2个虚拟机的redis-benchmark测试。

redis-benchmark -h 192.168.25.100 -p 6379 -t set -c 1000 -r 5000000 -n 5000000 -d 1024
redis-benchmark -h 192.168.25.102 -p 6379 -t set -c 1000 -r 5000000 -n 5000000 -d 1024

           ----结束    


测试超分状态下的性能结果

步骤1    按照3.2部署与配置流程章节完成特性的配置使能。

步骤2    分配18GB大页内存到numa0, 对应为18*1024/2=9216个大页。

echo 9216 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages

步骤3     复用原有的3个虚拟机,修改配置并重启虚拟机。

virsh shutdown vm-redis-multiple1
virsh shutdown vm-redis-multiple2
virsh shutdown vm-redis-multiple3
virsh edit vm-redis-multiple1
virsh edit vm-redis-multiple2
virsh edit vm-redis-multiple3
virsh start vm-redis-multiple1
virsh start vm-redis-multiple2
virsh start vm-redis-multiple3

虚拟机配置参考3.3.2 redis单虚拟机测试的虚拟机配置部分,其中2台虚拟机的大页的allocation mode标签使用hugepage-ondemand,1台虚拟机使用immediate。

<metadata>  <reclaim xmlns="http://reclaim.io"/></metadata>
<memoryBacking>
    <hugepages>
      <!-- 这里的 size 必须对应宿主机 /proc/meminfo 中的 Hugepagesize (通常是 2048 kB) -->
      <page size='2048' unit='KiB'/>
    </hugepages>
    <allocation mode='hugepage-ondemand'/>
  </memoryBacking>

有时候遇到将allocation mode修改为'hugepage-ondemand'后校验不通过,可以使用i(ignore)忽略,大页内存的实际分配策略由内核控制,libvirt 只是传递参数,

因此该参数会被libvirt校验xml拦截,但实际生效。

步骤4    在虚拟机中进行redis绑核,网络绑中断后启动redis。

#进入虚拟机并在虚拟机执行
cat /proc/interrupts | grep virtio # 查看后该虚拟机virtio的中断在60,61
echo > 0 /proc/irq/60/smp_affinity_list # 将中断号为60的中断绑定到cpu 0上
echo > 0 /proc/irq/61/smp_affinity_list # 将中断号为61的中断绑定到cpu 0上
taskset -c 1 redis-server /etc/redis.conf #将redis应用绑定到cpu 1上,与中断绑定的cpu错开

步骤5   启动大页内存管理工具。

cd /home/cloud-virtual/tools/
./reclaim

步骤6    在宿主机执行对于2个虚拟机的redis-benchmark测试。

redis-benchmark -h 192.168.25.100 -p 6379 -t set -c 1000 -r 5000000 -n 5000000 -d 1024
redis-benchmark -h 192.168.25.102 -p 6379 -t set -c 1000 -r 5000000 -n 5000000 -d 1024

步骤7   观察大页内存的变化情况,在物理机执行以下命令观测剩余大页数量:

watch -n 1 "cat /sys/devices/system/node/node0/hugepages/hugepages-2048kB/free_hugepages"

     

可以观察到,随着压测的进行,大页内存数量会减少,减少到阈值(约为大页内存的20%)后会触发内存回收。

此时大页内存剩余1831页时触发了内存回收,大页内存管理工具会从每个标签为允许回收的虚拟机的冷页内存回收内存,大页内存数量增加。

步骤8   观察虚拟机内存以及运行状态,超分状态下,3台虚拟机均正常运行。

           ----结束    

该测试用例下,超分状态下的redis测试结果对比未超分状态下的redis测试结果,性能损耗约为5%,以上场景性能损耗<15%均属正常。

须知:1. Redis进行benchmark测试后内存占用不会释放,会导致仍然存留大量内存占用,进而影响下一次测试的结果,在内存极限测试场景下会导致下一次测试redis拒绝连接,benchmark测试失败的问题,因此在benchmark测试后需要先清理redis缓存再进行测试。

清理缓存:redis-cli FLUSHALL。

2. Redis进行benchmark测试后会产生rdb文件用于持久化,Redis在下一次启动的时候会读取跟加载这些rdb文件,该机制会导致大量内存占用(视rdb文件内容而定),在内存极限测试场景下会导致redis拒绝连接,benchmark测试失败的问题,因此在benchmark测试后需要先清理rdb文件再进行测试。

清理rdb文件:rm /var/lib/redis*.rdb。

本页内容