我正在多节点分布式Dask群集上运行多个并行任务。但是,一旦任务完成,工作人员仍会保留大量内存,并且群集很快就会被填满。
我在每个任务之后都尝试过client.restart()
,client.cancel(df)
之后,第一个杀死了工人,并将CancelledError
发送给其他正在运行的任务,这很麻烦,第二个并没有太大帮助,因为我们使用了大量的自定义对象和函数在dask的map
函数中。为已知变量添加del
和gc.collect()
也无济于事。
我确定保留的大部分内存是由于自定义的python函数和用client.map(..)
调用的对象。
我的问题是:
trigger worker restart if no tasks are running right now
的方式。如果没有对期货的引用,那么Dask应该删除对您由此创建的Python对象的所有引用。有关如何进行调查的更多信息,请参见https://www.youtube.com/watch?v=MsnzpzFZAoQ。
如果您的自定义Python代码确实有其自身的内存泄漏,那么可以,您可以要求Dask工作者定期重新启动自己。请参见dask-worker --help
手册页,并查找以--lifetime
]开头的关键字