我使用烧瓶开发了一个HTTP端点,它在POST请求中接受json数据并发送回json响应。
我曾尝试使用多个WSGI服务器: gunicorn、cheroot、Bjoern背后的Nginx作为反向代理。
我注意到,无论我使用哪个WSGI服务器,应用程序都无法处理每秒500个请求的持续负载。突然爆发的500人处理得很好。但当它持续下去的时候就不会了。请求开始得到延迟的响应,有相当多的请求只是超时。
烧瓶网络部署在24核心物理服务器上。所以它有48个逻辑核心。我在另一个类似的24核心服务器上使用一个C++应用程序异步地触发这些请求。每2ms请求一次,因此每秒500次。
下面是我为测试性能而创建的cheroot服务器上的一个简单的文件烧瓶应用程序的例子。它只记录请求json并返回一个响应json。即使这样,也无法在功能强大的24核心物理服务器上处理500个请求的持续负载。在测试期间,CPU的使用率总是低于5%。
import os
import json
import logging
from logging.handlers import TimedRotatingFileHandler
from flask import Flask
from flask import request, jsonify
from cheroot.wsgi import PathInfoDispatcher
from cheroot.wsgi import Server
app = Flask(__name__)
# Setup logger for the app
if not os.path.exists('logs'):
os.mkdir('logs')
file_handler = TimedRotatingFileHandler('logs/simpleflaskapp.log', when='midnight', interval=1, backupCount=10)
file_handler.setFormatter(logging.Formatter(
'%(asctime)s %(levelname)s: %(message)s [in %(pathname)s:%(lineno)d]'))
file_handler.setLevel(logging.INFO)
app.logger.addHandler(file_handler)
app.logger.setLevel(logging.INFO)
app.logger.info("simpleflaskapp startup")
# end setup logger
@app.route( '/test', methods = [ 'POST' ] )
def test():
app.logger.info(json.dumps(request.json))
res = {
"statusCode": 200,
"message": "OK",
}
return jsonify(res)
d = PathInfoDispatcher({'/': app})
server = Server(('0.0.0.0', 8000), d, numthreads=os.cpu_count(), request_queue_size=int(os.cpu_count()/2))
if __name__ == '__main__':
try:
server.start()
except KeyboardInterrupt:
server.stop()博客文章https://www.appdynamics.com/blog/engineering/a-performance-analysis-of-python-wsgi-servers-part-2/的作者能够在一台2核心机器上每秒处理数千次请求。我做错了什么?
通过在上面的示例应用程序中注释掉日志记录来消除磁盘IO,我可以达到每秒666次请求。但不是更多。考虑到我运行它的硬件,这仍然很低。
我已经检查了Nginx配置,它被配置为处理更高的负载。我还尝试直接向WSGI服务器发送请求,跳过Nginx,结果更糟。
发布于 2021-05-08 14:57:06
回答我自己的问题。
在尝试了各种WSGI服务器和烧瓶之后,我决定尝试一下cherrypy。事实证明,即使这样,在并发性方面也有类似的限制。
然后我遇到了萨尼奇。我在sanic上编写了相同的测试应用程序,并且能够每秒处理10000次请求。
把我的项目从烧瓶转移到sanic。
https://serverfault.com/questions/1062753
复制相似问题