KubeRay 内存和可扩展性基准测试#

架构#

基准架构

这种架构不是一个好的实践,但它可以满足当前的需求。

准备#

克隆 KubeRay 仓库 并检出 master 分支。本教程需要仓库中的几个文件。

步骤 1:创建一个新的 Kubernetes 集群#

创建一个启用了自动伸缩的GKE集群。以下命令在Google GKE上创建一个名为kuberay-benchmark-cluster的Kubernetes集群。该集群可以扩展到16个节点,每个类型为e2-highcpu-16的节点有16个CPU和16 GB的内存。以下实验可能会在Kubernetes集群中创建多达~150个Pod,每个Ray Pod需要1个CPU和1 GB的内存。

gcloud container clusters create kuberay-benchmark-cluster \
    --num-nodes=1 --min-nodes 0 --max-nodes 16 --enable-autoscaling \
    --zone=us-west1-b --machine-type e2-highcpu-16

步骤 2: 安装 Prometheus 和 Grafana#

# Path: kuberay/
./install/prometheus/install.sh

按照 prometheus-grafana.md 中的 “步骤 2:通过 Helm 图表安装 Kubernetes Prometheus 堆栈” 来安装 kube-prometheus-stack v48.2.1 图表及相关自定义资源。

步骤 3:安装 KubeRay 操作员#

按照 此文档 通过 Helm 仓库安装最新稳定版本的 KubeRay 操作员。

步骤 4:运行实验#

  • 步骤 4.1:确保 kubectl CLI 可以连接到您的 GKE 集群。如果不能,运行 gcloud auth login

  • 步骤 4.2:运行实验。

    # You can modify `memory_benchmark_utils` to run the experiment you want to run.
    # (path: benchmark/memory_benchmark/scripts)
    python3 memory_benchmark_utils.py | tee benchmark_log
    
  • 步骤 4.3:按照 prometheus-grafana.md 访问 Grafana 的仪表板。

    • 登录到 Grafana 仪表板。

    • 点击“仪表板”。

    • 选择“Kubernetes / 计算资源 / Pod”。

    • 找到 KubeRay 操作符 Pod 的“内存使用”面板。

    • 选择时间范围,然后点击“检查”,接着点击“数据”以下载 KubeRay 操作符 Pod 的内存使用数据。

  • 步骤 4.4:删除所有 RayCluster 自定义资源。

    kubectl delete --all rayclusters.ray.io --namespace=default
    
  • 步骤 4.5:对其他实验重复步骤 4.2 到步骤 4.4。

实验#

此基准测试基于三个基准实验:

  • 实验1:启动一个带有1个头节点且没有工作节点的RayCluster。每20秒启动一个新的集群,直到总共有150个RayCluster自定义资源。

  • 实验2:创建一个Kubernetes集群,仅包含1个RayCluster。每60秒向该RayCluster添加5个新的工作Pod,直到总数达到150个Pod。

  • 实验3:每60秒创建一个5节点(1个头节点 + 4个工作节点)的RayCluster,最多创建30个RayCluster自定义资源。

基于 调查 针对 KubeRay 用户的调查,基准目标设定为 150 个 Ray Pod,以覆盖大多数使用场景。

实验结果 (KubeRay v0.6.0)#

基准测试结果

  • 你可以通过运行以下命令生成上述图形:

    # (path: benchmark/memory_benchmark/scripts)
    python3 experiment_figures.py
    # The output image `benchmark_result.png` will be stored in `scripts/`.
    
  • 如图所示,KubeRay 操作员 Pod 的内存使用量与 Kubernetes 集群中的 Pod 数量高度正相关。此外,Kubernetes 集群中的自定义资源数量对内存使用量没有显著影响。

  • 注意,x轴的“Pod数量”是指创建的Pod数量,而不是正在运行的Pod数量。如果Kubernetes集群没有足够的计算资源,GKE Autopilot会将一个新的Kubernetes节点添加到集群中。这个过程可能需要几分钟,因此在此过程中可能会有一些Pod处于挂起状态。这种延迟可能会解释为什么内存使用率有些受限。