【问题标题】:Memory leak from a docker container with a Flask application带有 Flask 应用程序的 docker 容器的内存泄漏
【发布时间】:2019-08-09 20:43:39
【问题描述】:

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

@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 使用问题?

【问题讨论】:

  • 看起来response.text 可能是这里的问题:stackoverflow.com/questions/24656207/…
  • 尝试使用response.content(或一些虚拟内容)运行,看看是否有相同的内存泄漏?
  • eval 是邪恶的。不习惯!使用 JSON!
  • 我还没有完全意识到,如果我使用response.json()response.content 会有什么区别。显然使用response.texteval() 不是最优的,但是另外两个呢?
  • 无论如何,我删除了 evalresponse.text 并且内存泄漏消失了。如果有人发布答案,我很乐意接受。

标签: python flask


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2017-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-28
    • 2010-11-27
    • 1970-01-01
    相关资源
    最近更新 更多