5.6. 配置更高的虚拟机工作负载密度


您可以通过过量使用内存(RAM)来增加节点上的虚拟机(VM)的数量。在以下情况下,增加虚拟机工作负载密度非常有用:

  • 您有许多类似的工作负载。
  • 您有没有被充分利用的工作负载。
注意

内存过量使用可能会在高度使用的系统中降低工作负载性能。

wasp-agent 组件通过将交换资源分配给 worker 节点来实现内存过量使用。它还管理节点因高交换 I/O 流量或高利用率而面临风险时进行 pod 驱除。

如果在首次创建 HyperConverged 自定义资源(CR)时,如果 memoryOvercommitPercentage 设为 100,则会自动部署 wasp-agent 组件。

重要

交换资源只能分配给 Burstable 服务质量 (QoS) 类的虚拟机工作负载 (VM pod)。属于虚拟机的 Guaranteed QoS 类和任何 QoS 类的 pod 不能交换资源。

有关 QoS 类的描述,请参阅为 Pod 配置服务质量 (Kubernetes 文档)。

在 VM 清单中使用 spec.domain.resources.requests.memory 禁用内存过量使用配置。使用 spec.domain.memory.guest 替代。

先决条件

  • 已安装 OpenShift CLI(oc)。
  • 使用 cluster-admin 角色登录到集群。
  • 定义内存过量使用比率。
  • 节点属于 worker 池。
注意

wasp-agent 组件部署开放容器项目 (OCI) hook,以启用节点级别上容器的交换使用情况。低级性质要求 DaemonSet 对象具有特权。

流程

  1. kubelet 服务配置为允许交换使用:

    1. 使用以下示例中显示的参数创建或编辑 KubeletConfig 文件:

      apiVersion: machineconfiguration.openshift.io/v1
      kind: KubeletConfig
      metadata:
        name: custom-config
      spec:
        machineConfigPoolSelector:
          matchLabels:
            pools.operator.machineconfiguration.openshift.io/worker: ''  # MCP
            #machine.openshift.io/cluster-api-machine-role: worker # machine
            #node-role.kubernetes.io/worker: '' # node
        kubeletConfig:
          failSwapOn: false
      Copy to Clipboard Toggle word wrap
    2. 运行以下命令,等待 worker 节点与新配置同步:

      $ oc wait mcp worker --for condition=Updated=True --timeout=-1s
      Copy to Clipboard Toggle word wrap
  2. 通过创建 MachineConfig 对象来置备 swap:

    1. 使用下例中所示的 paramaters 创建 MachineConfig 文件:

      apiVersion: machineconfiguration.openshift.io/v1
      kind: MachineConfig
      metadata:
        labels:
          machineconfiguration.openshift.io/role: worker
        name: 90-worker-swap
      spec:
        config:
          ignition:
            version: 3.5.0
          systemd:
            units:
              - contents: |
                  [Unit]
                  Description=Provision and enable swap
                  ConditionFirstBoot=no
                  ConditionPathExists=!/var/tmp/swapfile
      
                  [Service]
                  Type=oneshot
                  Environment=SWAP_SIZE_MB=5000
                  ExecStart=/bin/sh -c "sudo dd if=/dev/zero of=/var/tmp/swapfile count=${SWAP_SIZE_MB} bs=1M && \
                  sudo chmod 600 /var/tmp/swapfile && \
                  sudo mkswap /var/tmp/swapfile && \
                  sudo swapon /var/tmp/swapfile && \
                  free -h"
      
                  [Install]
                  RequiredBy=kubelet-dependencies.target
                enabled: true
                name: swap-provision.service
              - contents: |
                  [Unit]
                  Description=Restrict swap for system slice
                  ConditionFirstBoot=no
      
                  [Service]
                  Type=oneshot
                  ExecStart=/bin/sh -c "sudo systemctl set-property --runtime system.slice MemorySwapMax=0 IODeviceLatencyTargetSec=\"/ 50ms\""
      
                  [Install]
                  RequiredBy=kubelet-dependencies.target
                enabled: true
                name: cgroup-system-slice-config.service
      Copy to Clipboard Toggle word wrap

      为了在出现最糟糕的情况时有足够的交换空间,请确保置备的交换空间的数量最少与过量使用 RAM 相同。使用以下公式计算节点上置备的 swap 空间量:

      NODE_SWAP_SPACE = NODE_RAM * (MEMORY_OVER_COMMIT_PERCENT / 100% - 1)
      Copy to Clipboard Toggle word wrap

      示例:

      NODE_SWAP_SPACE = 16 GB * (150% / 100% - 1)
                     = 16 GB * (1.5 - 1)
                     = 16 GB * (0.5)
                     =  8 GB
      Copy to Clipboard Toggle word wrap
    2. 运行以下命令,等待 worker 节点与新配置同步:

      $ oc wait mcp worker --for condition=Updated=True --timeout=-1s
      Copy to Clipboard Toggle word wrap
  3. 使用 Web 控制台或 CLI 在 OpenShift Virtualization 中启用内存过量使用。

    • Web 控制台

      1. 在 OpenShift Container Platform web 控制台中,进入 Virtualization Overview Settings General settings Memory density
      2. Enable memory density 设置为 on。
    • CLI

      • 配置 OpenShift Virtualization 以启用更高的内存密度并设置过量分配率:

        $ oc -n openshift-cnv patch HyperConverged/kubevirt-hyperconverged --type='json' -p='[ \
          { \
          "op": "replace", \
          "path": "/spec/higherWorkloadDensity/memoryOvercommitPercentage", \
          "value": 150 \
          } \
        ]'
        Copy to Clipboard Toggle word wrap

        成功输出:

        hyperconverged.hco.kubevirt.io/kubevirt-hyperconverged patched
        Copy to Clipboard Toggle word wrap

