×

本主题提供在 IBM Z® 和 IBM® LinuxONE 上运行 OpenShift Container Platform 的建议主机实践。

s390x 架构在许多方面都是独一无二的。因此,此处提出的一些建议可能不适用于其他平台。

除非另有说明,否则这些实践适用于 IBM Z® 和 IBM® LinuxONE 上的 z/VM 和 Red Hat Enterprise Linux (RHEL) KVM 安装。

在高度虚拟化的 IBM Z® 环境中,必须仔细规划基础架构设置和大小。虚拟化最重要的功能之一是进行资源超额分配的能力,即为虚拟机分配的资源比虚拟机管理程序级别实际可用的资源更多。这非常依赖于工作负载,并且没有可以应用于所有设置的黄金法则。

根据您的设置,请考虑以下关于 CPU 超额分配的最佳实践

  • 在 LPAR 层级(PR/SM 虚拟机管理程序),避免将所有可用的物理核心 (IFL) 都分配给每个 LPAR。例如,如果有四个可用的物理 IFL,则不应定义三个每个都具有四个逻辑 IFL 的 LPAR。

  • 检查并理解 LPAR 的份额和权重。

  • 过多的虚拟 CPU 会对性能产生不利影响。不要为虚拟机定义比为 LPAR 定义的逻辑处理器更多的虚拟处理器。

  • 为虚拟机的虚拟处理器数量配置峰值工作负载,而不是更多。

  • 从小处着手并监控工作负载。如有必要,逐步增加 vCPU 数量。

  • 并非所有工作负载都适合高超额分配比率。如果工作负载是 CPU 密集型的,则可能无法在不影响性能的情况下实现高比率。即使超额分配比率很高,I/O 密集型工作负载也能保持一致的性能。

透明巨页 (THP) 尝试自动化创建、管理和使用巨页的大部分方面。由于 THP 自动管理巨页,因此并非总是能针对所有类型的工作负载进行最佳处理。THP 会导致性能下降,因为许多应用程序会自行处理巨页。因此,请考虑禁用 THP。

接收流转向 (RFS) 通过进一步降低网络延迟来扩展接收数据包转向 (RPS)。RFS 从技术上基于 RPS,并通过提高 CPU 缓存命中率来提高数据包处理效率。RFS 通过确定最方便的 CPU 进行计算来实现这一点,并额外考虑队列长度,以便 CPU 内更可能发生缓存命中。因此,CPU 缓存失效的次数更少,重建缓存所需的周期也更少。这有助于减少数据包处理运行时间。

步骤
  1. 将以下 MCO 示例配置文件复制到 YAML 文件中。例如,enable-rfs.yaml

    apiVersion: machineconfiguration.openshift.io/v1
    kind: MachineConfig
    metadata:
      labels:
        machineconfiguration.openshift.io/role: worker
      name: 50-enable-rfs
    spec:
      config:
        ignition:
          version: 2.2.0
        storage:
          files:
          - contents:
              source: data:text/plain;charset=US-ASCII,%23%20turn%20on%20Receive%20Flow%20Steering%20%28RFS%29%20for%20all%20network%20interfaces%0ASUBSYSTEM%3D%3D%22net%22%2C%20ACTION%3D%3D%22add%22%2C%20RUN%7Bprogram%7D%2B%3D%22/bin/bash%20-c%20%27for%20x%20in%20/sys/%24DEVPATH/queues/rx-%2A%3B%20do%20echo%208192%20%3E%20%24x/rps_flow_cnt%3B%20%20done%27%22%0A
            filesystem: root
            mode: 0644
            path: /etc/udev/rules.d/70-persistent-net.rules
          - contents:
              source: data:text/plain;charset=US-ASCII,%23%20define%20sock%20flow%20enbtried%20for%20%20Receive%20Flow%20Steering%20%28RFS%29%0Anet.core.rps_sock_flow_entries%3D8192%0A
            filesystem: root
            mode: 0644
            path: /etc/sysctl.d/95-enable-rps.conf
  2. 创建 MCO 配置文件

    $ oc create -f enable-rfs.yaml
  3. 验证是否列出了名为50-enable-rfs的条目

    $ oc get mc
  4. 要停用,请输入

    $ oc delete mc 50-enable-rfs

