我们需要在一天的特定时间执行3000 Dag的运行。 Dag内部几乎所有的工作都在等待其他微服务执行其工作。 (例如AWS sagemaker)
但是由于我们需要的所有python导入(sagemaker,tensorflow等),我们的Dag消耗了大约250MB
我们注意到,即使在执行第一个任务之前就消耗了250MB内存。 (通过打印process.memory_full_info()
进行了检查)
我们尝试在Celery群集上运行8个并发运行,该群集具有2个工作程序(每个内存4GB)和worker_concurrency=8
,但均失败了。
工作机因OOM错误而崩溃。
深入了解这一点,我了解到气流实际上是以prefork方法工作的,这意味着它将为它发起的每个子工作人员创建其主要工作人员流程的副本。该子进程或多或少消耗了Dag消耗的内存(大约300MB),子进程之间没有共享的内存。
所以我开始寻找一种解决方案,因为除非我们投入500名员工,否则这个解决方案显然无法扩展。 (每个测试可以同时进行6个dag的运行)
我了解了可以设置为gevent
或eventlet
的不同池工作程序类,以及如何重用内存,因此并非每个子工作程序都会复制其内存。我以为我找到了解决方案我需要。
但后来我尝试进行设置,但没有在工作中看到此行为-我只会看到正在执行2个并发任务(配置了gevent)
此外,我们的气流云提供商向我解释说这不是气流在起作用,并且在其基本执行器类中,它仍为每个任务创建一个子流程。
这是他给我发送的参考书https://github.com/apache/airflow/blob/919bb8c1cbb36679c02ca3f8890c300e1527c08b/airflow/task/task_runner/base_task_runner.py#L112-L142
我的问题是:
谢谢