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容器已安装并运行。
流程
登录到
podmanregistry:$ podman login registry.redhat.io运行
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=0kcompile可在不达到容器运行时的默认限制的情况下运行。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 之间生成负载,另一个容器会在所有节点上测量延迟。
在这两种情况下,负载和测量会在两个容器之间成功分开。
9.3.3. 在实时配置集中调整每个 NUMA 的内务操作 复制链接链接已复制到粘贴板!
您可以在实时配置集中调整每个 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软件包。
流程
修改
realtime-variables.conf文件,以调整每个 NUMA 节点设置的内务 CPU。在文本编辑器中打开位于
/etc/tuned的realtime-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}
- 保存您的更改并关闭该文件。
重新应用
tuned实时配置集:$ sudo tuned-adm profile realtime
这会导致测试过程中产生 6 个 CPU (每个 NUMA 节点 3)生成负载,而系统则保留了 isolcpus 集的剩余内核。此配置用于测量。在某些情况下,混合优先级配置可能会在自定义拓扑上部署容器,而不是在设置 isolcpus 上。
或者,您可以手动指定自定义 CPU 范围,而不依赖于每个节点的自动计数。这样可确保对隔离内核的完整控制,从而更易于使用非统一拓扑或专用 CPU 布局调整系统。
验证
-
验证
realtime-variables.conf文件中的更改。 - 重启系统以应用更改。
查看
/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'