网络堆栈是像 OpenShift Container Platform 这样的基于 Kubernetes 的产品最重要的组件之一。对于 IBM Z® 设置,网络设置取决于您选择的虚拟机管理程序。根据工作负载和应用程序的不同,最佳方案通常会随着用例和流量模式的变化而变化。

根据您的设置,请考虑以下最佳实践

  • 考虑所有关于网络设备的选项以优化您的流量模式。探索 OSA-Express、RoCE Express、HiperSockets、z/VM VSwitch、Linux Bridge (KVM) 等的优势,以决定哪个选项最能使您的设置受益。

  • 始终使用最新的可用网卡版本。例如,与 OSA Express 6S 10 GbE 相比,OSA Express 7S 10 GbE 在事务型工作负载类型方面显示出显著的改进,尽管两者都是 10 GbE 适配器。

  • 每个虚拟交换机都会增加一层额外的延迟。

  • 负载均衡器在集群外部的网络通信中起着重要的作用。如果这对您的应用程序至关重要,请考虑使用生产级硬件负载均衡器。

  • OpenShift Container Platform OVN-Kubernetes 网络插件引入了流量和规则,这会影响网络性能。确保考虑 Pod 亲和性和放置,以受益于服务在通信至关重要的位置的局部性。

  • 平衡性能和功能之间的权衡。

DASD 和 ECKD 设备是 IBM Z® 环境中常用的磁盘类型。在 z/VM 环境中典型的 OpenShift Container Platform 设置中,DASD 磁盘通常用于支持节点的本地存储。您可以设置 HyperPAV 别名设备以提高 DASD 磁盘的吞吐量和整体 I/O 性能,这些磁盘支持 z/VM 客户机。

对本地存储设备使用 HyperPAV 会带来显著的性能优势。但是,您必须意识到吞吐量和 CPU 成本之间的权衡。

对于使用全包小磁盘的基于 z/VM 的 OpenShift Container Platform 设置,您可以通过在所有节点中激活 HyperPAV 别名来利用 MCO 配置文件的优势。您必须为控制平面节点和计算节点添加 YAML 配置。

步骤
  1. 将以下 MCO 示例配置文件复制到控制平面节点的 YAML 文件中。例如,05-master-kernelarg-hpav.yaml

    $ cat 05-master-kernelarg-hpav.yaml
    apiVersion: machineconfiguration.openshift.io/v1
    kind: MachineConfig
    metadata:
      labels:
        machineconfiguration.openshift.io/role: master
      name: 05-master-kernelarg-hpav
    spec:
      config:
        ignition:
          version: 3.1.0
      kernelArguments:
        - rd.dasd=800-805
  2. 将以下 MCO 示例配置文件复制到计算节点的 YAML 文件中。例如,05-worker-kernelarg-hpav.yaml

    $ cat 05-worker-kernelarg-hpav.yaml
    apiVersion: machineconfiguration.openshift.io/v1
    kind: MachineConfig
    metadata:
      labels:
        machineconfiguration.openshift.io/role: worker
      name: 05-worker-kernelarg-hpav
    spec:
      config:
        ignition:
          version: 3.1.0
      kernelArguments:
        - rd.dasd=800-805

    您必须修改rd.dasd参数以适应设备 ID。

  3. 创建 MCO 配置文件

    $ oc create -f 05-master-kernelarg-hpav.yaml
    $ oc create -f 05-worker-kernelarg-hpav.yaml
  4. 要停用,请输入

    $ oc delete -f 05-master-kernelarg-hpav.yaml
    $ oc delete -f 05-worker-kernelarg-hpav.yaml

优化 KVM 虚拟服务器环境很大程度上取决于虚拟服务器的工作负载和可用资源。在一个环境中增强性能的操作在另一个环境中可能会产生不利影响。为特定设置找到最佳平衡可能具有挑战性,并且通常需要实验。

以下部分介绍在 IBM Z® 和 IBM® LinuxONE 环境中使用 OpenShift Container Platform 和 RHEL KVM 时的一些最佳实践。

要使虚拟块设备使用 I/O 线程,必须为虚拟服务器配置一个或多个 I/O 线程,并使每个虚拟块设备使用这些 I/O 线程之一。

以下示例指定<iothreads>3</iothreads> 来配置三个 I/O 线程,其连续的十进制线程 ID 为 1、2 和 3。iothread="2" 参数指定磁盘设备的驱动程序元素使用 ID 为 2 的 I/O 线程。

