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