4.4. 为实时虚拟机设置缓存保护
驱除缓存行可能会导致实时虚拟机(VM)中的性能问题。要避免这个问题,请使用 User Interface for Resource Control (resctrlfs'
)功能管理您的缓存和缓存分区:
- 将主机系统的主内存缓存划分为分区
- 为每个分区分配单独的任务
- 将运行实时应用程序的 vCPU 分配给一个缓存分区
- 将运行日常工作负载的 vCPU 和主机 CPU 分配给不同的缓存分区
先决条件
- 您已在主机上创建了一个实时虚拟机。具体步骤请参阅 安装 RHEL 实时客户机操作系统。
您的主机使用支持 L2 或 L3 缓存分区的 Intel 处理器。要确定是这种情况:
安装
intel-cmt-cat
工具。dnf install intel-cmt-cat
# dnf install intel-cmt-cat
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
pqos
实用程序显示您的核心缓存详细信息。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 此输出表示您的 CPU 支持 L3 缓存分区。
流程
以下步骤假设您有以下 NUMA 固定将 vCPU 分配给 CPU。
<cputune> <vcpupin vcpu='0' cpuset='16'/> <vcpupin vcpu='1' cpuset='17'/> <vcpupin vcpu='2' cpuset='18'/> <vcpupin vcpu='3' cpuset='19'/>
<cputune>
<vcpupin vcpu='0' cpuset='16'/>
<vcpupin vcpu='1' cpuset='17'/>
<vcpupin vcpu='2' cpuset='18'/>
<vcpupin vcpu='3' cpuset='19'/>
挂载
resctrl
文件系统。这样便可使用处理器的资源控制功能。mount -t resctrl resctrl /sys/fs/resctrl
# mount -t resctrl resctrl /sys/fs/resctrl
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 根据您的系统是否支持 L2 还是 L3 缓存分区,名为
L2
或L3
的子目录挂载到/sys/fs/resctrl/info
目录中。以下步骤假设您的系统支持 L3 缓存分区。移到缓存目录并列出其内容。
cd /sys/fs/resctrl/info/L3/; ls
# cd /sys/fs/resctrl/info/L3/; ls bit_usage cbm_mask min_cbm_bits num_closids shareable_bits sparse_masks
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 查看
cbm_mask
文件的值。cat cbm_mask ffff
# cat cbm_mask ffff
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 这个值代表十六进制代码中的缓存位掩码。
ffff
表示工作负载可以使用所有 16 位的缓存。查看 "shareable_bits" 文件的值。
cat shareable_bits 0
# cat shareable_bits 0
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 这个值代表了由其他执行进程(如 I/O)共享的 L3 缓存的分区,因此不应在独占缓存分区中使用。
0
表示您可以使用所有 L3 缓存分区。查看
schemata
文件,以查看全局缓存分配。cat /sys/fs/resctrl/schemata L3:0=ffff;2=ffff;4=ffff;6=ffff;8=ffff;10=ffff;12=ffff;14=ffff
# cat /sys/fs/resctrl/schemata L3:0=ffff;2=ffff;4=ffff;6=ffff;8=ffff;10=ffff;12=ffff;14=ffff
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 此输出显示,对于 L3 缓存分区,CPU 插槽 0、2、4、6、8、10、12 和 14 已完全分配给默认控制组。在本例中,CPU 插槽 16 到 19 被固定到 vCPU 0-3。
确定您要为实时应用程序设置的缓存分发。例如,对于实时应用程序和内务应用程序,平均分配 8 MB:
-
实时应用程序的缓存位掩码为
ff00
-
housekeeping 应用程序的缓存位掩码为
00ff
-
实时应用程序的缓存位掩码为
使用日常进程所需的缓存分配来调整默认的
schemata
文件。例如,要将 8MB 分配给 CPU 套接字 8,请执行以下操作:echo "L3:0=ffff;2=ffff;4=ffff;6=ffff;8=00ff;10=ffff;12=ffff;14=ffff" > /sys/fs/resctrl/schemata
# echo "L3:0=ffff;2=ffff;4=ffff;6=ffff;8=00ff;10=ffff;12=ffff;14=ffff" > /sys/fs/resctrl/schemata
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 为实时进程创建特定的控制组,如
part1
。mkdir /sys/fs/resctrl/part1
# mkdir /sys/fs/resctrl/part1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 为
part1
控制组创建一个schemata
文件,并将其设置为使用与内务缓存分配不冲突的缓存分配。echo "L3:0=ffff;2=ffff;4=ffff;6=ffff;8=ff00;10=ffff;12=ffff;14=ffff" > /sys/fs/resctrl/part1/schemata
# echo "L3:0=ffff;2=ffff;4=ffff;6=ffff;8=ff00;10=ffff;12=ffff;14=ffff" > /sys/fs/resctrl/part1/schemata
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 有了这个设置,L3 缓存 8 会将一半的缓存分配用于实时进程,其他一半用于内务进程。所有其他 L3 缓存都可以由实时进程和内务操作自由使用。
将固定到实时 vCPU 的 CPU (本例中为 17、18 和 19))分配给此控制组。
echo 17,18,19 > part1/cpus_list
# echo 17,18,19 > part1/cpus_list
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
如果您之前测试了虚拟机延迟,请再次运行
cyclictest
工具。具体步骤请查看 Stress 测试实时虚拟化系统。如果最大延迟低于之前,则代表您已正确设置了缓存保护。