I/O 线程规范示例
...
<domain>
 	<iothreads>3</iothreads>(1)
  	 ...
    	<devices>
       ...
          <disk type="block" device="disk">(2)
<driver ... iothread="2"/>
    </disk>
       ...
    	</devices>
   ...
</domain>
1 I/O 线程的数量。
2 磁盘设备的驱动程序元素。

线程可以提高磁盘设备 I/O 操作的性能,但它们也会使用内存和 CPU 资源。您可以配置多个设备使用相同的线程。线程与设备的最佳映射取决于可用资源和工作负载。

从少量 I/O 线程开始。通常,所有磁盘设备使用单个 I/O 线程就足够了。不要配置超过虚拟 CPU 数量的线程,也不要配置空闲线程。

您可以使用virsh iothreadadd命令向正在运行的虚拟服务器添加具有特定线程 ID 的 I/O 线程。

只有当您需要通过 SCSI 特定接口访问设备时,才配置虚拟 SCSI 设备。无论主机上的后备存储是什么,都应将磁盘空间配置为虚拟块设备,而不是虚拟 SCSI 设备。

但是,您可能需要 SCSI 特定接口用于:

  • 主机上连接 SCSI 的磁带驱动器的 LUN。

  • 安装在虚拟 DVD 驱动器上的主机文件系统上的 DVD ISO 文件。

将磁盘设备配置为由客户机而不是主机进行缓存。

确保磁盘设备的驱动程序元素包含cache="none"io="native"参数。

<disk type="block" device="disk">
    <driver name="qemu" type="raw" cache="none" io="native" iothread="1"/>
...
</disk>

除非您需要动态内存大小,否则不要定义内存气球设备,并确保 libvirt 不会为您创建一个。将memballoon参数包含在域配置 XML 文件的 devices 元素中。

  • 检查活动配置文件列表

    <memballoon model="none"/>

除非您是了解其含义的专家,否则不要更改调度程序设置。不要在未经测试并确认其具有预期效果的情况下将更改应用于生产系统。

kernel.sched_migration_cost_ns参数指定以纳秒为单位的时间间隔。在任务最后一次执行之后,CPU 缓存被认为具有有用的内容,直到此间隔过期。增加此间隔会减少任务迁移次数。默认值为 500000 ns。

如果存在可运行进程时 CPU 空闲时间高于预期,请尝试缩短此间隔。如果任务在 CPU 或节点之间频繁切换,请尝试增加它。

要动态将间隔设置为 60000 ns,请输入以下命令:

# sysctl kernel.sched_migration_cost_ns=60000

要永久更改值为 60000 ns,请将以下条目添加到/etc/sysctl.conf

kernel.sched_migration_cost_ns=60000

此设置仅适用于具有 cgroups 版本 1 的 KVM 主机。要在主机上启用 CPU 热插拔,请禁用 cgroup 控制器。

步骤
  1. 使用您选择的编辑器打开/etc/libvirt/qemu.conf

  2. 转到cgroup_controllers行。

  3. 复制整行,并从副本中删除开头的数字符号 (#)。

  4. 删除cpuset条目,如下所示:

    cgroup_controllers = [ "cpu", "devices", "memory", "blkio", "cpuacct" ]
  5. 要使新设置生效,您必须重新启动 libvirtd 守护程序。

    1. 停止所有虚拟机。

    2. 运行以下命令:

      # systemctl restart libvirtd
    3. 重新启动虚拟机。

此设置在主机重启后仍然有效。

当虚拟 CPU 变为空闲时,KVM 会在分配主机资源之前轮询虚拟 CPU 的唤醒条件。您可以在/sys/module/kvm/parameters/halt_poll_ns的 sysfs 中指定轮询发生的时间间隔。在此指定时间内,轮询会以资源使用为代价来减少虚拟 CPU 的唤醒延迟。根据工作负载,较长或较短的轮询时间可能更有益。时间间隔以纳秒为单位指定。默认为 50000 ns。

  • 为了优化低 CPU 功耗,请输入一个较小的值或写入 0 以禁用轮询。

    # echo 0 > /sys/module/kvm/parameters/halt_poll_ns
  • 为了优化低延迟,例如对于事务性工作负载,请输入一个较大的值。

    # echo 80000 > /sys/module/kvm/parameters/halt_poll_ns