第 8 章 配置低延迟


8.1. 配置低延迟

您可以配置和调优低延迟功能,以提高边缘设备上的应用程序性能。

8.1.1. 在 MicroShift 应用程序中降低延迟

延迟定义为事件到该事件的响应的时间。您可以在在操作或软件定义的控制系统上运行的 MicroShift 集群中使用低延迟配置和调优,其中边缘设备需要快速响应外部事件。您可以通过将 MicroShift 配置与操作系统调优和工作负载分区结合使用来完全优化低延迟性能。

重要

为管理应用程序设置的 CPU,如 MicroShift 服务、OVS、CRI-O、MicroShift pod 和隔离内核必须包含 all-online CPU。

8.1.1.1. 为 MicroShift 应用程序配置低延迟的工作流

要为在 MicroShift 集群中运行的应用程序配置低延迟,您必须完成以下任务:

必填
  • 安装 microshift-low-latency RPM。
  • 配置工作负载分区。
  • /etc/microshift/ 目录中配置 config.yaml 文件的 kubelet 部分。
  • 配置并激活 TuneD 配置集。TuneD 是一个 Red Hat Enterprise Linux (RHEL)服务,它监控主机系统并优化特定工作负载的性能。
  • 重启主机。
选填

其他资源

8.1.2. 安装 MicroShift 低延迟 RPM 软件包

安装 MicroShift 时,默认不会安装低延迟 RPM 软件包。您可以将低延迟 RPM 安装为可选软件包。

先决条件

  1. 已安装 MicroShift RPM。
  2. 为 MicroShift 配置工作负载分区。

流程

  • 运行以下命令来安装低延迟 RPM 软件包:

    $ sudo dnf install -y microshift-low-latency
    提示

    等待主机重启,直到激活 TuneD 配置集后。重启主机重启 MicroShift 和 CRI-O,它应用低延迟清单并激活 TuneD 配置集。

后续步骤

  1. 为 MicroShift config.yaml 中的低延迟配置 kubelet 参数。
  2. 调优操作系统,例如配置并激活 TuneD 配置集。
  3. 可选:配置 TuneD 配置集的自动激活。
  4. 可选:如果您使用 x86_64 架构,请安装 Red Hat Enterprise Linux for Real Time (实时内核)。
  5. 为低延迟准备工作负载。

8.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: static 2
      cpuManagerPolicyOptions:
        full-pcpus-only: "true" 3
      cpuManagerReconcilePeriod: 5s
      memoryManagerPolicy: Static 4
      topologyManagerPolicy: single-numa-node
      reservedSystemCPUs: 0-1 5
      reservedMemory:
      - limits:
          memory: 1100Mi 6
        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
    要使用的策略的名称。有效值为 nonestatic。需要启用 CPUManager 功能门。默认值为 none
    3
    一组 key=value 对,用于设置额外选项,以微调 CPUManager 策略的行为。默认值为 null。需要启用 CPUManagerCPUManagerPolicyOptions 功能门。
    4
    Memory Manager 使用的策略名称。区分大小写。默认值为 none。需要启用 MemoryManager 功能门。
    5
    必需。reservedSystemCPUs 值必须是离线 CPU 的反转,因为组合的值都必须考虑系统中的所有 CPU。这个参数对于划分管理和应用程序工作负载非常重要。使用此参数为主机级别系统和 Kubernetes 守护进程定义静态 CPU 设置,以及中断和计时器。然后,系统中的其余 CPU 专门用于工作负载。
    6
    本例中的 reservedMemory[0].limits.memory,1100 Mi 的值等于 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 文件中。

后续步骤

  1. 启用工作负载分区。
  2. 调优您的操作系统。例如,配置和激活 TuneD 配置集。
  3. 可选:配置 TuneD 配置集的自动启用。
  4. 可选:如果您使用 x86_64 架构,您可以安装 Red Hat Enterprise Linux for Real Time (实时内核)。
  5. 为低延迟准备 MicroShift 工作负载。

其他资源

8.1.4. Tuning Red Hat Enterprise Linux 9

