第 9 章 配置低延迟
9.1. 配置低延迟 复制链接链接已复制到粘贴板!
您可以配置和调优低延迟功能,以提高边缘设备上的应用程序性能。
9.1.1. 在 MicroShift 应用程序中降低延迟 复制链接链接已复制到粘贴板!
延迟定义为事件到该事件的响应的时间。您可以在在操作或软件定义的控制系统上运行的 MicroShift 集群中使用低延迟配置和调优,其中边缘设备需要快速响应外部事件。您可以通过将 MicroShift 配置与操作系统调优和工作负载分区结合使用来完全优化低延迟性能。
为管理应用程序设置的 CPU,如 MicroShift 服务、OVS、CRI-O、MicroShift pod 和隔离内核必须包含 all-online CPU。
9.1.1.1. 为 MicroShift 应用程序配置低延迟的工作流 复制链接链接已复制到粘贴板!
要为在 MicroShift 集群中运行的应用程序配置低延迟,您必须完成以下任务:
- 必填
-
安装
microshift-low-latencyRPM。 - 配置工作负载分区。
-
在
/etc/microshift/目录中配置config.yaml文件的kubelet部分。 - 配置并激活 TuneD 配置集。TuneD 是一个 Red Hat Enterprise Linux (RHEL)服务,它监控主机系统并优化特定工作负载的性能。
- 重启主机。
-
安装
- 选填
- 如果使用 x86_64 架构,您可以安装 Red Hat Enterprise Linux for Real Time 9。
9.1.2. 安装 MicroShift 低延迟 RPM 软件包 复制链接链接已复制到粘贴板!
安装 MicroShift 时,默认不会安装低延迟 RPM 软件包。您可以将低延迟 RPM 安装为可选软件包。
先决条件
- 已安装 MicroShift RPM。
- 为 MicroShift 配置工作负载分区。
流程
运行以下命令来安装低延迟 RPM 软件包:
$ sudo dnf install -y microshift-low-latency提示等待主机重启,直到激活 TuneD 配置集后。重启主机重启 MicroShift 和 CRI-O,它应用低延迟清单并激活 TuneD 配置集。
后续步骤
-
为 MicroShift
config.yaml中的低延迟配置 kubelet 参数。 - 调优操作系统,例如配置并激活 TuneD 配置集。
- 可选:配置 TuneD 配置集的自动激活。
- 可选:如果您使用 x86_64 架构,请安装 Red Hat Enterprise Linux for Real Time (实时内核)。
- 为低延迟准备工作负载。
9.1.3. MicroShift 中的配置 kubelet 参数和值 复制链接链接已复制到粘贴板!
为 MicroShift 集群启用低延迟的第一步是将配置添加到 MicroShift config.yaml 文件中。
先决条件
-
已安装 OpenShift CLI(
oc)。 - 有对集群的 root 访问权限。
-
您在
/etc/microshift/目录中生成提供的config.yaml.default文件的副本,并将它重命名为config.yaml。
流程
将 kubelet 配置添加到 MicroShift
config.yaml文件中:passthrough
kubelet配置示例apiServer: # ... kubelet:1 cpuManagerPolicy: static2 cpuManagerPolicyOptions: full-pcpus-only: "true"3 cpuManagerReconcilePeriod: 5s memoryManagerPolicy: Static4 topologyManagerPolicy: single-numa-node reservedSystemCPUs: 0-15 reservedMemory: - limits: memory: 1100Mi6 numaNode: 0 kubeReserved: memory: 500Mi systemReserved: memory: 500Mi evictionHard:7 imagefs.available: "15%"8 memory.available: "100Mi"9 nodefs.available: "10%"10 nodefs.inodesFree: "5%"11 evictionPressureTransitionPeriod: 0s # ...- 1
- 如果您在 kubelet 配置中更改 CPU 或内存管理器,您必须删除缓存之前配置的文件。重启主机以自动删除它们,或者手动删除
/var/lib/kubelet/cpu_manager_state和/var/lib/kubelet/memory_manager_state文件。 - 2
- 要使用的策略的名称。有效值为
none和static。需要启用CPUManager功能门。默认值为none。 - 3
- 一组
key=value对,用于设置额外选项,以微调CPUManager策略的行为。默认值为null。需要启用CPUManager和CPUManagerPolicyOptions功能门。 - 4
- Memory Manager 使用的策略名称。区分大小写。默认值为
none。需要启用MemoryManager功能门。 - 5
- 必需。
reservedSystemCPUs值必须是离线 CPU 的反转,因为组合的值都必须考虑系统中的所有 CPU。这个参数对于划分管理和应用程序工作负载非常重要。使用此参数为主机级别系统和 Kubernetes 守护进程定义静态 CPU 设置,以及中断和计时器。然后,系统中的其余 CPU 专门用于工作负载。 - 6
- 本例中的
reservedMemory[0].limits.memory,1100Mi 的值等于kubeReserved.memory+systemReserved.memory+evictionHard.memory.available。 - 7
evictionHard参数定义 kubelet 在哪些情况下驱除 pod。当您更改evictionHard小节的一个参数的默认值时,其他参数的默认值不会继承,且设置为零。即使您想要只更改一个阈值,也请提供所有阈值。- 8
imagefs是一个文件系统,容器运行时用来存储容器镜像和容器可写入层。在本例中,evictionHard.imagefs.available参数意味着当镜像文件系统的可用空间小于 15% 时 pod 会被驱除。- 9
- 在本例中,
evictionHard.memory.available参数意味着当节点的可用内存下降到 100MiB 时,pod 会被驱除。 - 10
- 在本例中,
evictionHard.nodefs.available参数意味着当节点的主文件系统小于 10% 时,pod 会被驱除。 - 11
- 在本例中,
evictionHard.nodefs.inodesFree参数意味着,在使用节点主文件系统内节点的 15% 时 pod 会被驱除。
验证
-
完成后续步骤并重新启动主机后,您可以使用 root-access 帐户来检查您的设置是否在
/var/lib/microshift/resources/kubelet/config/目录中的config.yaml文件中。
后续步骤
- 启用工作负载分区。
- 调优您的操作系统。例如,配置和激活 TuneD 配置集。
- 可选:配置 TuneD 配置集的自动启用。
- 可选:如果您使用 x86_64 架构,您可以安装 Red Hat Enterprise Linux for Real Time (实时内核)。
- 为低延迟准备 MicroShift 工作负载。
9.1.4. Tuning Red Hat Enterprise Linux 9 复制链接链接已复制到粘贴板!
作为 Red Hat Enterprise Linux (RHEL)系统管理员,您可以使用 TuneD 服务针对各种用例优化 RHEL 的性能配置集。TuneD 监控并优化某些工作负载下的系统性能,包括延迟性能。
- 使用 TuneD 配置集根据不同的用例调优您的系统,如部署低延迟 MicroShift 集群。
- 您可以修改为每个配置集定义的规则,并自定义特定设备的调整。
- 当您切换到另一个配置集或取消激活 TuneD 时,对之前配置集进行的所有更改都会恢复到其原始状态。
- 您还可以将 TuneD 配置为响应设备使用的变化,并调整设置以提高活跃设备的性能并减少不活跃设备的功耗。
9.1.4.1. 配置 MicroShift TuneD 配置集 复制链接链接已复制到粘贴板!
在安装 microshift-low-latency RPM 软件包后,使用 Red Hat Enterprise Linux (RHEL) /etc/tuned/ host 目录中提供的 microshift-baseline-variables.conf 配置文件,将 TuneD 配置集配置为对 MicroShift 工作负载使用低延迟。
先决条件
- 有对集群的 root 访问权限。
-
已安装
microshift-low-latencyRPM 软件包。 - 您的 RHEL 主机已安装了 TuneD。请参阅开始使用 TuneD (RHEL 文档)。
流程
您可以使用
/etc/tuned/目录配置集中的默认microshift-baseline-variables.confTuneD 配置集,或者自行添加更多调整。microshift-baseline-variables.confTuneD 配置集示例# Isolate cores 2-7 for running application workloads isolated_cores=2-71 # Size of the hugepages hugepages_size=2M2 # Number of hugepages hugepages=0 # Additional kernel arguments additional_args=3 # CPU set to be offlined offline_cpu_set=4 - 1
- 控制应隔离哪些内核。默认情况下,在 MicroShift 中为每个插槽保留 1 个内核,用于内务处理。其他内核被隔离。有效值为核心列表或范围。您可以隔离任何范围,例如:
isolated_cores=2,4-7或isolated_cores=2-23。重要您必须只保留一个
isolated_cores=变量。注意Kubernetes CPU Manager 可以使用任何 CPU 来运行工作负载,但 kubelet 配置中定义的保留 CPU 除外。因此,最好这样做:
- kubelet 保留 CPU 和隔离内核的总和包括所有在线 CPU。
- 隔离内核与 kubelet 配置中定义的保留 CPU 的补充。
- 2
- 巨页的大小。有效值为 2M 或 1G。
- 3
- 其他内核参数,例如
additional_args=console=tty0 console=ttyS0,115200。 - 4
- 设置为 offlined 的 CPU。重要
不得与
isolated_cores重叠。
运行以下命令启用配置集或更改活跃:
$ sudo tuned-adm profile microshift-baseline- 重启主机,使内核参数处于活动状态。
验证
可选:您可以读取包含在启动时当前运行内核的参数的
/proc/cmdline文件。$ cat /proc/cmdline输出示例
BOOT_IMAGE=(hd0,msdos2)/ostree/rhel-7f82ccd9595c3c70af16525470e32c6a81c9138c4eae6c79ab86d5a2d108d7fc/vmlinuz-5.14.0-427.31.1.el9_4.x86_64+rt crashkernel=1G-4G:192M,4G-64G:256M,64G-:512M rd.lvm.lv=rhel/root fips=0 console=ttyS0,115200n8 root=/dev/mapper/rhel-root rw ostree=/ostree/boot.1/rhel/7f82ccd9595c3c70af16525470e32c6a81c9138c4eae6c79ab86d5a2d108d7fc/0 skew_tick=1 tsc=reliable rcupdate.rcu_normal_after_boot=1 nohz=on nohz_full=2,4-5 rcu_nocbs=2,4-5 tuned.non_isolcpus=0000000b intel_pstate=disable nosoftlockup hugepagesz=2M hugepages=10
后续步骤
- 为低延迟准备 MicroShift 工作负载。
- 可选:配置 TuneD 配置集的自动启用。
- 可选:如果您使用 x86_64 架构,您可以安装 Red Hat Enterprise Linux for Real Time (实时内核)。
9.1.4.2. 自动启用 MicroShift TuneD 配置集 复制链接链接已复制到粘贴板!
microshift-low-latency RPM 软件包包含在 microshift-low-latency RPM 软件包中,您可以将它配置为在系统启动时自动启用 TuneD 配置集。如果要在大量设备中安装 MicroShift 时,此功能特别有用。
先决条件
- 在主机上安装了 microshift-low-latency RPM 软件包。
-
您可以在 MicroShift
config.yaml中启用低延迟。 - 您创建了 TuneD 配置集。
-
您已配置了
microshift-baseline-variables.conf文件。
流程
在
/etc/microshift/目录中配置tuned.yaml,例如:tuned.yaml 示例
profile: microshift-baseline1 reboot_after_apply: True2 重要当
microshift-tuned.service运行时,主机会被重启,但它不会在部署新提交时重启系统。您必须重启主机以启用新的提交,当microshift-tuned.service在该引导时运行时,系统会再次启动,并检测对配置集和变量的更改。这个双引导可能会影响回滚。确保您调整了在使用自动配置集激活时在回滚前允许的 greenboot 中的重启数量。例如,如果在 greenboot 的回滚前允许 3 个重启,请将该数字增加到 4。如需更多信息,请参阅"附加资源"列表。
输入以下命令启用
microshift-tuned.service在每个系统启动时运行:$ sudo systemctl enable microshift-tuned.service重要如果将
reboot_after_apply设置为True,请确保 TuneD 配置集处于活跃状态,且不会在 MicroShift 服务外激活其他配置集。否则,启动microshift-tuned.service会导致主机重启。运行以下命令启动
microshift-tuned.service:$ sudo systemctl start microshift-tuned.service注意microshift-tuned.service使用收集的校验和来检测对所选 TuneD 配置集和变量的更改。如果磁盘中没有 checksum,服务会激活 TuneD 配置集并重启主机。预计首先启动microshift-tuned.service时,主机会重启。
后续步骤
- 可选:如果您使用 x86_64 架构,您可以安装 Red Hat Enterprise Linux for Real Time (实时内核)。
9.1.5. 使用 Red Hat Enterprise Linux for Real Time 复制链接链接已复制到粘贴板!
如果您的工作负载对核心内核功能有严格的低延迟确定性要求,如中断处理和进程调度(在微秒)范围内,您可以使用 Red Hat Enterprise Linux for Real Time (实时内核)。实时内核的目标是提供可预测的响应时间的一致性、低延迟确定性。
在考虑系统调整时,请考虑以下因素:
- 使用实时内核与标准内核一样,系统调优非常重要。
- 在运行作为 RHEL 9 版本的一部分所提供的、未调整的标准内核系统上安装实时内核可能无法获得显著的好处。
- 调优标准内核会获得大约 90% 的延迟。
- 实时内核提供要求最高的工作负载所需的最后 10% 的延迟减少。
虽然低延迟工作负载不需要实时内核,但使用实时内核可以优化低延迟性能。您可以使用 RPM 软件包在主机上安装它,并将其包括在 Red Hat Enterprise Linux for Edge (RHEL for Edge)镜像部署中。
先决条件
- 您有一个红帽订阅,其中包括 Red Hat Enterprise Linux for Real Time (实时内核)。例如,您的主机机器已注册,且 Red Hat Enterprise Linux (RHEL)附加到 RHEL for Real Time 订阅。
- 您使用 x86_64 架构。
流程
运行以下命令来启用实时内核存储库:
$ sudo subscription-manager repos --enable rhel-9-for-x86_64-rt-rpms运行以下命令来安装实时内核:
$ sudo dnf install -y kernel-rt运行以下命令查询实时内核版本:
$ RTVER=$(rpm -q --queryformat '%{version}-%{release}.%{arch}' kernel-rt | sort | tail -1)运行以下命令,在 GRUB 中进行持久更改,该更改将实时内核指定为默认内核:
$ sudo grubby --set-default="/boot/vmlinuz-${RTVER}+rt"- 重启主机以激活实时内核。
后续步骤
- 为低延迟准备 MicroShift 工作负载。
- 可选:使用蓝图在 RHEL for Edge 镜像中安装实时内核。
您可以使用镜像构建器在 RHEL for Edge 镜像部署中包括实时内核。以下示例蓝图部分包括从之前为 MicroShift 集群配置低延迟所需的步骤收集的引用。
先决条件
- 您已在包含 Red Hat Enterprise Linux for Real Time (实时内核)的主机上启用了红帽订阅。
- 您使用 x86_64 架构。
-
您已将
osbuild配置为使用kernel-rt存储库。
在用于构建提交的主机上必须启用包含实时内核的订阅。
流程
在完整的安装蓝图中添加以下示例蓝图,以便在 RHEL for Edge 镜像中安装实时内核:
实时内核的蓝图片断示例
[[packages]] name = "microshift-low-latency" version = "*" # Kernel RT is supported only on the x86_64 architecture [customizations.kernel] name = "kernel-rt" [customizations.services] enabled = ["microshift", "microshift-tuned"] [[customizations.files]] path = "/etc/microshift/config.yaml" data = """ kubelet: cpuManagerPolicy: static cpuManagerPolicyOptions: full-pcpus-only: "true" cpuManagerReconcilePeriod: 5s memoryManagerPolicy: Static topologyManagerPolicy: single-numa-node reservedSystemCPUs: 0-1 reservedMemory: - limits: memory: 1100Mi numaNode: 0 kubeReserved: memory: 500Mi systemReserved: memory: 500Mi evictionHard: imagefs.available: 15% memory.available: 100Mi nodefs.available: 10% nodefs.inodesFree: 5% evictionPressureTransitionPeriod: 0s """ [[customizations.files]] path = "/etc/tuned/microshift-baseline-variables.conf" data = """ # Isolated cores should be complementary to the kubelet configuration reserved CPUs. # Isolated and reserved CPUs must contain all online CPUs. # Core #3 is for testing offlining, therefore it is skipped. isolated_cores=2,4-5 hugepages_size=2M hugepages=10 additional_args=test1=on test2=true dummy offline_cpu_set=3 """ [[customizations.files]] path = "/etc/microshift/tuned.yaml" data = """ profile: microshift-baseline reboot_after_apply: True """
后续步骤
- 完成镜像构建过程。
- 如果您还没有完成为 MicroShift 集群启用低延迟的步骤,请现在完成。使用这些步骤中收集的信息更新蓝图。
- 如果您还没有配置工作负载分区,请现在这样做。
- 为低延迟准备 MicroShift 工作负载。
从以下流程开始,在 RHEL for Edge 镜像中嵌入 MicroShift 来完成构建过程。然后在 RHEL for Edge 镜像中安装 MicroShift 的安装文档中完成剩余的步骤:
9.1.7. 为低延迟准备 MicroShift 工作负载 复制链接链接已复制到粘贴板!
为了利用低延迟,在 MicroShift 上运行的工作负载必须使用 RuntimeClass 功能设置 microshift-low-latency 容器运行时配置。CRI-O RuntimeClass 对象使用 microshift-low-latency RPM 安装,因此只需要配置 pod 注解。
先决条件
-
已安装
microshift-low-latencyRPM 软件包。 - 配置了工作负载分区。
流程
使用以下示例在 pod 规格中设置以下注解:
cpu-load-balancing.crio.io: "disable" irq-load-balancing.crio.io: "disable" cpu-quota.crio.io: "disable" cpu-load-balancing.crio.io: "disable" cpu-freq-governor.crio.io: "<governor>"运行
oslat测试的 pod 示例:apiVersion: v1 kind: Pod metadata: name: oslat annotations: cpu-load-balancing.crio.io: "disable"1 irq-load-balancing.crio.io: "disable"2 cpu-quota.crio.io: "disable"3 cpu-c-states.crio.io: "disable"4 cpu-freq-governor.crio.io: "<governor>"5 spec: runtimeClassName: microshift-low-latency6 containers: - name: oslat image: quay.io/container-perf-tools/oslat imagePullPolicy: Always resources: requests: memory: "400Mi" cpu: "2" limits: memory: "400Mi" cpu: "2" env: - name: tool value: "oslat" - name: manual value: "n" - name: PRIO value: "1" - name: delay value: "0" - name: RUNTIME_SECONDS value: "60" - name: TRACE_THRESHOLD value: "" - name: EXTRA_ARGS value: "" securityContext: privileged: true capabilities: add: - SYS_NICE - IPC_LOCK注意仅在启用了 CPU 管理器静态策略以及带有保证 QoS 使用整个 CPU 的 pod 时,禁用 CPU 负载均衡。否则,禁用 CPU 负载均衡会影响集群中其他容器的性能。
重要要使 pod 具有
GuaranteedQoS 类,在请求和限值中,它必须具有相同的 CPU 和内存值。请参阅 Guaranteed (Kubernetes 上游文档)
镜像蓝图是所需镜像自定义的持久定义,可让您创建多个构建。您不需要为每个镜像构建重新配置蓝图,而是编辑、重建、删除并保存蓝图,以便您可以保留重新构建镜像。
在 RHEL for Edge 镜像中安装实时内核的蓝图示例
name = "microshift-low-latency"
description = "RHEL 9.4 and MicroShift configured for low latency"
version = "0.0.1"
modules = []
groups = []
distro = "rhel-94"
[[packages]]
name = "microshift"
version = "*"
[[packages]]
name = "microshift-greenboot"
version = "*"
[[packages]]
name = "microshift-networking"
version = "*"
[[packages]]
name = "microshift-selinux"
version = "*"
[[packages]]
name = "microshift-low-latency"
version = "*"
# Kernel RT is only available for x86_64
[customizations.kernel]
name = "kernel-rt"
[customizations.services]
enabled = ["microshift", "microshift-tuned"]
[customizations.firewall]
ports = ["22:tcp", "80:tcp", "443:tcp", "5353:udp", "6443:tcp", "30000-32767:tcp", "30000-32767:udp"]
[customizations.firewall.services]
enabled = ["mdns", "ssh", "http", "https"]
[[customizations.firewall.zones]]
name = "trusted"
sources = ["10.42.0.0/16", "169.254.169.1"]
[[customizations.files]]
path = "/etc/microshift/config.yaml"
data = """
kubelet:
cpuManagerPolicy: static
cpuManagerPolicyOptions:
full-pcpus-only: "true"
cpuManagerReconcilePeriod: 5s
memoryManagerPolicy: Static
topologyManagerPolicy: single-numa-node
reservedSystemCPUs: 0-1
reservedMemory:
- limits:
memory: 1100Mi
numaNode: 0
kubeReserved:
memory: 500Mi
systemReserved:
memory: 500Mi
evictionHard:
imagefs.available: 15%
memory.available: 100Mi
nodefs.available: 10%
nodefs.inodesFree: 5%
evictionPressureTransitionPeriod: 0s
"""
[[customizations.files]]
path = "/etc/tuned/microshift-baseline-variables.conf"
data = """
# Isolated cores should be complementary to the kubelet configuration reserved CPUs.
# Isolated and reserved CPUs must contain all online CPUs.
# Core #3 is for testing offlining, therefore it is skipped.
isolated_cores=2,4-5
hugepages_size=2M
hugepages=10
additional_args=test1=on test2=true dummy
offline_cpu_set=3
"""
[[customizations.files]]
path = "/etc/microshift/tuned.yaml"
data = """
profile: microshift-baseline
reboot_after_apply: True
"""