Django-fr

Forum

  • Accueil
  • » Django-fr
  • » [Déploiement] 1.89 requêtes par secondes avec nginx + uwsgi

#1 03-02-2018 19:20:27

blankoworld
Membre
Inscription : 03-02-2018
Messages : 2

[Déploiement] 1.89 requêtes par secondes avec nginx + uwsgi

Bonjour,

Comme je m'intéresse à la mise en production d'une application Django ; je me suis lancé.
J'ai donc installé nginx, uwsgi, virtualenv.

Par curiosité, comme je trouvais ça assez lent, j'ai lancé la commande suivante :

ab -c 10 -n 100 https://domain.tld/

qui me retourne :

Requests per second:    1.89 [#/sec] (mean)
Time per request:       5279.598 [ms] (mean)
Time per request:       527.960 [ms] (mean, across all concurrent requests)
Transfer rate:          25.48 [Kbytes/sec] received

Donc à peu près 1.8 req/secondes. Ce qui explique la lenteur.

Comme je n'y connais pas grand chose en mise en production d'application, j'aurais besoin d'un coup de pouce pour trouver une piste.

Voici quelques informations :

  • CPU: Intel(R) Atom(TM) CPU N2800   @ 1.86GHz (4 CPU apparemment)

  • RAM: 2Go

  • UWSGI en mode socket

  • Nginx qui utilise le socket et dessert les fichiers statiques

Ma configuration UWSGI est la suivante :

[uwsgi]
chdir = /srv/www/domain/django/collection
module = collection.wsgi:application
master = true
processes = 10
socket = /srv/www/domain/django/django.sock
vacuum = true

uid = http
disable-logging = true

# environment
plugins = python
virtualenv = /srv/www/domain/django/venv
env = LANG=fr_FR.UTF-8
env = DJANGO_ENV=production
env = SECRET_KEY="nawak"
env = POSTGRES_DB=django
env = POSTGRES_USER=django

threads = 2
enable-threads = true

max-worker-lifetime = 30
harakiri = 20
max-requests = 5000

Côté Nginx, j'ai :

upstream django {
        server unix:///srv/www/domain/django/django.sock;
}
server {
        listen         *:80;
        listen         [::]:80;
        server_name    domain.tld;

        index index.html;                                                                                                                                              
                                                                                                                                                                       
        # ACME challenge
        include /etc/nginx/letsencrypt;
                                                                                                                                                                       
        return 301 https://$host$request_uri;
}
                                                                                                                                                                       
server {
        listen *:443 ssl http2;
        listen [::]:443 ssl http2;
        server_name domain.tld;

        ssl_certificate         /etc/letsencrypt/live/domain.tld/fullchain.pem;
        ssl_certificate_key     /etc/letsencrypt/live/domain.tld/privkey.pem;

        include /etc/nginx/ssl_params;

        ssl_dhparam             /etc/nginx/ssl/dhparams.pem;

        # ACME challenge
        include /etc/nginx/letsencrypt;
                                                                                                                                                                       
        proxy_set_header X-Real-IP  $remote_addr;
                                                                                                                                                                       
        # Django application                                                                                                                                           
        location /static {
                alias /srv/www/domain/django/collection/static;
        }                                                                                                                                                              
                                                                                                                                                                       
        # Finally, send all non-media requests to the Django server.
        location / {                                                                                                                                                   
                uwsgi_pass  django;
                include     /etc/nginx/uwsgi_params;                                                                                                                   
        }
}

J'ai beau chercher et modifier des paramètres, sans résultat concluant. Plus je tente des choses et plus je m'y perds.

Je vous remercie d'avance pour toute l'aide que vous pourriez m'apporter à cela,

Olivier.

Dernière modification par blankoworld (09-02-2018 09:17:47)

Hors ligne

#2 15-02-2018 15:16:13

Xavier Ordoquy
Administrateur
Lieu : Puteaux, France
Inscription : 12-10-2011
Messages : 308
Site Web

Re : [Déploiement] 1.89 requêtes par secondes avec nginx + uwsgi

Bonjour,

C'est effectivement lent et ce n'est pas normal.
Il y a tellement de paramètres qui peuvent poser le problème qu'il est impossible de dire à priori si c'est normal.
En premier lieu, tester en local avec la debug toolbar et voir le résultat indiqué pour savoir si c'est un souci sur la plateforme ou du coté projet développé.

Hors ligne

#3 20-02-2018 11:21:26

blankoworld
Membre
Inscription : 03-02-2018
Messages : 2

Re : [Déploiement] 1.89 requêtes par secondes avec nginx + uwsgi

Merci pour la réponse, j'ai cru un moment que personne ne déployait Django smile

Xavier Ordoquy a écrit :

C'est effectivement lent et ce n'est pas normal.

Est-ce que par hasard on sait à combien cela devrait avoisiner, par exemple avec une simple page statique et un template qui complète le "title" dans la page ?
J'ai tenté pour voir avec plusieurs fichiers statiques (JS, images, CSS) et une page HTML avec juste "load static" pour les fichiers statiques, je suis à 10 req/sec.

Xavier Ordoquy a écrit :

Il y a tellement de paramètres qui peuvent poser le problème qu'il est impossible de dire à priori si c'est normal.
En premier lieu, tester en local avec la debug toolbar et voir le résultat indiqué pour savoir si c'est un souci sur la plateforme ou du coté projet développé.

Alors oui je ne l'ai pas dit, entre temps c'est ce que j'ai fais, une requête n'était pas optimisée. Je suis cependant passé à 4req/sec en la modifiant (soit 2 fois plus rapide).
Ça me paraît toujours assez lent.

J'ai donc tenté de séparer ma page en plusieurs pages :

  • Une page listant tous les éléments (7 req/sec).

  • Une page ne listant qu'une partie des éléments (en appliquant un filtrage) (5 req/sec)

Quelque noms pour la suite (espérons qu'il y ait une suite !) :

  • Soit Homepage la page d'accueil, désormais statique (page bootstrap/js/css/html5 standard). Elle est à 10 req/sec.

  • Soit Items la page contenant la liste de tous mes éléments (148 éléments) affichés sur la même page. Elle est à 7 req/sec.

  • Soit Summary la page contenant deux listes filtrées de mes éléments (moins de 10 éléments chacune). Elle est à 5 req/sec.

Je note qu'en local, Homepage fait du 45 req/sec environ.

Ai-je vraiment fait autant de merde que ça ? Car sur une autre application où la page d'accueil renvoit chaque fois sur le login de l'admin, ça prend 365 req/sec en local (forcément ça fait juste un redirect et basta).

Hors ligne

  • Accueil
  • » Django-fr
  • » [Déploiement] 1.89 requêtes par secondes avec nginx + uwsgi

Pied de page des forums