优化环境性能和费用

Cloud Composer 1 | Cloud Composer 2

本页介绍如何根据项目的需求调整环境的规模和性能参数,以便提高性能并降低环境未使用的资源费用。

有关伸缩和优化的其他页面:

优化过程概览

更改环境参数可能会影响环境性能的许多方面。我们建议您在迭代中优化您的环境:

  1. 从环境预设开始。
  2. 运行您的 DAG。
  3. 观察环境的性能。
  4. 调整环境规模和性能参数,然后重复上一步。

从环境预设开始

在 Google Cloud 控制台中创建环境时,您可以从三个环境预设中选择一个。这些预设设置环境的初始规模和性能配置:创建环境后,您可以更改预设提供的所有规模和性能参数。

我们建议根据以下估算值从其中一个预设开始:

  • 您计划在环境中部署的 DAG 总数
  • DAG 并发运行数上限
  • 并发任务数上限

您的环境性能取决于您环境中运行的具体 DAG 的实现。下表列出了基于平均资源消耗量的估算值。如果您预计 DAG 会消耗更多资源,请相应地调整估算值。

推荐的预设 DAG 总数 DAG 并发运行数上限 并发任务数上限
50 15 18
250 60 100
1000 250 400

例如,环境必须运行 40 个 DAG。所有 DAG 必须同时运行,每个 DAG 对应一个活跃任务。然后,此环境将使用中等预设,因为 DAG 并发运行数和任务数上限超过了小型预设的建议估算值。

运行您的 DAG

创建环境后,将您的 DAG 上传到该环境。运行您的 DAG 并观察环境的性能。

我们建议您按反映 DAG 实际应用的时间表运行 DAG。例如,如果您要同时运行多个 DAG,请确保在所有这些 DAG 同时运行时检查环境的性能。

观察环境的性能

本部分重点介绍最常见的 Cloud Composer 2 容量和性能优化方面。我们建议逐步按照本指南操作,因为本指南会首先介绍最常见的性能考虑因素。

转到 Monitoring 信息中心

您可以在环境的 Monitoring 信息中心上监控环境的性能指标。

要转到环境的 Monitoring 信息中心,请执行以下操作:

  1. 在 Google Cloud 控制台中,前往环境页面。

    转到“环境”

  2. 点击您的环境的名称。

  3. 转到监控标签页。

监控调度器 CPU 和内存指标

Airflow 调度器的 CPU 和内存指标可帮助您检查调度器的性能是否是 Airflow 整体性能的瓶颈。

Ariflow 调度器图表
图 1. Airflow 调度器图表(点击可放大)

在 Monitoring 信息中心的调度器部分中,观察环境的 Airflow 调度器图表:

  • 调度器的 CPU 总使用率
  • 调度器内存总用量

根据您的观察结果进行调整:

监控所有 DAG 文件的总解析时间

调度器会在安排 DAG 运行之前解析 DAG。如果 DAG 需要很长时间才能解析,这会占用调度器的容量,并且可能会降低 DAG 运行的性能。

DAG 解析总时间图表
图 2. DAG 解析时间图表(点击可放大)

在 Monitoring 信息中心的 DAG 统计信息部分中,查看总 DAG 解析时间的图表。

如果此数字超过约 10 秒,则调度器可能因 DAG 解析而过载,因而无法有效运行 DAG。Airflow 中的默认 DAG 解析频率为 30 秒;如果 DAG 解析时间超过此阈值,则解析周期开始重叠,然后耗尽调度器的容量。

根据您的观察结果,您可能需要执行以下操作:

监控工作器 pod 逐出

当环境集群中的特定 pod 达到其资源限制时,可能会发生 pod 逐出。

工作器 pod 逐出图表
图 3. 显示工作器 pod 逐出的图表(点击可放大)

如果 Airflow 工作器 pod 被逐出,则该 pod 上运行的所有任务实例都会中断,之后被 Airflow 标记为失败。

工作器 pod 逐出的大多数问题都是因为工作器中出现内存不足的情况导致的。

在 Monitoring 信息中心的工作器部分中,观察环境的工作器 pod 逐出图表。

工作器内存总用量图表显示了环境的总体情况。即使内存利用率在环境级别运行状况良好,单个工作器仍可超过内存限制。

