【问题标题】:Dask Memory leakage issue with json and requestsjson和请求的Dask内存泄漏问题
【发布时间】:2020-09-24 12:58:12
【问题描述】:

这只是在远程 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 后应清理内存。

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

【问题讨论】:

    标签: json python-requests dask dask-distributed dask-kubernetes


    【解决方案1】:

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

    使用fsspec 没有这个问题,正如您在使用urllib 时发现的那样,这是Dask 通常用于其IO 的(fsspecrequests 切换到使用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
    

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

    【讨论】:

    • 使用fsspec,我观察到内存增长不是稳定的和陡峭的。但是,如果我们多次运行它(下面的示例),最终会使用整个内存。 for _ in range(100): L_geojson = client.map(load_geojson, range(200)) L_res = client.gather(L_geojson) del L_geojson del L_res
    • 垃圾收集应该没问题,但在多次运行执行结束时,我希望在多次运行后释放内存。
    【解决方案2】:

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

    Dask memory issue GIF

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

    事实上,我发现了这个“终身”选项,虽然运行时解决方案也很好,但它可能在实践中有效:Memory clean up of Dask workers。我想知道在 Tera-/PB 规模的大型集群安装中如何处理这个问题?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-19
      • 1970-01-01
      • 2013-08-05
      • 1970-01-01
      • 2016-07-28
      相关资源
      最近更新 更多