Airflow任务已调度但未执行,资源利用率低问题排查求助
近期我们的流水线执行时长显著飙升,排查发现Airflow任务长时间处于调度状态,多数情况下仅6-8个worker在执行任务。
环境:Airflow 2.2.1 部署于 AWS EC2(Linux)
Airflow.cfg 核心配置:
executor = LocalExecutor parallelism = 32 max_active_tasks_per_dag = 16 max_active_runs_per_dag = 16
(附任务状态、Pool状态、Worker状态截图)
已尝试的无效方案:
- 将部分任务转移至不同资源池
- 重启Airflow
现求助:是什么配置或因素导致该问题?如何调整以确保充分利用所有可用worker资源?
问题根因分析
你当前使用的LocalExecutor在单个EC2节点上通过本地进程运行任务,实际并行任务数受以下关键因素限制:
- EC2实例硬件资源:
LocalExecutor默认将max_workers设为EC2的CPU核心数(Airflow 2.2.1中该参数默认值等于CPU核心数)。若你的EC2实例是8核,最多只能同时运行8个任务,这和你观察到的6-8个worker运行的情况完全匹配,此时parallelism=32的配置会被硬件资源限制覆盖。 - 未显式配置
max_workers:你的airflow.cfg中未设置max_workers参数,LocalExecutor自动使用CPU核心数作为上限,无法达到parallelism=32的并发量。 - 资源池配额限制:若所有资源池的总配额之和小于
max_workers或parallelism,也会限制并发任务数。
解决方案
调整
max_workers配置:
在airflow.cfg中添加或修改参数:max_workers = 32注意:设置值不能超过EC2实例的CPU核心数和内存承载能力,若32超出实例资源上限,需先升级EC2实例规格。
验证资源池总配额:
确保所有资源池的Slots总和至少等于max_workers或parallelism(取较小值)。可通过Airflow UI的Admin > Pools查看并调整各池配额,例如增大default池的Slots值至与max_workers一致。检查DAG级并发限制:
当前max_active_tasks_per_dag=16、max_active_runs_per_dag=16,若仅运行1个DAG,最多只能并行16个任务,无法达到32的总并发。若有多个DAG,需确保各DAG的并发数之和不超过max_workers和parallelism的限制。切换Executor类型:
若EC2单节点资源无法满足32并发需求,建议切换为CeleryExecutor或KubernetesExecutor,实现多节点分布式任务执行,充分利用集群资源。
内容的提问来源于stack exchange,提问作者sriram926