根据您的观察结果,您可能需要执行以下操作:

  • 增加工作器可用的内存
  • 减少工作器并发数量。这样,单个工作器一次处理的任务就会减少。这可以为每项任务提供更多内存或存储空间。如果更改工作器并发数量,则可能还需要增加工作器数量上限。这样,您的环境可一次处理的任务数量就会保持不变。例如,如果将工作器并发数量从 12 减少到 6,您可能需要将工作器数量上限加倍。

监控活跃工作器数

您的环境中的工作器数量会自动根据队列中的任务进行扩缩。

活跃工作器数图表和已加入队列的任务数图表
图 4. 活跃工作器数图表和已加入队列的任务数图表(点击可放大)

在 Monitoring 信息中心的工作器部分中,观察活跃工作器数图表和队列中的任务数图表:

  • 活跃工作器数
  • Airflow 任务

根据您的观察结果进行调整:

  • 如果环境频繁达到工作器数量上限,同时 Celery 队列中的任务数量持续如此高,您可能需要增加工作器数量上限
  • 如果任务间调度延迟较长,但环境没有纵向扩容到其工作器数上限,则 Airflow 设置可能会限制执行并阻止 Cloud Composer 机制扩缩环境。由于 Cloud Composer 2 环境会根据 Celery 队列中的任务数量进行扩缩,因此请将 Airflow 配置为在任务传入队列时不限制任务:

    • 提高工作器并发数。工作器并发数必须设置为比预期并发任务数上限除以环境中的工作器数量上限所获结果大的一个值。
    • 提高 DAG 并发数,如果单个 DAG 并行运行大量任务,则可能导致每个 DAG 达到运行任务实例数上限。
    • 增加每个 DAG 的最大活跃运行数,如果多次并行运行同一 DAG,则会导致 Airflow 限制执行,因为已达到每个 DAG 的最大活跃运行数限制。

监控工作器的 CPU 和内存用量

监控环境中所有工作器的 CPU 总使用率和内存总用量,以确定 Airflow 工作器是否适当地使用了环境的资源。

工作器的 CPU 和内存图表
图 5. 工作器的 CPU 和内存图表(点击可放大)

在 Monitoring 信息中心的工作器部分中,观察 Airflow 工作器的 CPU 和内存用量图表:

  • 工作器 CPU 总使用率
  • 工作器内存总用量

这些图表示汇总的资源使用情况;即使聚合视图显示容量空闲,各个工作器可能仍会达到其容量限制。

根据您的观察结果进行调整:

  • 如果工作器内存用量接近此限制,则可能会导致工作器 pod 逐出。要解决此问题,请增加工作器内存
  • 如果内存用量与限制相比是最小的,并且没有工作器 pod 逐出,您可能需要减少工作器内存
  • 如果工作器 CPU 使用率接近限制(持续时间超过总时间的 80% 以上),您可能需要执行以下操作:

监控正在运行和已加入队列的任务数

您可以监控已加入队列和正在运行的任务数量,以检查调度过程的效率。

显示正在运行和已加入队列的任务数的图表
图 6. 显示正在运行和已加入队列的任务数的图表(点击可放大)

在 Monitoring 信息中心的工作器部分,查看环境的 Airflow 任务图表。

队列中的任务正在等待工作器执行。如果您的环境中有任务已排入队列,则可能意味着环境中的工作器正在执行其他任务。

某些队列始终存在于环境中,尤其是在处理高峰期间。但是,如果您发现已加入队列的任务数量过多,或者图表中呈现上升趋势,则可能表示工作器没有足够的容量来处理任务,或者 Airflow 正在限制任务的执行。

当正在运行的任务数也达到最高级别时,通常会观察到已加入队列的任务数量非常多。

要同时解决这两个问题,请执行以下操作:

监控数据库 CPU 和内存用量

Airflow 数据库性能问题可能会导致整体 DAG 执行问题。数据库磁盘使用量通常不是问题的根源,因为存储空间会根据需要自动扩展。

数据库 CPU 和内存图表
图 7. 数据库 CPU 和内存图表(点击可放大)

在 Monitoring 信息中心的工作器部分中,观察 Airflow 数据库的 CPU 和内存用量图表:

  • 数据库 CPU 使用率
  • 数据库内存用量

如果数据库 CPU 使用率超过 80% 并且持续时间超过总时间的一定百分比,则表示数据库过载并需要扩缩。

数据库大小设置由环境的环境大小属性控制。要扩缩数据库,请将环境大小更改为其他层级(小、中或大)。增加环境大小会增加环境的费用。

