Python 德扬戈。业务逻辑瓶颈。

Python 德扬戈。业务逻辑瓶颈。,python,django,performance,views,Python,Django,Performance,Views,有什么聪明的方法可以找到业务逻辑中的瓶颈吗。例如,我们有一个应用程序,它有一个在大型项目中执行HttpResponse('1')的视图。我们确信,中间件中不存在SQL查询。但HttpResponse的工作速度非常慢(clear django项目的速度是50转/秒,而clear django项目的速度是200转/秒) 原因可能是什么 在这种情况下,如何找到瓶颈 我们还知道,在clear project中,每个请求用于对象的内存少于1MB,而在我们的项目中,则超过2Mb。如何找到这些对象 您是否使用

有什么聪明的方法可以找到业务逻辑中的瓶颈吗。例如,我们有一个应用程序,它有一个在大型项目中执行HttpResponse('1')的视图。我们确信,中间件中不存在SQL查询。但HttpResponse的工作速度非常慢(clear django项目的速度是50转/秒,而clear django项目的速度是200转/秒)

  • 原因可能是什么
  • 在这种情况下,如何找到瓶颈
  • 我们还知道,在clear project中,每个请求用于对象的内存少于1MB,而在我们的项目中,则超过2Mb。如何找到这些对象
    您是否使用django调试工具栏?您可以找到使用它运行的查询,无论是否使用中间件。 如何监视视图的性能?
    大项目中的用户是否比新项目中的用户多得多?

    调试工具栏工作正常,但我也喜欢运行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))
    

    我猜你的瓶颈不在你或django代码中。您使用什么Web服务器,工作进程处理多少请求

    如果您使用mod_wsgi,请确保有足够的工作进程,并且最大请求数很高

    当然,请确保未设置settings.DEBUG

    Apache日志可以包括请求处理时间(以微秒为单位):检查%D

    在中间件中检查解释器在+django代码中的时间

    # Middleware to check how long the request was in the wsgi queue:
    class FooMiddleware:
        def process_request(self, request):
            ...
            queue_start=request.META.get('HTTP_X_QUEUE_START', None)
            if queue_start is not None:
                # How long was the request waiting in the wsgi queue?
                # In Apache Config: 
                # RequestHeader add X-Queue-Start "%t" (in <VirtualHost>)
                queue_start = int(queue_start[2:])/1000000.0
                wait_in_queue=time.time()-queue_start
                if wait_in_queue>1:
                    logging.error('Request was too long  (%.3fs) in wsgi-queue: %s' % (
                            wait_in_queue, request.build_absolute_uri()))
    
    检查请求在wsgi队列中的时间长度的中间件: 类中间件: def过程_请求(自我,请求): ... queue\u start=request.META.get('HTTP\u X\u queue\u start',无) 如果队列_start不是None: #请求在wsgi队列中等待了多长时间? #在Apache配置中: #RequestHeader添加X-Queue-Start“%t”(在中) queue\u start=int(queue\u start[2:])/1000000.0 等待队列中的队列=time.time()-队列开始 如果等待队列中的队列>1: logging.error('请求在wsgi队列中太长(%.3fs):%s'%( 等待队列中的请求。生成绝对uri())
    您可以试试New Relic,看看它是否有助于缩小问题范围


    好消息是,您可以在Django调试工具栏无法使用的生产应用程序上使用它。

    可能会对您有所帮助。我已经看过他的了。您是否尝试过Django调试工具栏?Django调试工具栏会在每页上显示查询计数。此外,查看缓存命中/未命中的数量以及使用的模板也很有用。但在这里,性能问题发生在视图和模型逻辑启动之前。Django调试工具栏通常与sql查询有关。对于视图性能监控,我们使用pycallgraph+pympler。值得指出的是,New Relic Python代理还可以在WSGI环境字典中查找HTTP_X_QUEUE_START,New Relic将在其概览图中显示排队时间。有关New Relic的链接,请参见我的答案。帮助我在第一次请求django时找到隐藏的查询。是的,当您开始覆盖save并在模型之间发送信号以确保数据库中的事情以正确的顺序发生时,这真的很有帮助。享受吧!