首页 > 解决方案 > 为什么我的 Flask 应用程序在负载下异常缓慢

问题描述

我有一个我制作的烧瓶 API。笼统地说,它有点像 Reddit 的克隆,用户可以上传、投票和下载。对于数据库,我使用带有 sqlalchemy 的 postgresql。我还使用 redis 来缓存和存储排序模式(hot、new 和 top)。Elasticsearch 用于搜索数据库。该应用程序是通过 Gunicorn 提供的,它具有我公司租用的功能强大的物理服务器。(32 GB 内存、16 个线程和 16 个内核)。然后我们使用 Nginx 反向代理,所以我们可以做 https。无论如何,当我通过邮递员发送一次性请求时,我的响应时间非常快,通常不到 200 毫秒。但是,当我开始使用 locust 进行负载测试时,我的响应时间似乎随着我发送的请求数量呈指数级攀升。每秒可以及时处理大约 100 个请求,但除此之外的任何事情,响应时间都会攀升至数秒范围。如果您可以帮助推荐配置更改,或者您认为可行的任何其他方法,我们将不胜感激。另外,如果有特定的反模式我应该扫描代码,请告诉我。我将在下面留下一些特定于应用程序的详细信息。

SQLAlchemy 配置选项:

    SQLALCHEMY_DATABASE_URI = db_url or os.environ.get("DATABASE_URL")
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    SQLALCHEMY_POOL_SIZE = 20
    SQLALCHEMY_MAX_OVERFLOW = 100
    ELASTICSEARCH_URL = elastic_url or os.environ.get('ELASTICSEARCH_URL')

初始化应用程序和数据库:

app = Flask(__name__)
app.config.from_object(Config)
db = SQLAlchemy(app)
migrate = Migrate(app, db)
mail = Mail(app)
login = LoginManager(app)
login.login_view = "admin_login"

CPU使用率

磁盘使用情况

测试结果

我可以根据要求提供更多信息。谢谢您的帮助!

标签: pythonpostgresqlflaskgunicornpsycopg2

解决方案


“测量,不要猜测” - 这也是 Mike Müller 的谈话标题,可在 YouTube 上找到。这是一个很好的剖析介绍。

https://youtu.be/EcGWDNlGTNg

作为一个快速入门者,我想看看 py-spy,它是一个可以附加到正在运行的进程的分析器。

https://github.com/benfred/py-spy

作为最后一个提示...您没有显示任何代码,但我看到您使用 Flask-Mail。确保异步发送电子邮件。


推荐阅读