监控任务调度延迟时间

如果任务之间的延迟时间超过预期水平(例如,20 秒或更长),则可能表示环境无法处理由 DAG 运行生成的任务负载。

任务延迟时间图表(Airflow 界面)
图 8. 任务延迟时间图表,Airflow 界面(点击可放大)

您可以在环境的 Airflow 界面中查看任务调度的延迟时间图表。

在此示例中,延迟时间(2.5 和 3.5 秒)明显在可接受的限制范围内,但明显较高的延迟时间可能表明:

监控网络服务器 CPU 和内存

Airflow 网络服务器性能会影响 Airflow 界面。网络服务器过载的情况不常见。如果发生这种情况,Airflow 界面性能可能会降低,但这不会影响 DAG 运行的性能。

网络服务器 CPU 和内存图表
图 9. 网络服务器 CPU 和内存图表(点击可放大)

在 Monitoring 信息中心的网络服务器部分中,观察 Airflow 网络服务器的图表:

  • 网络服务器 CPU 使用率
  • 网络服务器内存用量

根据您的观察结果:

调整环境的规模和性能参数

更改调度器的数量

调整调度器的数量可提高调度器的容量并增强 Airflow 调度的弹性。

如果您增加调度器的数量,则进出 Airflow 数据库的流量会增加。在大多数情况下,我们建议使用两个 Airflow 调度器。只有在需要特别注意的极少数情况下,才需要使用两个以上的调度器。

如需加快时间安排,请执行以下操作:

示例:

控制台

按照调整调度器数量中的步骤,为您的环境设置所需的调度器数量。

gcloud

按照调整调度器数量中的步骤,为您的环境设置所需的调度器数量。

以下示例将调度器的数量设置为 2:

gcloud composer environments update example-environment \
    --scheduler-count=2

Terraform

按照调整调度器数量中的步骤,为您的环境设置所需的调度器数量。

以下示例将调度器的数量设置为 2:

resource "google_composer_environment" "example-environment" {

  # Other environment parameters

  config {
    workloads_config {
      scheduler {
        count = 2
      }
    }
  }
}

更改调度器的 CPU 和内存

CPU 和内存参数适用于环境中的每个调度器。例如,如果您的环境有两个调度器,则总容量将是 CPU 和内存指定量的两倍。

控制台

按照调整工作器、调度器和网络服务器的规模和性能参数中的步骤,为调度器设置 CPU 和内存。

gcloud

按照调整工作器、调度器和网络服务器的规模和性能参数中的步骤,为调度器设置 CPU 和内存。

以下示例会更改调度器的 CPU 和内存。您只能根据需要指定 CPU 或内存属性。

gcloud composer environments update example-environment \
  --scheduler-cpu=0.5 \
  --scheduler-memory=3.75

Terraform

按照调整工作器、调度器和网络服务器的规模和性能参数中的步骤,为调度器设置 CPU 和内存。

以下示例会更改调度器的 CPU 和内存。您可以根据需要省略 CPU 或内存属性。

resource "google_composer_environment" "example-environment" {

  # Other environment parameters

  config {
    workloads_config {
      scheduler {
        cpu = "0.5"
        memory_gb = "3.75"
      }
    }
  }
}

更改工作器数量上限

增加工作器数量上限后,您的环境即可根据需要自动扩充更多工作器。

减少工作器数量上限会降低环境的最大容量,但也可能会有助于降低环境费用。

示例:

控制台

按照调整工作器数量下限和上限中的步骤设置环境所需的工作器数量上限。

gcloud

按照调整工作器数量下限和上限中的步骤设置环境所需的工作器数量上限。

以下示例将工作器数量上限设置为 6:

gcloud composer environments update example-environment \
    --max-workers=6

Terraform

按照调整工作器数量下限和上限中的步骤设置环境所需的工作器数量上限。

以下示例将调度器数量上限设置为 6:

resource "google_composer_environment" "example-environment" {

  # Other environment parameters

  config {
    workloads_config {
      worker {
        max_count = "6"
      }
    }
  }
}

更改工作器 CPU 和内存

  • 当工作器用量图表指示内存利用率非常低时,减少工作器内存会很有帮助。

  • 增加工作器内存后,工作器可以同时处理更多任务或处理内存密集型任务。它可以解决工作器 pod 逐出的问题。

  • 当工作器 CPU 用量图表指示 CPU 资源过度分配时,减少工作器 CPU 非常有用。

  • 增加工作器 CPU 后,工作器可以并行处理更多任务,在某些情况下,还可减少处理这些任务所需的时间。

更改工作器 CPU 或内存会重启工作器,这可能会影响正在运行的任务。我们建议在没有运行 DAG 时执行此操作。

CPU 和内存参数属于环境中的每个工作器。例如,如果您的环境有四个工作器,则总容量是 CPU 和内存指定量的四倍。

控制台

按照调整工作器、调度器和网络服务器的规模和性能参数中的步骤,为工作器设置 CPU 和内存。

gcloud

按照调整工作器、调度器和网络服务器的规模和性能参数中的步骤,为工作器设置 CPU 和内存。

以下示例会更改工作器的 CPU 和内存。如果需要,您可以省略 CPU 或内存特性。

gcloud composer environments update example-environment \
  --worker-memory=3.75 \
  --worker-cpu=2

Terraform

按照调整工作器、调度器和网络服务器的规模和性能参数中的步骤,为工作器设置 CPU 和内存。

以下示例会更改工作器的 CPU 和内存。如果需要,您可以省略 CPU 或内存参数。

resource "google_composer_environment" "example-environment" {

  # Other environment parameters

  config {
    workloads_config {
      worker {
        cpu = "2"
        memory_gb = "3.75"
      }
    }
  }
}

更改网络服务器的 CPU 和内存

当网络服务器用量图表指示网络服务器 CPU 或内存利用率持续过低时,减少该网络服务器的 CPU 或内存会很有帮助。

更改网络服务器参数会重启网络服务器,这会导致网络服务器临时停机。我们建议您在常规使用时段之外进行更改。

控制台

按照调整工作器、调度器和网络服务器的规模和性能参数中的步骤为网络服务器设置 CPU 和内存。

gcloud

按照调整工作器、调度器和网络服务器的规模和性能参数中的步骤为网络服务器设置 CPU 和内存。

以下示例将更改网络服务器的 CPU 和内存。您可以根据需要省略 CPU 或内存属性。

gcloud composer environments update example-environment \
    --web-server-cpu=2 \
    --web-server-memory=3.75

Terraform

按照调整工作器、调度器和网络服务器的规模和性能参数中的步骤为网络服务器设置 CPU 和内存。

以下示例将更改网络服务器的 CPU 和内存。您可以根据需要省略 CPU 或内存属性。

resource "google_composer_environment" "example-environment" {

  # Other environment parameters

  config {
    workloads_config {
      web_server {
        cpu = "2"
        memory_gb = "3.75"
      }
    }
  }
}

更改环境大小

更改环境大小会修改 Cloud Composer 后端组件(例如 Airflow 数据库和 Airflow 队列)的容量。

  • 当数据库用量指标显示利用率过低时,请考虑将环境大小更改为较小的大小(例如,大改为中,或中改为小)。
  • 如果您发现 Airflow 数据库的利用率较高,请考虑增加环境大小。

控制台

按照调整环境大小中的步骤设置环境大小。

gcloud

按照调整环境大小中的步骤设置环境大小。

以下示例将环境大小更改为“中”。

gcloud composer environments update example-environment \
    --environment-size=medium

Terraform

按照调整环境大小中的步骤设置环境大小。

以下示例将环境大小更改为“中”。

resource "google_composer_environment" "example-environment" {

  # Other environment parameters

  config {
    environment_size = "medium"
  }
}

更改 DAG 目录列举间隔

增加 DAG 目录列举间隔可以减少与环境存储桶中发现新 DAG 相关的调度器负载。

  • 如果您不经常部署新的 DAG,请考虑延长此间隔。
  • 如果您希望 Airflow 更快地响应新部署的 DAG 文件,请考虑缩短此间隔。

如需更改此参数,请替换以下 Airflow 配置选项:

部分 Notes
scheduler dag_dir_list_interval 列表间隔的新值 默认值为 120(以秒为单位)。

更改 DAG 文件解析间隔

延长 DAG 文件解析间隔可以减少与 DAG 包中 DAG 的持续解析相关的调度器负载。

如果您有大量 DAG,但 DAG 不经常更改,或通常观察到较高的调度器负载,请考虑延长此间隔。

如需更改此参数,请替换以下 Airflow 配置选项:

部分 Notes
scheduler min_file_process_interval DAG 解析间隔的新值 默认值为 30(以秒为单位)。

工作器并发

并发性能和环境的自动扩缩能力与以下两项设置有关:

  • Airflow 工作器数量下限
  • [celery]worker_concurrency 参数

Cloud Composer 提供的默认值对大多数用例来说是最佳的,但自定义调整可能会对您的环境有利。

工作器并发性能注意事项

[celery]worker_concurrency 参数定义了单个工作器可以从任务队列中选择的任务数量。任务执行速度取决于多种因素,例如工作器 CPU、内存以及工作类型本身。

工作器自动扩缩

Cloud Composer 会监控任务队列,并生成其他工作器以拾取任何正在等待的任务。将 [celery]worker_concurrency 设置为较高值意味着每个工作器可以处理大量任务,因此在某些情况下,队列可能永远不会填满,导致自动扩缩永远无法触发。

例如,如果 Cloud Composer 环境中有两个 Airflow 工作器,[celery]worker_concurrency 设置为 100,队列中有 200 个任务,则每个工作器将选择 100 个任务。这会使队列为空,并且不会触发自动扩缩。如果这些任务需要很长时间才能完成,则可能会导致性能问题。

但是,如果任务较小且可以快速执行,则 [celery]worker_concurrency 设置中的值较高可能会导致过度伸缩。例如,如果该环境的队列中有 300 个任务,则 Cloud Composer 会开始创建新工作器。但是,如果在新工作器准备就绪时前 200 个任务完成了执行,则现有工作器可以开始执行这些任务。最终结果是自动扩缩会创建新工作器,但它们没有任何任务。

针对特殊情况调整 [celery]worker_concurrency 时,应根据任务执行时间和队列编号:

  • 对于需要较长时间才能完成的任务,工作器应该无法完全清空队列。
  • 对于更快、更小的任务,请增加 Airflow 工作器的最小数量,以避免过度伸缩。

任务日志同步

Airflow 工作器具有一个可将任务执行日志同步到 Cloud Storage 存储分区的组件。如果单个工作器执行大量并发任务,则会产生大量同步请求。这可能会使工作器过载,并导致性能问题。

如果您发现由于日志同步流量过多而导致性能问题,请降低 [celery]worker_concurrency 值并调整 Airflow 工作器数量下限。

更改工作器并发数

更改此参数可调整单个工作器可以同时执行的任务量。

例如,具有 0.5 个 CPU 的工作器通常可以处理 6 个并发任务;具有三个此类工作器的环境最多可以处理 18 个并发任务。

  • 当队列中有任务在等待,同时工作器在使用一小部分 CPU 和内存时,请提高此参数。

  • 当您在进行 pod 逐出时,降低此参数;这会减少单个工作器尝试处理的任务数量。作为替代方案,您可以增加工作器内存

工作器并发设置的默认值等于:

  • 在 Airflow 2.6.3 及更高版本中,最小值为 3212 * worker_CPU6 * worker_memory
  • 在 2.6.3 之前的 Airflow 版本中,最小值为 3212 * worker_CPU8 * worker_memory
  • 在 Airflow 2.3.3 之前的版本中,12 * worker_CPU

worker_CPU 值是分配给单个工作器的 CPU 数量。worker_memory 值是分配给单个工作器的内存量。例如,如果环境中的工作器每个工作器使用 0.5 个 CPU 和 4GB 内存,则工作器并发设置会设置为 6。工作器并发值不取决于环境中的工作器数量。

如需更改此参数,请替换以下 Airflow 配置选项:

部分
celery worker_concurrency 工作器并发数的新值

更改 DAG 并发数

DAG 并发数定义了每个 DAG 中可以同时运行的任务实例数上限。如果 DAG 运行大量并发任务,请增大此值。如果此设置较低,则调度器会延迟将更多任务放入队列,从而降低环境自动扩缩的效率。

如需更改此参数,请替换以下 Airflow 配置选项:

部分 Notes
core max_active_tasks_per_dag DAG 并发数的新值 默认值为 16

提高每个 DAG 的活跃运行数上限

此属性定义每个 DAG 的活跃 DAG 运行次数上限。如果同一 DAG 必须并发运行多次(例如,使用不同的输入参数),则此属性允许调度器并行启动此类运行。

如需更改此参数,请替换以下 Airflow 配置选项:

部分 Notes
core max_active_runs_per_dag 每个 DAG 的活跃运行数上限的新值 默认值为 25

后续步骤