验证

  1. 要验证 wasp-agent 的部署,请运行以下命令:

    $ oc rollout status ds wasp-agent -n openshift-cnv
    Copy to Clipboard Toggle word wrap

    如果部署成功,则会显示以下信息:

    输出示例:

    daemon set "wasp-agent" successfully rolled out
    Copy to Clipboard Toggle word wrap
  2. 要验证是否正确置备了 swap,请完成以下步骤:

    1. 运行以下命令,查看 worker 节点列表:

      $ oc get nodes -l node-role.kubernetes.io/worker
      Copy to Clipboard Toggle word wrap
    2. 运行以下命令,从列表中选择节点并显示其内存用量:

      $ oc debug node/<selected_node> -- free -m 
      1
      Copy to Clipboard Toggle word wrap
      1
      <selected_node> 替换为节点名称。

      如果置备了交换,则 Swap: 行会显示大于零的数量。

      Expand
      表 5.1. 输出示例
       

      total

      使用的

      free

      shared

      buff/cache

      可用

      Mem:

      31846

      23155

      1044

      6014

      14483

      8690

      Swap:

      8191

      2337

      5854

         
  3. 运行以下命令验证 OpenShift Virtualization 内存过量使用配置:

    $ oc -n openshift-cnv get HyperConverged/kubevirt-hyperconverged -o jsonpath='{.spec.higherWorkloadDensity}{"\n"}'
    Copy to Clipboard Toggle word wrap

    输出示例:

    {"memoryOvercommitPercentage":150}
    Copy to Clipboard Toggle word wrap

    返回的值必须与之前配置的值匹配。

5.6.2. 删除 wasp-agent 组件

如果您不再需要内存过量使用,您可以从集群中删除 wasp-agent 组件和相关资源。

先决条件

  • 已使用 cluster-admin 角色登录到集群。
  • 已安装 OpenShift CLI(oc)。

流程

  1. 运行以下命令来恢复内存过量使用配置:

    $ oc -n openshift-cnv patch HyperConverged/kubevirt-hyperconverged \
      --type='json' \
      -p='[{"op": "remove", "path": "/spec/higherWorkloadDensity"}]'
    Copy to Clipboard Toggle word wrap
  2. 运行以下命令来删除置备交换内存的 MachineConfig

    $ oc delete machineconfig 90-worker-swap
    Copy to Clipboard Toggle word wrap
  3. 运行以下命令来删除关联的 KubeletConfig 自定义资源(CR):

    $ oc delete kubeletconfig custom-config
    Copy to Clipboard Toggle word wrap
  4. 运行以下命令,等待 worker 节点协调,并观察输出:

    $ oc wait mcp worker --for condition=Updated=True --timeout=-1s
    Copy to Clipboard Toggle word wrap

验证

  • 运行以下命令,确认节点上不再启用 swap :

    $ oc debug node/<selected_node> -- free -m
    Copy to Clipboard Toggle word wrap

    确保 Swap: 行显示 0 或没有交换空间显示为 provisioned。

5.6.3. wasp-agent 使用的 Pod 驱除条件

当系统大量加载且节点面临风险时,wasp 代理会管理 pod 驱除。如果出现以下情况之一,则驱除触发器:

高交换 I/O 流量

当与交换相关的 I/O 流量过高时,会发生此条件。

条件:

averageSwapInPerSecond > maxAverageSwapInPagesPerSecond
&&
averageSwapOutPerSecond > maxAverageSwapOutPagesPerSecond
Copy to Clipboard Toggle word wrap

默认情况下,maxAverageSwapInPagesPerSecondmaxAverageSwapOutPagesPerSecond 值是 1000 页。计算平均的默认时间间隔是 30 秒。

高 swap 使用率

当交换利用率过高时,会发生此条件,从而导致当前虚拟内存用量超过因数的阈值。MachineConfig 对象中的 NODE_SWAP_SPACE 设置可能会影响这种情况。

条件:

nodeWorkingSet + nodeSwapUsage < totalNodeMemory + totalSwapMemory × thresholdFactor
Copy to Clipboard Toggle word wrap

5.6.3.1. 环境变量

您可以使用以下环境变量来调整用于计算驱除条件的值:

Expand

环境变量

功能

MAX_AVERAGE_SWAP_IN_PAGES_PER_SECOND

设置 maxAverageSwapInPagesPerSecond 的值。

MAX_AVERAGE_SWAP_OUT_PAGES_PER_SECOND

设置 maxAverageSwapOutPagesPerSecond 的值。

SWAP_UTILIZATION_THRESHOLD_FACTOR

设置用于计算高 swap 使用率的 thresholdFactor 值。

AVERAGE_WINDOW_SIZE_SECONDS

设置计算平均交换使用量的时间间隔。

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat