首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于cheroot/gunicorn可伸缩性的烧瓶

关于cheroot/gunicorn可伸缩性的烧瓶
EN

Server Fault用户
提问于 2021-05-06 11:05:54
回答 1查看 316关注 0票数 0

我使用烧瓶开发了一个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%。

代码语言:javascript
复制
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,结果更糟。

EN

回答 1

Server Fault用户

发布于 2021-05-08 14:57:06

回答我自己的问题。

在尝试了各种WSGI服务器和烧瓶之后,我决定尝试一下cherrypy。事实证明,即使这样,在并发性方面也有类似的限制。

然后我遇到了萨尼奇。我在sanic上编写了相同的测试应用程序,并且能够每秒处理10000次请求。

把我的项目从烧瓶转移到sanic。

票数 1
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/1062753

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档