【问题标题】:Azure "App Service" - Django and SQLiteAzure“应用服务”——Django 和 SQLite
【发布时间】: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


【解决方案1】:

鉴于您的本地和 Azure 测试运行显示从最佳到最坏情况的倍数相似,并且您只有一个 30MB 的数据库文件,我猜您的 Azure 主机只是一个慢得多的 CPU。

这得到了他们throttling for some spec VMs 的支持。这也是comparison to AWS 中提到的内容。我想您的应用服务平台也是如此。

【讨论】:

  • 原来问题是 SQLite 和 I/O 性能。这是非常糟糕的,因为他们的前端服务器是分布式的,并且工作在一个缓慢的……网络文件系统上。切换到 SQL Server 是唯一的解决方案。
  • 这大概是因为他们保证为他们的 SQL 服务器产品提供更好的磁盘 IO。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-30
  • 1970-01-01
  • 2018-02-20
相关资源
最近更新 更多