4.4. 为实时虚拟机设置缓存保护


驱除缓存行可能会导致实时虚拟机(VM)中的性能问题。要避免这个问题,请使用 User Interface for Resource Control (resctrlfs')功能管理您的缓存和缓存分区:

  • 将主机系统的主内存缓存划分为分区
  • 为每个分区分配单独的任务
  • 将运行实时应用程序的 vCPU 分配给一个缓存分区
  • 将运行日常工作负载的 vCPU 和主机 CPU 分配给不同的缓存分区

先决条件

  • 您已在主机上创建了一个实时虚拟机。具体步骤请参阅 安装 RHEL 实时客户机操作系统
  • 您的主机使用支持 L2 或 L3 缓存分区的 Intel 处理器。要确定是这种情况:

    1. 安装 intel-cmt-cat 工具。

      # dnf install intel-cmt-cat
      Copy to Clipboard Toggle word wrap
    2. 使用 pqos 实用程序显示您的核心缓存详细信息。

      # pqos -d
      
      [...]
         Allocation
            Cache Allocation Technology (CAT)
              L3 CAT
      Copy to Clipboard Toggle word wrap

      此输出表示您的 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'/>
Copy to Clipboard Toggle word wrap
  1. 挂载 resctrl 文件系统。这样便可使用处理器的资源控制功能。

    # mount -t resctrl resctrl /sys/fs/resctrl
    Copy to Clipboard Toggle word wrap

    根据您的系统是否支持 L2 还是 L3 缓存分区,名为 L2L3 的子目录挂载到 /sys/fs/resctrl/info 目录中。以下步骤假设您的系统支持 L3 缓存分区。

  2. 移到缓存目录并列出其内容。

    # cd /sys/fs/resctrl/info/L3/; ls
    
    bit_usage  cbm_mask  min_cbm_bits  num_closids  shareable_bits  sparse_masks
    Copy to Clipboard Toggle word wrap
  3. 查看 cbm_mask 文件的值。

    # cat cbm_mask
    
    ffff
    Copy to Clipboard Toggle word wrap

    这个值代表十六进制代码中的缓存位掩码。ffff 表示工作负载可以使用所有 16 位的缓存。

  4. 查看 "shareable_bits" 文件的值。

    # cat shareable_bits
    
    0
    Copy to Clipboard Toggle word wrap

    这个值代表了由其他执行进程(如 I/O)共享的 L3 缓存的分区,因此不应在独占缓存分区中使用。0 表示您可以使用所有 L3 缓存分区。

  5. 查看 schemata 文件,以查看全局缓存分配。

    # 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 Toggle word wrap

    此输出显示,对于 L3 缓存分区,CPU 插槽 0、2、4、6、8、10、12 和 14 已完全分配给默认控制组。在本例中,CPU 插槽 16 到 19 被固定到 vCPU 0-3。

  6. 确定您要为实时应用程序设置的缓存分发。例如,对于实时应用程序和内务应用程序,平均分配 8 MB:

    • 实时应用程序的缓存位掩码为 ff00
    • housekeeping 应用程序的缓存位掩码为 00ff
  7. 使用日常进程所需的缓存分配来调整默认的 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
    Copy to Clipboard Toggle word wrap
  8. 为实时进程创建特定的控制组,如 part1

    # mkdir /sys/fs/resctrl/part1
    Copy to Clipboard Toggle word wrap
  9. 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 Toggle word wrap

    有了这个设置,L3 缓存 8 会将一半的缓存分配用于实时进程,其他一半用于内务进程。所有其他 L3 缓存都可以由实时进程和内务操作自由使用。

  10. 将固定到实时 vCPU 的 CPU (本例中为 17、18 和 19))分配给此控制组。

    # echo 17,18,19 > part1/cpus_list
    Copy to Clipboard Toggle word wrap

验证

  • 如果您之前测试了虚拟机延迟,请再次运行 cyclictest 工具。具体步骤请查看 Stress 测试实时虚拟化系统。

    如果最大延迟低于之前,则代表您已正确设置了缓存保护。

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat