糟糕的 Django 应用程序降级

Poor Django application degradation

我被分配去支持一个旧的 Django 应用程序。此应用程序用于 运行 gunicorn 同步工作者。然而,它变得越来越慢。最近,一位工程师通过 gevent.

进行了更改以使用 gunicorn 异步工作者

本周,当 HTTP 请求数量增加时,系统性能严重下降。我们在 gevent.threadpool._add_thread 收到了很多 error: can't start new thread。命中率最高的 Django 视图在完成并呈现复杂模板之前执行大约 400 SQL 次查询。

增加的查询数量和 CPU 呈现模板的时间会不会与这个新的异步工作者一起玩得很糟糕?如果是这样,我该如何向其他人解释?

连接池配置为不超过 postgres 连接的限制。

我将此作为答案而不是评论来写,因为虽然它不能解决您的情况,但从技术上讲它确实解决了您的问题。此外,评论中没有足够的空间来要求所有必要的说明以从一个到另一个。

I'm assigned to support an old Django application. This application used to run on gunicorn synchronous workers. However, it was getting slower. Recently, a engineer made a change to use gunicorn asynchronous workers with gevent.

部署方法基本上与 Django 应用程序无关,除非编写它的人正在做一些依赖于同步请求处理的事情。出于一些原因,作为第一步,我会切换回部署方法。

  1. "An old Django application" 表明它的版本不受支持。如果是这种情况,无论如何都不应该 public,在这种情况下,流量几乎可以忽略不计。
  2. "It was getting slower" 需要解释。如果它以某种方式以显着影响其响应速度的速度增长, 是您应该开始的症状。
  3. 从同步切换到异步的任何人都应该提供他们的推理并解释他们的尽职调查,以便您了解他们做了什么以确保他们明白他们不会破坏这个东西(而且,如果缺少它,你可以在至少知道你不必寻找什么)。

This week the system suffered a severe degradation when the number of HTTP requests increased. We received lots of error: can't start new thread on gevent.threadpool._add_thread. The Django view with most hits performs about 400 SQL queries before completing and renders a complex template.

每页 400 个查询指向 确实 编写糟糕的代码,或者更不可能的是,大量用户正在查看一个信息量惊人的页面,而该页面根本没有从任何有用的排序中受益缓存。您在评论中提到 "improv[ing] the SQL queries",但 Django 的 ORM 在构建查询方面相当不错,所以希望您只是笼统地说;如果构建它的人是手工编写 SQL 并通过 ORM 传递它,那肯定是另一个潜在的关注领域。

如果您能提供有关系统以前处理良好的流量和现在阻塞的流量的信息,这将很有用。了解您的部署也很好;自动缩放设置可以缓解这种情况,但如果您以效率较低的方式重新配置它也会增加成本,所以这是一种权衡。

Could the elevated number of queries and CPU time to render the template be playing badly with this new async worker? And if so, how can I explain it to others?

如果这只是应用程序因请求而过载的问题,那么异步部署实际上应该有所帮助(或者至少使数据库读取成为瓶颈,但这也极不可能,因为您不是从 SQLite 文件在软盘上)。

The connection pool is configured to not exceed the limit of postgres connections.

如果您达到了数据库连接限制,就会遇到完全不同的问题。我认为这极不可能。