2016-10-11 6 views
6

Ich habe eine Django-App (speziell Django-Rest). Wenn ich die lokale Kopie dieser Site ausführe, können meine Anfragen in 50-400ms bearbeitet werden.Azure "App Service" - Django und SQLite

Als Nächstes konnte ich den Microsoft Azure App Service bereitstellen. Jetzt, unter der teuersten Stufe, die ich kaufen kann, kommen Antworten im Bereich von 800-2000ms zurück.

Die App macht einfache Abfragen auf SQLite-Datenbank. Diese Datenbankdatei ist ungefähr 30 Megabyte mit der größten Tabelle 12000 Zeilen.

Ich sollte darauf hinweisen, alle Zugriffe auf die Datenbank ist schreibgeschützt, so dass keine Konflikte auftreten.

Konfiguration:

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-Version 2.7.

Ich habe es auf SQLite Leistung eingegrenzt. Statische Dateien und API-Index-Seiten kommen in ~ 60ms zurück, während die schwerste Abfrage in ~ 2000ms zurückkommt. Dies ist die Zeit bis zum ersten Byte und nicht die gesamten Antwortzeiten, und ich habe die Netzwerklatenz ausgeschlossen (was aufgrund der geografischen Nähe sehr gering ist). Dies ist auf P3 (Premium Tier) 4-Core, 7 GB RAM (wie Azure es nennt).

Auf localhost laufen die Antwortzeiten ~ 15ms für Indexseiten und ~ 380ms für die gleichen Anfragen auf meinem MacBook 2,2 GHz Intel Core i7 16 GB 1600 MHz DDR3.

App „warm-up“ ist nicht das Problem, da dies nach dem bereits „heiß“ (Timing auf ein paar Auffrischungen basiert)

Update: Ich installierte Django Ruhe Toolbar für weitere Informationen.

Auf macbook django DEV-Server (reiner 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 

auf azur App Service IIS und FastCGI (siehe Config oben):

SQL time ~854ms 
Total CPU time ~2282ms 
No CPU extended breakdown available. 

keine Einsicht schätzen!

+0

Wie viele Instanzen hat Ihre Web-App? Sind die Daten nach der langen Antwortzeit korrekt? Wie stellen Sie Ihre SqlLite-Datenbank bereit? –

+0

1 Instanz, nur ich traf die API. Die SQLite-Datenbank ist eine Datei, die über GIT (30 MB-Datei) bereitgestellt wird. – beiller

+0

Wenn Sie vermuten, dass sqlite ist der Täter Blick auf die SQL-Registerkarte in der Debug-Symbolleiste und sehen, wie viele Abfragen dort angezeigt und was ist die langsamste – e4c5

Antwort

0

Vorausgesetzt, dass Ihre lokalen und Azure-Testläufe ein ähnliches Vielfaches vom besten zum schlechtesten Fall zeigen und Sie nur eine 30-MB-Datenbankdatei haben, ist mein Azure-Host einfach eine viel langsamere CPU.

Dies wird durch die Tatsache unterstützt, dass sie throttling for some spec VMs tun. Es ist auch etwas, das in comparison to AWS notiert wurde. Ich denke, das Gleiche gilt für Ihre App Service-Plattform.

+0

Es stellte sich heraus, dass das Problem SQLite und E/A-Leistung waren. Es ist sehr schlecht, weil ihre Front-End-Server verteilt sind und über ein langsames ... Netzwerk-Dateisystem arbeiten. Die Umstellung auf SQL Server ist die einzige Lösung. – beiller

+0

Vermutlich liegt das daran, dass sie bessere Festplatten-IO für ihre SQL Server-Angebote garantieren. –

Verwandte Themen