问题:
服务器响应调用(由opbeat,DHC chrome客户端测量)大约需要500毫秒到5000毫秒。Postgres查询(每个调用的总数)比它们对应的响应时间快20倍至50倍。为什么这么慢???
背景:
我在webfaction上运行一个实时的tastypie API(共享实例,1GB RAM :( )为我们的移动应用程序。 Django 1.8,Python 2.7,0.12.2.dev0 tastypie,PostgreSQL 9.4.,CentOS7 数据库有大约40个表,~2G,6k用户(可能有1/3是“活跃”的),数据库位于单独的共享webfaction框中。 虽然我们在api中有一些过程性代码,但许多缓慢的调用只是针对用户资源的GET请求-最大/最慢的是大约50kb的记录,JSON响应中的~350个对象。此调用的postgres时间为〜20-50ms,在快速专用开发服务器上的最快时间为2秒-2gig RAM,2个处理器-并且在现场为〜4秒,最慢的时间为10-16秒 在两个盒子上。 运行在Apache / mod_wsgi上,HTTPS,(apache的基准测试很快),没有gzip。 httpd.conf设置似乎很好。
简而言之:
99%的时间在tastypie.resources.wrapper中 - 我没有改变这个代码。这些调用只是返回资源的调用。 数据库查询很快 Web服务器似乎很快。
诊断:
Django调试工具栏(用于开发专用框上最慢操作的最快调用)
用户CPU时间1926.979毫秒 系统CPU时间27.074毫秒 总CPU时间1954.053毫秒 经过的时间1980.884毫秒 上下文切换71个自愿,44个非自愿
httpd.conf
服务器响应调用(由opbeat,DHC chrome客户端测量)大约需要500毫秒到5000毫秒。Postgres查询(每个调用的总数)比它们对应的响应时间快20倍至50倍。为什么这么慢???
背景:
我在webfaction上运行一个实时的tastypie API(共享实例,1GB RAM :( )为我们的移动应用程序。 Django 1.8,Python 2.7,0.12.2.dev0 tastypie,PostgreSQL 9.4.,CentOS7 数据库有大约40个表,~2G,6k用户(可能有1/3是“活跃”的),数据库位于单独的共享webfaction框中。 虽然我们在api中有一些过程性代码,但许多缓慢的调用只是针对用户资源的GET请求-最大/最慢的是大约50kb的记录,JSON响应中的~350个对象。此调用的postgres时间为〜20-50ms,在快速专用开发服务器上的最快时间为2秒-2gig RAM,2个处理器-并且在现场为〜4秒,最慢的时间为10-16秒 在两个盒子上。 运行在Apache / mod_wsgi上,HTTPS,(apache的基准测试很快),没有gzip。 httpd.conf设置似乎很好。
简而言之:
99%的时间在tastypie.resources.wrapper中 - 我没有改变这个代码。这些调用只是返回资源的调用。 数据库查询很快 Web服务器似乎很快。
诊断:
Django调试工具栏(用于开发专用框上最慢操作的最快调用)
用户CPU时间1926.979毫秒 系统CPU时间27.074毫秒 总CPU时间1954.053毫秒 经过的时间1980.884毫秒 上下文切换71个自愿,44个非自愿
httpd.conf
LoadModule authz_core_module modules/mod_authz_core.so
LoadModule dir_module modules/mod_dir.so
LoadModule env_module modules/mod_env.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule mime_module modules/mod_mime.so
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule wsgi_module modules/mod_wsgi.so
LoadModule unixd_module modules/mod_unixd.so
...
KeepAlive Off
SetEnvIf X-Forwarded-SSL on HTTPS=1
ServerLimit 1
StartServers 1
MaxRequestWorkers 5
MinSpareThreads 1
MaxSpareThreads 3
ThreadsPerChild 5
...
WSGIApplicationGroup %{GLOBAL}
WSGIDaemonProcess djangoapp processes=2 threads=8 python-path=...
WSGIProcessGroup djangoapp
WSGIRestrictEmbedded On
WSGILazyInitialization On
Opbeat在实时服务器上的表现:(这个抓取有更多/更长的数据库查询,因为我正在测试删除select_related()/prefetch_related() - 它们有助于db查询时间,但并没有使总时间减少太多):
什么鬼,要发帖子需要10点声望?
最后的想法:
- tastypie是真的慢吗?当然不是。虽然更好的盒子运行得更快,但Python用2秒钟输出了数据库20ms的内容,这是否现实呢?
- 是的,当我把它放在一个更快、专用的开发盒子上时,时间缩短了一些,但它们仍然是SQL调用所需时间的10-50倍,例如,对于一个资源GET,最快的用时也要2秒,而数据库只需要<50毫秒。所以,这似乎不仅仅是一个资源问题,据我所知。
- 我试图链接到Amazon RDS PostgreSQL数据库,但它的响应时间慢了20倍(微型/免费层)且整体往返时间也慢了。
- 感谢您的帮助和关注-
Tastypie 0.9.16
。也许你需要做一些更改? - Tomasz Jakub Rup