【问题标题】:Why is my Flask app unjustifiably slow when under load为什么我的 Flask 应用程序在负载下异常缓慢
【发布时间】:2021-05-25 06:43:44
【问题描述】:

我制作了一个烧瓶 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"

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

【问题讨论】:

  • 瓶颈不太可能出现在 gunicorn 或 nginx 中,所以我会分析您的应用程序代码。查看哪些端点导致 CPU 负载过重并解决这些问题。
  • @AdamSmith 您会推荐哪些工具进行分析?此外,我们已经推断出慢速端点是 I/O 繁重的端点,例如查询数据库并提交给它。有什么建议吗?
  • 只是平常。如果您为 APM(New Relic、Datadog、Splunk 等)付费,请尽可能多地使用它们。如果不是,请尽可能进行目标测试并观察可以输出的指标。我听说 Zipkin 和 Jaeger 在这里可以提供很好的帮助,但从未亲自使用过它们。
  • @AdamSmith 好的,非常感谢您的帮助。最后一件事,flask-profiler 值得一试吗?
  • 我从未使用过它,但对在生产环境中运行烧瓶应用程序不是很熟悉。我使用过用于开发的烧瓶应用程序,并且熟悉在生产中大规模开发和操作 Java 应用程序。

标签: python postgresql flask gunicorn psycopg2


【解决方案1】:

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

https://youtu.be/EcGWDNlGTNg

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-12
    • 1970-01-01
    • 1970-01-01
    • 2016-05-26
    相关资源
    最近更新 更多