【发布时间】:2016-10-11 22:47:02
【问题描述】:
我有一个 django 应用程序(特别是 django-rest)。当我运行本网站的本地副本时,我的请求可以在 50-400 毫秒内处理完毕。
接下来,我设法部署到 Microsoft Azure App Service。现在,在我能买到的最昂贵的层级下,响应又回到了 800-2000 毫秒的范围内。
该应用程序对 sqlite 数据库进行简单查询。这个数据库文件大约有 30 兆字节,最大的表有 12000 行。
我应该指出对数据库的所有访问都是只读的,所以没有争用问题。
配置:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(PROJECT_ROOT, 'mydatabase.db'),
}
}
web.config:
<?xml version="1.0"?>
<configuration>
<appSettings>
<add key="WSGI_ALT_VIRTUALENV_HANDLER" value="django.core.wsgi.get_wsgi_application()" />
<add key="WSGI_ALT_VIRTUALENV_ACTIVATE_THIS" value="D:\home\site\wwwroot\env\Scripts\activate_this.py" />
<add key="WSGI_HANDLER" value="ptvs_virtualenv_proxy.get_virtualenv_handler()" />
<add key="PYTHONPATH" value="D:\home\site\wwwroot" />
<add key="DJANGO_SETTINGS_MODULE" value="myapp.settings" />
</appSettings>
<system.web>
<compilation debug="true" targetFramework="4.0" />
<!-- Required for websockets. -->
<httpRuntime targetFramework="4.5"/>
</system.web>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" />
<handlers>
<remove name="Python273_via_FastCGI" />
<add name="Python FastCGI" path="handler.fcgi" verb="*" modules="FastCgiModule" scriptProcessor="D:\Python27\python.exe|D:\Python27\Scripts\wfastcgi.py" resourceType="Unspecified" requireAccess="Script" />
</handlers>
<rewrite>
<rules>
<rule name="Static Files" stopProcessing="true">
<conditions>
<add input="true" pattern="false" />
</conditions>
</rule>
<rule name="Configure Python" stopProcessing="true">
<match url="(.*)" ignoreCase="false" />
<conditions>
<add input="{REQUEST_URI}" pattern="^/static/.*" ignoreCase="true" negate="true" />
</conditions>
<action type="Rewrite" url="handler.fcgi/{R:1}" appendQueryString="true" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>
Python 2.7 版。
我已将范围缩小到 SQLite 性能。静态文件和 API 索引页面在大约 60 毫秒内返回,而最繁重的查询在大约 2000 毫秒内返回。这是直到第一个字节的时间,而不是整体响应时间,我已经排除了网络延迟(由于地理位置接近,延迟非常低)。这是在 P3(Premium Tier)4 核、7GB 内存(Azure 称之为)上。
在本地主机上运行,索引页面的响应时间约为 15 毫秒,而我的 Macbook 2.2 GHz Intel Core i7 16 GB 1600 MHz DDR3 上的相同请求的响应时间约为 380 毫秒。
应用“热身”不是问题,因为这是在它已经“热身”之后(时间基于几次刷新)
更新: 我安装了 Django Rest Toolbar 以获取更多信息。
在 macbook django DEV 服务器上(纯 python?):
SQL time ~217ms
Total CPU time ~681ms
Resource Value
User CPU time 662.771 msec
System CPU time 18.415 msec
Total CPU time 681.186 msec
Elapsed time 681.326 msec
Context switches 1 voluntary, 95 involuntary
在 azure 应用服务 IIS 和 FastCGI 上(参见上面的配置):
SQL time ~854ms
Total CPU time ~2282ms
No CPU extended breakdown available.
欣赏任何见解!
【问题讨论】:
-
您的网络应用程序有多少个实例?经过漫长的响应时间,数据是否正确?您如何部署 SqlLite 数据库?
-
1 个实例,只有我使用 API。 sqlite 数据库是一个文件,通过 GIT(30 MB 文件)部署。
-
如果您怀疑 sqlite 是罪魁祸首,请查看调试工具栏中的 sql 选项卡,查看其中显示了多少查询以及最慢的查询是什么
-
但是很明显,您的总 CPU 时间是查询时间的 3 倍,因此您似乎在做一些繁重的工作。发布一些代码怎么样?
-
您的 Mac 有 SSD 还是 HDD? SSD 为数据库读取提供了显着的性能。
标签: python django sqlite azure azure-web-app-service