Джанго.Узкие места бизнес-логики. - PullRequest
0 голосов
/ 30 ноября 2011

Есть ли какой-нибудь умный способ найти узкие места в бизнес-логике.Например, у нас есть приложение, которое имеет одно представление, которое делает HttpResponse ('1') в большом проекте.Мы уверены, что никаких SQL-запросов в промежуточном программном обеспечении не существует.Но HttpResponse работает очень медленно (50 об / с против 200 об / с в чистом проекте django).

  1. Какие могут быть причины?
  2. Как найти узкие места в этом случае?
  3. Также известно, что в чистом проекте для каждого объекта используется менее 1 МБ памяти, а в нашем проекте - более 2 МБ.Как найти эти объекты?

Ответы [ 4 ]

1 голос
/ 30 ноября 2011

Панель инструментов отладки работает хорошо, но мне также нравится запускать 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))
0 голосов
/ 01 декабря 2011

Вы можете попробовать New Relic и посмотреть, поможет ли это в сужении проблемной области.

Хорошодело в том, что вы можете использовать его в производственном приложении, где Django не может отлаживать панель инструментов.

0 голосов
/ 30 ноября 2011

Полагаю, ваша горлышко от бутылки не в вашем коде или коде Джанго.Какой веб-сервер вы используете, и сколько запросов обрабатываются рабочими процессами?

Если вы используете mod_wsgi, убедитесь, что у вас достаточно рабочих процессов и максимальное количество запросов высоко.

И изКонечно, убедитесь, что настройки. DEBUG не установлен.

Журналы Apache могут включать время обработки запроса в микросекундах: http://httpd.apache.org/docs/current/mod/mod_log_config.html проверка на% 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()))
0 голосов
/ 30 ноября 2011

Используете ли вы панель инструментов отладки django? Вы можете найти, какие запросы выполняются с ним, промежуточным программным обеспечением или нет. Как вы контролируете производительность просмотра? В большом проекте намного пользователей больше, чем в новом?

...