Django. 业务逻辑瓶颈。

0 投票
4 回答
581 浏览
提问于 2025-04-17 07:23

有没有什么聪明的方法来找出业务逻辑中的瓶颈?比如,我们有一个应用程序,其中有一个视图在一个大型项目中执行 HttpResponse('1')。我们确定中间件中没有 SQL 查询。但是 HttpResponse 的速度真的很慢(在清爽的 Django 项目中是 200 次每秒,而在我们这个项目中只有 50 次每秒)。

  1. 可能有哪些原因呢?
  2. 在这种情况下,怎么找到瓶颈呢?
  3. 我们还知道,在一个干净的项目中,每个请求使用的对象内存少于 1MB,而在我们的项目中则超过 2MB。我们该如何找到这些对象呢?

4 个回答

0

你可以试试 New Relic,看看它是否能帮助你找到问题所在。

好消息是,你可以在实际运行的应用程序上使用它,而 Django 的调试工具就不能这样做。

0

你有没有使用过 Django 的调试工具栏?通过它,你可以查看哪些查询被执行了,不管是通过中间件还是其他方式。
你是怎么监控视图的性能的?
在一个大型项目中,用户数量是否比一个新项目多得多?

1

调试工具栏运行得很好,但我也喜欢使用django-devserver。这个工具有时候能提供比你能处理的信息还要多。

DEVSERVER_MODULES = (
    'devserver.modules.sql.SQLRealTimeModule',
    'devserver.modules.sql.SQLSummaryModule',
    'devserver.modules.profile.ProfileSummaryModule',

    # Modules not enabled by default
    'devserver.modules.ajax.AjaxDumpModule',
    #'devserver.modules.profile.MemoryUseModule',
    'devserver.modules.cache.CacheSummaryModule',
    #'devserver.modules.profile.LineProfilerModule',
)

这是我开启的模块,以及启动后访问管理页面的一次记录:

Django version 1.3.1, using settings 'myproject.settings' Running django-devserver 0.3.1 Threaded django server is running at http://127.0.0.1:8000/ Quit the server with CTRL-BREAK.
    [sql] SELECT ...
      FROM "auth_message"
      WHERE "auth_message"."user_id" = 1
    [sql] SELECT ...
      FROM "django_admin_log"
      INNER JOIN "auth_user" ON ("django_admin_log"."user_id" = "auth_user"."id")
      LEFT OUTER JOIN "django_content_type" ON ("django_admin_log"."content_typ_id" = "django_content_type"."id")
      WHERE "django_admin_log"."user_id" = 1
      ORDER BY "django_admin_log"."action_time" DESC LIMIT 10
    [sql] 4 queries with 0 duplicates
    [profile] Total time to render was 0.54s
    [cache] 0 calls made with a 100% hit percentage (0 misses) [30/Nov/2011 08:36:34] "GET /admin/ HTTP/1.1" 200 21667 (time: 0.69s; sql: 0ms (4q))
    [sql] SELECT ...
      FROM "django_flatpage"
      INNER JOIN "django_flatpage_sites" ON ("django_flatpage"."id" = "django_fatpage_sites"."flatpage_id")
      WHERE ("django_flatpage"."url" = /favicon.ico/
             AND "django_flatpage_sites"."site_id" = 1)
    [sql] 1 queries with 0 duplicates
    [profile] Total time to render was 0.02s
    [cache] 0 calls made with a 100% hit percentage (0 misses) [30/Nov/2011 08:36:34] "GET /favicon.ico/ HTTP/1.1" 404 2587 (time:
0.89s; sql: 0ms (1q))

撰写回答