9.3. 使用容器放置优化 CPU 性能


使用实时配置集调整主机后,您可以通过选择将容器放置到特定 CPU 并调整容器运行时行为来进一步优化性能。使用这些策略,您可以探索 CPU 隔离和 cgroup 配置如何影响容器化工作负载中的延迟。

9.3.1. 在所有 CPU 上运行 podman

要使用 rteval 容器运行 podman,请使用 tuned realtime 配置集或自定义系统调整来调优您的系统。确定您是否需要对您要测量的场景进行 CPU 隔离。确保正确设置 CPU 隔离以避免在某些情况下运行容器时出现问题。

检查 /proc/cmdline 中的 isolcpus= 参数。如果没有设置 isolcpus,您的系统不会隔离任何 CPU,您可以在所有 CPU 上运行容器。

先决条件

  • /proc/cmdline 中的 isolcpus= 参数设为在所有 CPU 之间运行容器。
  • 主机在 Red Hat Enterprise Linux 9.6 或更高版本中运行。
  • podman 服务正在运行。
  • rteval 容器已安装并运行。

流程

  1. 登录到 podman registry:

    $ podman login registry.redhat.io
  2. 运行 rteval 容器。选择以下方法之一来运行容器:

    • 在单个 NUMA 节点框中的所有 CPU 上:

      $ podman run -it --rm --privileged --pids-limit=0 registry.redhat.io/rhel10/rteval \
      	/bin/bash -c 'rteval --duration 2h'
    • 在多 NUMA 节点机器中:

      $ podman run -it --rm --privileged --pids-limit=0 registry.redhat.io/rhel10/rteval \
      	/bin/bash -c 'rteval --duration 2h --loads-cpulist 0,1 --measurement-cpulist 2-47
      --pids-limit=0

      kcompile 可在不达到容器运行时的默认限制的情况下运行。

      kcompile 是一个命令行工具,用于为当前运行的内核编译内核模块,而无需重建整个内核。

      --privileged
      容器可以访问主机系统上的所有设备。这是 rteval 正确运行所必需的。

这些命令在所有可用节点上运行单个容器。tuned 服务管理主机性能优化,可让您在仅使用单个 CPU 时评估裸机性能。

验证

  • 在新终端中,列出所有包括 rteval 容器的容器,以确保它正确运行:

    $ podman ps -a

9.3.2. 运行带有分割 CPU 分配的 podman

您可以将不同的容器分配给不同的 CPU 集,以测试负载分离和测量。例如,当只有一个 NUMA 节点且您想要将负载和测量分隔到容器中时,您可以运行两个不同的容器。在这种情况下,两个容器都在每个 CPU 上运行,且没有分区用于调整。

示例命令:

  • 加载容器

    $ podman run -it --rm --privileged --pids-limit=0 registry.redhat.io/rhel10/rteval \
       	/bin/bash -c 'rteval --duration 2h --onlyload'
  • 测量容器

    $ podman run -it --rm --privileged --pids-limit=0 registry.redhat.io/rhel10/rteval \
       	/bin/bash -c 'rteval --duration 2h --onlymeasure'

对于在有多个 NUMA 节点或手动分区机器的框上分区的情况,示例命令有:

  • 加载容器

    $ podman run -it --rm --privileged --pids-limit=0 --cpuset-cpus 0,1 registry.redhat.io/rhel10/rteval \
    /bin/bash -c 'rteval --duration 2h --onlyload --loads-cpulist 0,1'
  • 测量容器

    $ podman run -it --rm --privileged --pids-limit=0 --cpuset-cpus 2-47 registry.redhat.io/rhel10/rteval \
    /bin/bash -c 'rteval --duration 2h --noload --measurement-cpulist 2-47'

运行这些命令后,加载容器会在内务核上生成负载,而测量容器则在 isol_cpu 集上运行。

如果没有配置分区,则一个容器会在系统上的所有 CPU 之间生成负载,另一个容器会在所有节点上测量延迟。

在这两种情况下,负载和测量会在两个容器之间成功分开。

您可以在实时配置集中调整每个 NUMA 节点设置的内务 CPU。这通过确保内务务任务在 NUMA 节点之间平均分配,从而优化系统性能。

这对具有多个 NUMA 节点的系统特别有用,因为它有助于减少争用并改进整体性能。

默认 realtime tuned 配置集为每个 NUMA 节点保留一个内务 CPU (hk_per_numa=1)。如果需要更多可用于容器工作负载的 CPU,您可以修改此行为。

先决条件

  • 主机在 Red Hat Enterprise Linux 9.6 或更高版本中运行。
  • tuned 服务正在运行。
  • rteval 容器已安装并运行。
  • podman 服务正在运行。
  • 已安装 tuned-profiles-realtime 软件包。

流程

  1. 修改 realtime-variables.conf 文件,以调整每个 NUMA 节点设置的内务 CPU。

    • 在文本编辑器中打开位于 /etc/tunedrealtime-variables.conf 文件:

      $ sudo vi /etc/tuned/realtime-variables.conf
    • 找到 isolated_cores 变量。默认情况下,这设置为 1,这意味着每个 NUMA 节点保留了一个内核,用于隔离或非内部维护。您可以增加这个值,但它必须小于每个 NUMA 节点的 CPU 总数。

      以下示例将每个 NUMA 节点有 24 个内核的系统中将 isolated_cores 设置为 3

      isolated_cores=${f:calc_isolated_cores:3}
  2. 保存您的更改并关闭该文件。
  3. 重新应用 tuned 实时配置集:

    $ sudo tuned-adm profile realtime