作为 Red Hat Enterprise Linux (RHEL)系统管理员,您可以使用 TuneD 服务针对各种用例优化 RHEL 的性能配置集。TuneD 监控并优化某些工作负载下的系统性能,包括延迟性能。

  • 使用 TuneD 配置集根据不同的用例调优您的系统,如部署低延迟 MicroShift 集群。
  • 您可以修改为每个配置集定义的规则,并自定义特定设备的调整。
  • 当您切换到另一个配置集或取消激活 TuneD 时,对之前配置集进行的所有更改都会恢复到其原始状态。
  • 您还可以将 TuneD 配置为响应设备使用的变化,并调整设置以提高活跃设备的性能并减少不活跃设备的功耗。

8.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-latency RPM 软件包。
  • 您的 RHEL 主机已安装了 TuneD。请参阅开始使用 TuneD (RHEL 文档)。

流程

  1. 您可以使用 /etc/tuned/ 目录配置集中的默认 microshift-baseline-variables.conf TuneD 配置集,或者自行添加更多调整。

    microshift-baseline-variables.conf TuneD 配置集示例

    # Isolate cores 2-7 for running application workloads
    isolated_cores=2-7 1
    
    # Size of the hugepages
    hugepages_size=2M 2
    
    # 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-7isolated_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 重叠。

  2. 运行以下命令启用配置集或更改活跃:

    $ sudo tuned-adm profile microshift-baseline
  3. 重启主机,使内核参数处于活动状态。

验证

  • 可选:您可以读取包含在启动时当前运行内核的参数的 /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

后续步骤

  1. 为低延迟准备 MicroShift 工作负载。
  2. 可选:配置 TuneD 配置集的自动启用。
  3. 可选:如果您使用 x86_64 架构,您可以安装 Red Hat Enterprise Linux for Real Time (实时内核)。

其他资源

8.1.4.2. 自动启用 MicroShift TuneD 配置集

microshift-low-latency RPM 软件包包含在 microshift-low-latency RPM 软件包中,您可以将它配置为在系统启动时自动启用 TuneD 配置集。如果要在大量设备中安装 MicroShift 时,此功能特别有用。

先决条件

  1. 在主机上安装了 microshift-low-latency RPM 软件包。
  2. 您可以在 MicroShift config.yaml 中启用低延迟。
  3. 您创建了 TuneD 配置集。
  4. 您已配置了 microshift-baseline-variables.conf 文件。

流程

  1. /etc/microshift/ 目录中配置 tuned.yaml,例如:

    tuned.yaml 示例

    profile: microshift-baseline 1
    reboot_after_apply: True 2

    1
    控制激活 TuneD 配置集。在本例中,配置集的名称是 microshift-baseline
    2
    控制应用配置文件后是否必须重启主机。有效值为 TrueFalse。例如,使用 True 设置在部署新的 ostree 提交后自动重启主机。
    重要

    microshift-tuned.service 运行时,主机会被重启,但它不会在部署新提交时重启系统。您必须重启主机以启用新的提交,当 microshift-tuned.service 在该引导时运行时,系统会再次启动,并检测对配置集和变量的更改。

    这个双引导可能会影响回滚。确保您调整了在使用自动配置集激活时在回滚前允许的 greenboot 中的重启数量。例如,如果在 greenboot 的回滚前允许 3 个重启,请将该数字增加到 4。如需更多信息,请参阅"附加资源"列表。

  2. 输入以下命令启用 microshift-tuned.service 在每个系统启动时运行:

    $ sudo systemctl enable microshift-tuned.service
    重要

    如果将 reboot_after_apply 设置为 True,请确保 TuneD 配置集处于活跃状态,且不会在 MicroShift 服务外激活其他配置集。否则,启动 microshift-tuned.service 会导致主机重启。

  3. 运行以下命令启动 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 (实时内核)。

8.1.5. 使用 Red Hat Enterprise Linux for Real Time

如果您的工作负载对核心内核功能有严格的低延迟确定性要求,如中断处理和进程调度(在微秒)范围内,您可以使用 Red Hat Enterprise Linux for Real Time (实时内核)。实时内核的目标是提供可预测的响应时间的一致性、低延迟确定性。

