达到80%的内存限制时,Dask分布式工作人员将停止运行

问题描述

我对dask工作者的内存泄漏有麻烦。 每当其中一个工作人员达到其内存限制的80%时,他们就会停滞并且不再进行任何计算:

Three workers stalling at 6.0GB memory usage

在这里,您可以看到四个面板:“存储的字节数”,“任务流”,“进度”和“任务处理”。 “已存储的字节数”面板显示每个工作线程占用的内存量(x轴)(y轴)。 “任务流”面板是线程(y轴)和处理任务所需的运行时的可视化(x轴)。请注意,每个工作程序都有两个线程。 “任务处理”面板显示了跨工作人员的任务分布的可视化。 dask平衡了要做的工作量,即确保工人总是有相似数量的任务要处理。 “进度”面板仅显示处理阶段以及已完成/在内存中/正在等待计算的阶段中有多少任务。

Memory and cpu profile of workers

这是工作程序及其内存限制等类似top的简单概述。 如您所见,工作线程1、2和3的cpu使用率较低(约5%),并存储6GB的内存。即他们达到了80%的内存限制,并且不接受任何新任务。

设置lifetime="20 mintues",lifetime_restart=True会有所帮助,因为它会不时重新启动worker。 但是,当一个工作人员非常快地达到内存限制时,它会停顿约20分钟,直到重新启动为止。

有一些更好的方法可以更早地重新启动工作程序吗? 我不想降低寿命,因为长时间运行的任务可能无法完成。

最好的策略是恕我直言以下内容

  1. 工作人员完成(长时间运行)任务
  2. 工作人员检查存储项目的大小是否
  3. 工作人员正常重启自己

解决方法

您要查找的策略在此处进行了描述:https://distributed.dask.org/en/latest/worker.html#memory-management

您可以删除80%冻结限制,并通过更改配置使事情更快地重新启动。这些配置值在此处记录:https://docs.dask.org/en/latest/configuration-reference.html#distributed.worker.memory.target