这会导致测试过程中产生 6 个 CPU (每个 NUMA 节点 3)生成负载,而系统则保留了 isolcpus 集的剩余内核。此配置用于测量。在某些情况下,混合优先级配置可能会在自定义拓扑上部署容器,而不是在设置 isolcpus 上。

或者,您可以手动指定自定义 CPU 范围,而不依赖于每个节点的自动计数。这样可确保对隔离内核的完整控制,从而更易于使用非统一拓扑或专用 CPU 布局调整系统。

验证

  1. 验证 realtime-variables.conf 文件中的更改。
  2. 重启系统以应用更改。
  3. 查看 /proc/cmdline 文件,以确认 isolcpus 设置:

    $ cat /proc/cmdline
    BOOT_IMAGE=(hd0,gpt2)/vmlinuz-5.XX.X-XX.X.X.el9_6.x86_64+rt root=/dev/mapper/rhel_rt--qe--11-root ro  crashkernel=1G-4G:192M,4G-64G:256M,64G-:512M resume=UUID=00cbf36d-ffaa-4285-a381-5c1d868eb3e3 rd.lvm.lv=rhel_rt-qe-11/root rd.lvm.lv=rhel_rt-qe-11/swap console=ttyS0,115200n81 skew_tick=1 tsc=reliable rcupdate.rcu_normal_after_boot=1 isolcpus=managed_irq,domain,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47 intel_pstate=disable nosoftlockup

9.3.4. 在隔离的 CPU 之间分散多个容器

要在隔离的 CPU 之间运行多个容器,您可以使用 --cpuset-cpus 选项指定每个容器应使用哪些 CPU。这会划分多个隔离的 CPU 的负载,从而提高性能并减少争用。

您可以将设置在多个容器间划分的 isolcpus 模拟以下任务:

  • 并发对延迟敏感的任务。
  • 跨分区系统进行多个负载。

9.3.4.1. 模拟并发对延迟敏感的任务

要模拟并发对延迟敏感的任务,您可以将特定的隔离 CPU 分配给每个容器。以下示例演示了如何在不同的 CPU 集间配置和运行容器。

在 CPU 0-6 上运行一个容器,在 CPU 7-28 上运行另一个容器,在 CPU 29-47 上运行第三个容器。使用以下命令:

$ podman run -it --rm --privileged --pids-limit=0 --cpuset-cpus 0-6 registry.redhat.io/rhel10/rteval \
    /bin/bash -c 'rteval --duration 2h --onlyload --loads-cpulist 0-6'
$ podman run -it --rm --privileged --pids-limit=0 --cpuset-cpus 7-28 registry.redhat.io/rhel10/rteval \
    /bin/bash -c 'rteval --duration 2h --onlyload --loads-cpulist 7-28'
$ podman run -it --rm --privileged --pids-limit=0 --cpuset-cpus 29-47 registry.redhat.io/rhel10/rteval \
    /bin/bash -c 'rteval --duration 2h --onlyload --loads-cpulist 29-47'

9.3.4.2. 在分区系统中模拟多个负载

在非隔离 CPU 集上启动 rteval 负载生成器。接下来,在 isolcpus 设置的一部分上模拟高吞吐量的应用,如高速数据库容器。在本例中,CPU 7-28 用于代表高速数据库容器。在单独的终端会话中运行以下命令以启动负载。

$ podman run -it --rm --privileged --pids-limit=0 --cpuset-cpus 0-6 registry.redhat.io/rhel10/rteval \
    /bin/bash -c 'rteval --duration 2h --onlyload --loads-cpulist 0-6'

然后,在一个单独的终端中,在隔离 CPU 的子集上生成一些负载:

$ podman run -it --rm --privileged --pids-limit=0 --cpuset-cpus 20-30 registry.redhat.io/rhel10/rteval \
    /bin/bash -c 'rteval --duration 2h --onlyload --loads-cpulist 20-30'

现在,要在剩余的 CPU 上运行测量线程,有两个选项。您可以将隔离 CPU 的两个剩余子集部署到单独的容器,或者运行使用两个剩余的 CPU 子集的单个测量容器。

  • 选项 1:部署两个测量容器

    $ podman run -it --rm --privileged --pids-limit=0 --cpuset-cpus 7-19 registry.redhat.io/rhel10/rteval \
        /bin/bash -c 'rteval --duration 2h --noload --measurement-cpulist 7-19'
    $ podman run -it --rm --privileged --pids-limit=0 --cpuset-cpus 31-47 registry.redhat.io/rhel10/rteval \
        /bin/bash -c 'rteval --duration 2h --noload --measurement-cpulist 31-47'
  • 选项 2:部署单个测量容器

    $ podman run -it --rm --privileged --pids-limit=0 --cpuset-cpus 7-19,31-47 registry.redhat.io/rhel10/rteval \
        /bin/bash -c 'rteval --duration 2h --noload --measurement-cpulist 7-19,31-47'
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2026 Red Hat
返回顶部