2 votes

Performance de Nginx + uWSGI + Django bloquée à 100rq/s

J'ai configuré Nginx avec uWSGI et Django sur CentOS 6 x64 (3.06GHz i3 540, 4GB), qui devrait facilement gérer 2500 rq/s mais lorsque je lance un test ab ( ab -n 1000 -c 100 ) les performances s'arrêtent à 92 - 100 rq/s.

Nginx:
    user nginx;
    worker_processes 2;
    events {
        worker_connections 2048;
        use epoll;
    }

uWSGI:

    Emperor
    /usr/sbin/uwsgi --master --no-orphans --pythonpath /var/python --emperor /var/python/*/uwsgi.ini

[uwsgi]
socket = 127.0.0.2:3031
master = true
processes = 5

env = DJANGO_SETTINGS_MODULE=x.settings
env = HTTPS=on
module = django.core.handlers.wsgi:WSGIHandler()

disable-logging = true
catch-exceptions = false

post-buffering = 8192
harakiri = 30
harakiri-verbose = true

vacuum = true
listen = 500
optimize = 2

sysclt changes:
# Increase TCP max buffer size setable using setsockopt()
net.ipv4.tcp_rmem = 4096 87380 8388608
net.ipv4.tcp_wmem = 4096 87380 8388608

net.core.rmem_max = 8388608
net.core.wmem_max = 8388608
net.core.netdev_max_backlog = 5000
net.ipv4.tcp_max_syn_backlog = 5000
net.ipv4.tcp_window_scaling = 1
net.core.somaxconn = 2048

# Avoid a smurf attack
net.ipv4.icmp_echo_ignore_broadcasts = 1

# Optimization for port usefor LBs
# Increase system file descriptor limit
fs.file-max = 65535

Je l'ai fait sysctl -p pour activer les modifications.

Informations sur le serveur inactif :

top - 13:34:58 up 102 days, 18:35,  1 user,  load average: 0.00, 0.00, 0.00

Tasks: 118 total,   1 running, 117 sleeping,   0 stopped,   0 zombie

Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

Mem:   3983068k total,  2125088k used,  1857980k free,   262528k buffers

Swap:  2104504k total,        0k used,  2104504k free,   606996k cached

free -m

 total       used       free     shared    buffers     cached

Mem:          3889       2075       1814          0        256        592

-/+ buffers/cache:       1226       2663

Swap:         2055          0       2055

**During the test:**

top - 13:45:21 up 102 days, 18:46,  1 user,  load average: 3.73, 1.51, 0.58

Tasks: 122 total,   8 running, 114 sleeping,   0 stopped,   0 zombie

Cpu(s): 93.5%us,  5.2%sy,  0.0%ni,  0.2%id,  0.0%wa,  0.1%hi,  1.1%si,  0.0%st

Mem:   3983068k total,  2127564k used,  1855504k free,   262580k buffers

Swap:  2104504k total,        0k used,  2104504k free,   608760k cached

free -m

total       used       free     shared    buffers     cached

Mem:          3889       2125       1763          0        256        595

-/+ buffers/cache:       1274       2615

Swap:         2055          0       2055

iotop

30141 be/4 nginx       0.00 B/s    7.78 K/s  0.00 %  0.00 % nginx: wo~er process

Où se trouve le goulot d'étranglement ? Ou qu'est-ce que je fais mal ?

3voto

Andrew M. Points 10852

Il est clair que la tâche que vous utilisez est liée au processeur. Vous pouvez envisager de profiler votre application Django pour savoir où elle est à la traîne. Il existe plusieurs solutions de profilage pour les applications Python WSGI (bien que Django ne soit pas strictement compatible WSGI, en particulier avec les intergiciels, donc YMMV) :

  1. homme de ligne (plug sans vergogne, c'est mon projet !)
  2. keas.profil
  3. repoze.profil
  4. bouteur (mais vous devrez utiliser l'alpha 0.2)

Cela vous permettra d'identifier les goulets d'étranglement de votre application, c'est-à-dire les fonctions auxquelles votre application consacre le plus de temps.

Il convient également de vérifier combien de temps il faut à uwsgi/nginx pour traiter une demande. Les demandes sont-elles mises en file d'attente ? Combien de temps dure en moyenne une requête du début à la fin ? Plus important encore, quelle est votre ligne de base ? Essayez d'effectuer le même test avec un seul utilisateur simultané pour le savoir. Ensuite, augmentez progressivement le nombre d'utilisateurs jusqu'à ce que vous puissiez identifier l'endroit où le nombre d'utilisateurs atteint un pic.

Avec ces informations, vous pouvez commencer à établir un modèle - et c'est la clé des tests de charge !

Bonne chance !

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X