Django和Postgres-如何跟踪性能下降?

时间:2018-12-04 23:28:51

标签: python django postgresql

我正在尝试诊断Django应用程序中的性能问题。

Postgres数据库在云中的远程服务器上运行,而Django服务器在我的本地OSX计算机上运行。

该数据库中只有大约2条记录。

此日志输出显示请求从2.8秒开始执行某件事。

DEBUG = settings.py中的False

更改CONN_MAX_AGE似乎没有任何作用。

我该如何准确追踪当时的情况?我怀疑它正在创建数据库连接,但是我似乎找不到一种方法来精确监视Django和Postgres之间的连接创建请求。

这是执行缓慢启动的视图功能时的应用程序输出日志。

第一和第二毫秒输出是重复的相同数据库请求。

[04/Dec/2018 22:30:14] "GET /main/contact/gsnkn6/view/ HTTP/1.1" 200 7309
start
[]
milliseconds:  2783
[]
milliseconds:  407
milliseconds:  0
milliseconds:  0

这是Django视图函数的代码:

@require_http_methods(['GET'])
@csrf_exempt
def contact_view(request, contact_slug):
    print('start')
    start = datetime.datetime.now()
    contact = Contact.objects.get(slug=contact_slug)
    print(connection.queries)
    end = datetime.datetime.now()
    delta = end - start
    print(f'milliseconds: ', int(delta.total_seconds() * 1000))
    start = datetime.datetime.now()
    try:
        contact = Contact.objects.get(slug=contact_slug)
        print(connection.queries)
    except Contact.DoesNotExist:
        return HttpResponseNotFound('404 not found')
    end = datetime.datetime.now()
    delta = end - start
    print(f'milliseconds: ', int(delta.total_seconds() * 1000))

    start = datetime.datetime.now()
    notes_list = Note.objects.filter(
        contact=contact,
    ).order_by(
        '-date_created',
    )
    end = datetime.datetime.now()
    delta = end - start
    print(f'milliseconds: ', int(delta.total_seconds() * 1000))

    start = datetime.datetime.now()
    related_links_list = RelatedLink.objects.filter(
        contact=contact,
    )
    end = datetime.datetime.now()
    delta = end - start
    print(f'milliseconds: ', int(delta.total_seconds() * 1000))

    return render(request, 'main/contact_view.html', {
        'contact': contact,
        'notes_list': notes_list,
        'related_links_list': related_links_list,
    })

这是我的settings.py

的数据库部分
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'dbname',
        'CONN_MAX_AGE': 600,
        'USER': 'XXXXX',
        'PASSWORD': 'XXXXXX',
        'HOST': 'xx.xx.xx.xx',
        'PORT': '5432',
    }
}

点冻结返回:

Django==2.1.3
psycopg2==2.7.6.1
psycopg2-binary==2.7.6.1
pytz==2018.7
shortuuid==0.5.0

psql -V返回:

psql (PostgreSQL) 9.5.14

python版本是:

Python 3.5.2 (default, Nov 12 2018, 13:43:14)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

编辑:

更多信息是,设置DEBUG = True表示前两个查询的SQL执行时间大约是相同的“时间”:“ 0.346”,即使第一个查询花费的时间超过2.5秒。

0 个答案:

没有答案