达到内存限制的 80% 时,Dask 分布式工作线程会停止

Dask distributed workers stall when reaching 80% of memory limit

我在 Dask worker 上遇到内存泄漏问题。 每当其中一个工作人员达到其内存限制的 80% 时,他们就会停止并且不再计算任何东西:

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

这是对 worker 及其内存限制等的简单 top 式概述。 如您所见,worker 1、2 和 3 的使用率较低 CPU (~ 5%) 并存储 6GB 内存。 IE。他们达到了 80% 的内存限制并且不接受任何新任务。

设置 lifetime="20 mintues", lifetime_restart=True 会有所帮助,因为它会不时地重新启动 worker。 然而,当一个 worker 很快达到内存限制时,它只会停止大约 20 分钟,直到它重新启动。

有没有更好的方法可以更早地重启worker? 我不想过多地降低生命周期,因为长时间的 运行 任务可能无法完成。

恕我直言,最佳策略如下:

  1. 工人完成(long-运行)任务
  2. 工作人员检查存储项目的大小是否 << 总内存使用量
  3. Worker 优雅地自行重启

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

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