繁体   English   中英

带有 Flask 应用程序的 docker 容器的内存泄漏

[英]Memory leak from a docker container with a Flask application

当我使用 Flask 应用程序启动多个 docker 容器时,我遇到了一个奇怪的问题。 带有应用程序的容器用于模拟目的,而不是用于生产,我只需要一种方法来允许 docker 容器相互通信,GET/POST API 调用似乎是一个很好的解决方案。 但是,这就是我的问题发生的地方,当我启动容器并启动 Flask 应用程序时,内存使用量(我用htop观察)开始增加。 只需启动 Flask 服务器,容器大小就会增加 200 MB。 老实说,我可以接受,但问题是,在每次 API 调用之后,内存使用量不断增加。 这是其中一个功能的一小段:

@app.route('/execute/step=<int:step>', methods=['GET'])
def execute(step):
    url = f'http://my_url:5000/some/api/call/step={step}'
    response = requests.get(url)
    data = eval(response.text)

    if data:
        # unimportant calculations

        if demand <= supply:
            for b in people_b:
                buyer_id = b['id']
                post_data = {some_data}
                url = f'http://my_url:5000/set_data/id={buyer_id}'
                requests.post(url, data=post_data)

            for s in people_s[:-1]:

                seller_id = s['id']
                post_data = {some_data
                             }
                url = f'http://my_url:5000/set_data/id={seller_id}'
                requests.post(url, data=post_data)

            # unimportant steps

            seller_id = local_ids[-1]['id']
            post_data = {some_data}
            url = f'http://my_url:5000/set_data/id={seller_id}'
            requests.post(url, data=post_data)

            return 'Success\n'
        else:
            for s in people_s:
                seller_id = s['id']
                post_data = {some_data}
                url = f'http://my_url:5000/set_data/id={seller_id}'
                requests.post(url, data=post_data)

            for b in people_b[:-1]:
                #unimportant steps

                buyer_id = b['id']
                post_data = {some_data}
                url = f'http://my_url:5000/set_data/id={buyer_id}'
                requests.post(url, data=post_data)

            #unimportant steps

            buyer_id = people_b[-1]['id']
            post_data = {some_data}
            url = f'http://my_url:5000/set_data/id={buyer_id}'
            requests.post(url, data=post_data)

            return 'Success\n'
    else:
        return 'No success\n'

以上是其中一种方法,我删除了一些不重要的计算步骤,但我想展示的是,还有嵌套的 API 调用。 我尝试在函数中的每次返回之前调用gc.collect() ,但是,这没有成功。

执行如此多的 API 调用时是否会出现这种行为,或者实现或 docker/Flask 使用是否存在问题?

内存泄漏的问题完全是由于使用了evalresponse.text 切换到使用json输出后,内存泄漏消失了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM