2011-04-22 6 views
3

Mon programme d'installation est django 1.3 et les paquets par défaut mod_wsgi et apache pour ubuntu 10.04. Je l'ai testé une vue de mon application sur mon développement VM (DEBUG et barre d'outils de débogage off):accélérer le serveur django

ab -n 200 -c 5 http://127.0.0.1/ 

et reçu 4 demandes par seconde. Cela semblait lent alors j'ai simplifié les requêtes, les index utilisés, etc. au point où la barre d'outils de débogage me dit que j'ai 4 requêtes en 8ms. En exécutant le même test, je reçois seulement 8 demandes par seconde. Le CPU semble être à 100% tout le temps. Cela semble assez lent pour ce qui est maintenant une vue assez simple, mais c'est juste une VM faible puissance. J'ai décidé de démarrer une grande instance ec2 (4 cpu) pour voir quel genre de performance j'obtiendrais sur cette classe de machine et j'ai été surpris de ne recevoir que 13 requêtes par seconde. Comment puis-je changer la configuration d'apache/mod_wsgi pour obtenir plus de performance sur cette classe de machine?

Je pense que je me sers de travailleur plutôt que prefork:

$ /usr/sbin/apache2 -l 
Compiled in modules: 
    core.c 
    mod_log_config.c 
    mod_logio.c 
    worker.c 
    http_core.c 
    mod_so.c 

Ma configuration des travailleurs est:

<IfModule mpm_worker_module> 
    StartServers   2 
    MinSpareThreads  25 
    MaxSpareThreads  75 
    ThreadLimit   64 
    ThreadsPerChild  25 
    MaxClients   150 
    MaxRequestsPerChild 0 
</IfModule> 

et mes paramètres WSGI ressembler à ceci:

WSGIScriptAlias//home/blah/site/proj/wsgi.py 
WSGIDaemonProcess blah user=blah group=blah processes=1 threads=10 
WSGIProcessGroup blah 

Merci très beaucoup pour votre aide!

NOTE: J'ai essayé le test ab d'une autre instance et a obtenu le même résultat

Répondre

3

Assurez-vous que keep-alive est éteint.

Plus de processus et un seul thread J'ai vu de meilleures performances où CPU est le facteur limitant; essayez processes=4 threads=1.

+0

Cela semblait le faire. 21 demandes par seconde maintenant. Aussi, je me suis souvenu que ces grandes instances ec2 ont seulement 2 processeurs physiques. Ainsi, mettre les processus à 2 a eu le même avantage. Merci! – asciitaxi

2

La meilleure façon de modifier mod_wsgi est de ne pas l'utiliser :)

Première: Je ne pense pas que votre problème est le serveur web: avec mod_wsgi vous pouvez obtenir des centaines demandes/s. Vous pouvez obtenir de meilleurs résultats avec la mise en cache et avec la mise en pool de connexions DB. Si vous utilisez postgres, jetez un oeil à pgpool II: http://pgpool.projects.postgresql.org/. Cependant, si vous voulez aller plus loin dans les serveurs web wsgi, lisez attentivement ce joli benchmark: http://nichol.as/benchmark-of-python-web-servers.

Si vous n'avez pas besoin de travailleurs asynchrones, le gunicorn est un bon choix. C'est très facile à configurer (vous pouvez l'exécuter avec manage.py run_gunicorn) et c'est plutôt rapide. Si vous voulez être sûr que mod_wsgi n'est pas le coupable, essayez-le. Si vous voulez de meilleures performances, allez avec gevent ou uWSGI.

Mais le serveur Web ne changera pas votre benchmark: vous pouvez passer de 4 req/s à 4.01 req/s.

+0

Merci @vad. C'est un article assez complet. Changer le nombre de processus à 2 semblait réduire davantage la performance, mais je suis d'accord, memcached est probablement mon meilleur pari pour des gains réels. – asciitaxi

+0

ce n'est pas seulement memcache. Je suggère aussi la mise en commun des connexions DB. Vous dites que vos requêtes prennent 8ms, mais ce n'est que la somme de l'heure de la requête sur votre SGBD. Vous ne tenez pas compte du temps de connexion/réseau – vad