6

这只是在远程 Dask kubernetes 集群中重现内存泄漏问题的最小测试示例。

def load_geojson(pid):
    import requests
    import io
    r = requests.get("https://github.com/datasets/geo-countries/raw/master/data/countries.geojson")
    temp = r.json()
    import sys
    size_temp = sys.getsizeof(temp)
    del temp
    return size_temp

L_geojson = client.map(load_geojson, range(200))

del L_geojson

观察:工作内存(字节存储)在每次运行时稳定增加约 30 MB,并不断增加,直到使用整个内存。我用 urllib 尝试的另一个测试,我观察到每次运行时内存随机增加和减少。

期望行为:删除引用 L_geojson 后应清理内存。

有人可以帮忙解决这个内存泄漏问题吗?

4

2 回答 2

1

我也试过你的代码,fsspec但看不到任何重大变化。我正在用更简单的代码观察这种效果,如 GIF 所示。(随着时间的推移,在 Dask JL 仪表板扩展中为某些事情提供一个简单的线图小部件会很有帮助,而不是动态条形图。)

Dask 内存问题 GIF

我想知道对于长期运行的集群和应用程序来说,这在实践中有多少是一个问题?我知道您可以重新启动集群,但我不知道这是否可以以某种智能方式完成,例如定期在没有任务运行和/或尚未安排时。我想知道人们推荐了什么?

事实上,我发现这个“终身”选项可能在实践中有效,尽管运行时解决方案也会很好:内存清理 Dask 工作人员。我想知道在 Tera/PB 规模的大型集群安装中如何处理这个问题?

于 2020-09-25T06:52:06.037 回答
1

我可以确认内存增加和“最近完全垃圾回收占用了 X% CPU 时间”消息。如果我允许期货运行,内存也会增加,但速度会更慢。

使用fsspec没有这个问题,正如你发现的那样urllib,这是 Dask 通常用于其 IO 的(fsspec从用于通信切换requests到使用aiohttp)。

您修改后的功能可能看起来像

def load_geojson(pid):
    import fsspec
    import json
    fs = fsspec.filesystem("http"). # or use fsspec.open
    r = fs.cat("https://github.com/datasets/geo-countries/raw/master/data/countries.geojson"). # get bytes
    temp = json.loads(r)
    import sys
    size_temp = sys.getsizeof(temp)
    del temp
    return size_temp

但是您仍然会收到垃圾收集警告。

于 2020-09-24T16:59:59.907 回答