Python 谷歌云与gunicorn/flask一起运行-获得间歇504s

Python 谷歌云与gunicorn/flask一起运行-获得间歇504s,python,google-cloud-platform,gunicorn,google-cloud-run,Python,Google Cloud Platform,Gunicorn,Google Cloud Run,我使用gunicorn和worker类型的gthread在云上运行一个Flask应用程序。在底层,这个API只是从数据存储和Pubsub中写入/检索条目,所以所有操作都很轻松。流量为每天20000个请求,最大QPS 20个请求,平均QPS 2个 每隔几天/几周,一部分流量(25%-50%)会收到504响应,并出现以下错误: 请求已终止,因为它已达到最大请求超时。要更改此限制,请参阅 几个小时后,问题自行解决(重新部署应用程序或新的CR实例立即解决)。这504个请求似乎都没有到达应用程序。此错误似

我使用gunicorn和worker类型的gthread在云上运行一个Flask应用程序。在底层,这个API只是从数据存储和Pubsub中写入/检索条目,所以所有操作都很轻松。流量为每天20000个请求,最大QPS 20个请求,平均QPS 2个

每隔几天/几周,一部分流量(25%-50%)会收到504响应,并出现以下错误:

请求已终止,因为它已达到最大请求超时。要更改此限制,请参阅

几个小时后,问题自行解决(重新部署应用程序或新的CR实例立即解决)。这504个请求似乎都没有到达应用程序。此错误似乎与stderr、stdout中的任何错误或QPS的增加无关。我已经设置了一些高级日志记录和云分析器,但我没有得到任何有用的信息。此应用程序在带有gunicorn sync worker的应用程序引擎上运行良好。唯一的区别是gunicorn设置。同步工作者在CR上的工作速度非常慢,所以我改用gthread

你知道下一步该去哪里吗

Dockerfile

ENTRYPOINT ["gunicorn"]
CMD ["-b", ":8080", "--worker-class", "gthread", "--workers", "5", "--threads", "2", "api.app:app" ]
app.py

def run(**kwargs):
    app.run(port=8080, debug=False)


app = connexion.App(__name__, specification_dir='./swagger/')
app.app.json_encoder = encoder.JSONEncoder
app.add_api('swagger.yaml', resolver=connexion.resolver.RestyResolver('api'))
app.app.config.from_object(Config)

if __name__ == '__main__':
    run()
gcloud部署命令:

gcloud run deploy ${service_name} \
...
--image=${image} \
--concurrency=80 \
--memory=2Gi \
--cpu=2 
...

当前设置的超时值是多少?()关于应用程序正在做什么,还有什么其他细节吗?嘿@DustinIngram,我试着将超时设置为60秒,但没有发现任何区别。所以我把它拿了出来。该应用程序是一个通知系统。工程师将其ETL作业的状态推给其他人查询。在POST中,它向pubsub和数据存储添加一个条目。GET时,它从DS获取一条记录。就在今天,我们注意到,就在504s之前,发生了一次DS超时错误。之后,容器继续运行,大约%的用户得到了504。因此,当前的理论是,我们可能需要改进错误处理,而云运行可能不会杀死不健康的容器……您能展示一下如何针对您的应用程序初始化数据存储客户端吗?我们有自己的连接器类“DataBase”,它将对DS客户端的引用存储在它的一个属性中,我们像这样实例化它
self.client=db.client()。值得注意的是,此连接对象只有一个实例。app.py:
app.app.config['DATABASE']=数据库(project=project)
然后
app.run(…)
我们发现它是由数据存储挂起引起的。有时需要30分钟到2小时才能恢复DS响应。在此期间,整个web服务器线程将被阻塞,所有转发到该线程的请求将得到504。