我正在尝试诊断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秒。