由 gunicorn 运行的烧瓶应用程序在一段时间后被挂起



我在过去 30 天里遇到了一个独特的问题。在尝试了很多东西之后,我正在寻求社区的支持。

我使用python flask制作了一个基于深度学习的Web应用程序。后端是用python(深度学习代码)编写的,前端使用HTML,JS和Bootstrap提供服务。部署是使用 Gunicorn 完成的。此外,该应用程序已启用 https 并部署在 GCP 上。

应用程序运行正常一段时间,之后挂起。尽管 python 进程仍在运行,但它会停止服务和响应任何 API 请求。新的点击不会到达 python 代码。就运行时间而言,此行为非常随机。有时需要 4-5 小时才能停止,有时甚至需要 2 天才能停止。然后我使用 gunicorn 命令手动启动应用程序,它可以工作。

我尝试过的事情 -

  • 已使用htop检查应用程序处于挂起阶段的系统内存。但这似乎很好。
  • 我尝试使用 Jmeter 测试 API(按顺序循环命中多个请求),但系统没有挂断。
  • 我什至使用uwsgi + apache运行该应用程序,但问题仍然存在。

这是用于运行 gunicorn 服务器的命令 -

gunicorn -b 0.0.0.0:443 --threads=4 --certfile=path_to_certificate_file --keyfile=path_to_key_file server:app --max-requests 1000 --access-logfile /var/log/gunicorn/gunicorn-access.log --error-logfile /var/log/gunicorn/gunicorn-error.log --capture-output --log-level debug --logger-class=simple --daemon

我仍然无法诊断确切的问题并复制它。寻找任何要探索的特定方向。随时分享您的假设/想法。如果需要我提供任何其他信息,请告诉我,以使其进一步直观。

我也在使用 gunicorn/flask 应用程序时遇到了这个问题:

请求仅在 gunicorn 启动后的最初几分钟内加载。当单独放置几分钟时,gunicorn 会停止响应请求(浏览器会永久显示"正在加载"图标动画)。独角兽错误日志未显示任何内容。

我目前的解决方法是从客户端 html 文件创建对烧瓶应用程序的任意"保持活动"调用。

所以在 Flask 应用文件中:

@app.route('/keep_alive/<val>')
def keep_alive(val):
return json.dumps({'success':val}) 

在 html 的 JS 块中:

function keepAlive() {
var t = setTimeout(keepAlive, 60000);
var d = new Date();
var n = d.getTime();
$.getJSON(base_url + '/keep_alive/' + n.toString(), function (data) {
console.log('keep alive return ' + data)
});
} 
keepAlive();

值得一提的是,枪角兽设置--keep-alive=21600没有任何明显的影响。如果这里有人能启发我,那就太好了。

谢谢

最新更新