Очистка памяти работников Dask - PullRequest
0 голосов
/ 18 января 2020

Я выполняю несколько параллельных задач в многоузловом распределенном кластере Dask. Однако, как только задачи завершены, рабочие по-прежнему занимают большую память, и кластер скоро заполняется.

Я пробовал client.restart() после каждой задачи и client.cancel(df), первая убивает рабочих и отправляет CancelledError для других запущенных задач, которые являются проблемными и вторыми, это не очень помогло, потому что мы используем много пользовательских объектов и функций внутри функций dask map. Добавление del для известных переменных и gc.collect() также мало чем поможет.

Я уверен, что большая часть памяти удерживается из-за пользовательских функций python и объектов, вызываемых с помощью client.map(..).

Мои вопросы:

  1. Есть ли способ из командной строки или другой способ, который похож на trigger worker restart if no tasks are running right now.
  2. Если нет, каковы возможные решения к этой проблеме? Мне будет невозможно избежать пользовательских объектов и чистых python функций внутри задач Dask.

1 Ответ

1 голос
/ 18 января 2020

Если нет ссылок на фьючерсы, Dask должен удалить все ссылки на Python объектов, которые вы создали с ним. См. https://www.youtube.com/watch?v=MsnzpzFZAoQ для получения дополнительной информации о том, как это исследовать.

Если ваш пользовательский код Python действительно имеет некоторую утечку памяти, то да, вы можете попросить работников Dask периодически перезагрузите себя. См. Справочную страницу dask-worker --help и найдите ключевые слова, которые начинаются с --lifetime

...