在考虑系统调整时,请考虑以下因素:

  • 使用实时内核与标准内核一样,系统调优非常重要。
  • 在运行作为 RHEL 9 版本的一部分所提供的、未调整的标准内核系统上安装实时内核可能无法获得显著的好处。
  • 调优标准内核会获得大约 90% 的延迟。
  • 实时内核提供要求最高的工作负载所需的最后 10% 的延迟减少。

8.1.5.1. 安装 Red Hat Enterprise Linux for Real Time (实时内核)

虽然低延迟工作负载不需要实时内核,但使用实时内核可以优化低延迟性能。您可以使用 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 架构。

流程

  1. 运行以下命令来启用实时内核存储库:

    $ sudo subscription-manager repos --enable rhel-9-for-x86_64-rt-rpms
  2. 运行以下命令来安装实时内核:

    $ sudo dnf install -y kernel-rt
  3. 运行以下命令查询实时内核版本:

    $ RTVER=$(rpm -q --queryformat '%{version}-%{release}.%{arch}' kernel-rt | sort | tail -1)
  4. 运行以下命令,在 GRUB 中进行持久更改,该更改将实时内核指定为默认内核:

    $ sudo grubby --set-default="/boot/vmlinuz-${RTVER}+rt"
  5. 重启主机以激活实时内核。

后续步骤

  1. 为低延迟准备 MicroShift 工作负载。
  2. 可选:使用蓝图在 RHEL for Edge 镜像中安装实时内核。

8.1.5.2. 在 Red Hat Enterprise Linux for Edge (RHEL for Edge)镜像中安装 Red Hat Enterprise Linux for Real Time (实时内核)

您可以使用镜像构建器在 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
    """

后续步骤

  1. 完成镜像构建过程。
  2. 如果您还没有完成为 MicroShift 集群启用低延迟的步骤,请现在完成。使用这些步骤中收集的信息更新蓝图。
  3. 如果您还没有配置工作负载分区,请现在这样做。
  4. 为低延迟准备 MicroShift 工作负载。

8.1.6. 使用实时内核构建 Red Hat Enterprise Linux for Edge (RHEL for Edge)镜像

从以下流程开始,在 RHEL for Edge 镜像中嵌入 MicroShift 来完成构建过程。然后在 RHEL for Edge 镜像中安装 MicroShift 的安装文档中完成剩余的步骤:

8.1.7. 为低延迟准备 MicroShift 工作负载

为了利用低延迟,在 MicroShift 上运行的工作负载必须使用 RuntimeClass 功能设置 microshift-low-latency 容器运行时配置。CRI-O RuntimeClass 对象使用 microshift-low-latency RPM 安装,因此只需要配置 pod 注解。

先决条件

  • 已安装 microshift-low-latency RPM 软件包。
  • 配置了工作负载分区。

流程

  • 使用以下示例在 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-latency 6
      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

    1
    禁用 pod 的 CPU 负载均衡。
    2
    选择 pod 不使用中断处理(IRQ)。
    3
    在 pod 运行时禁用 CPU 完全公平调度程序(CFS)配额。
    4
    为每个 CPU 启用或禁用 C-states。将值设为 disable,以便为高优先级 pod 提供最佳性能。
    5
    为每个 CPU 设置 cpufreq 调控器。对于高优先级工作负载,建议使用 performance governor。
    6
    runtimeClassName 必须与集群中配置的性能配置集的名称匹配。例如,microshift-low-latency
    注意

    仅在启用了 CPU 管理器静态策略以及带有保证 QoS 使用整个 CPU 的 pod 时,禁用 CPU 负载均衡。否则,禁用 CPU 负载均衡会影响集群中其他容器的性能。

    重要

    要使 pod 具有 Guaranteed QoS 类,在请求和限值中,它必须具有相同的 CPU 和内存值。请参阅 Guaranteed (Kubernetes 上游文档)

其他资源

8.1.8. 用于在 RHEL for Edge 镜像中安装 Red Hat Enterprise Linux for Real Time (实时内核)的参考蓝图

镜像蓝图是所需镜像自定义的持久定义,可让您创建多个构建。您不需要为每个镜像构建重新配置蓝图,而是编辑、重建、删除并保存蓝图,以便您可以保留重新构建镜像。

在 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
"""

其他资源

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.