与芹菜执行器一起对饥饿的记忆进行测试

时间:2019-11-03 11:40:57

标签: python memory concurrency celery airflow

我们需要在一天的特定时间执行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的运行)

我了解了可以设置为geventeventlet的不同池工作程序类,以及如何重用内存,因此并非每个子工作程序都会复制其内存。我以为我找到了解决方案我需要。 但后来我尝试进行设置,但没有在工作中看到此行为-我只会看到正在执行2个并发任务(配置了gevent) 此外,我们的气流云提供商向我解释说这不是气流在起作用,并且在其基本执行器类中,它仍为每个任务创建一个子流程。 这是他给我发送的参考书https://github.com/apache/airflow/blob/919bb8c1cbb36679c02ca3f8890c300e1527c08b/airflow/task/task_runner/base_task_runner.py#L112-L142

我的问题是:

  1. 考虑到Dag首先要消耗很多内存,是否有可能扩展我们所需的方式?
  2. 与Celery执行器一起工作实际上可以使饥饿的dag运行受益。
  3. 说这是云服务提供商的权利-“这不是气流与芹菜一起工作的方式”
  4. 我听到人们同时运行数千个任务,即使导入的DAG最少,我也获得了130MB的内存使用量-如何将其扩展到数千个?

谢谢

0 个答案:

没有答案