![](/img/trans.png)
[英]Flask REST-API within an alpine docker container memory leak
[英]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 使用是否存在问题?
内存泄漏的问题完全是由于使用了eval
和response.text
。 切换到使用json
输出后,内存泄漏消失了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.