El rendimiento de Nginx + uWSGI + Django se atascó en 100rq/s

El rendimiento de Nginx + uWSGI + Django se atascó en 100rq/s

He configurado Nginx con uWSGI y Django en CentOS 6 x64 (3.06GHz i3 540, 4GB), que debería manejar fácilmente 2500 rq/s pero cuando ejecuto ab test ( ab -n 1000 -c 100 ) el rendimiento se detiene en 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

Lo hice sysctl -ppara habilitar los cambios.

Información del servidor inactivo:

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

¿Dónde está el cuello de botella? ¿O qué estoy haciendo mal?

Respuesta1

Claramente, cualquier tarea que esté utilizando está vinculada a la CPU. Es posible que desees considerar crear un perfil de tu aplicación Django para descubrir dónde está retrasada tu aplicación. Existen varias soluciones de creación de perfiles para aplicaciones Python WSGI (aunque Django no es estrictamente compatible con WSGI, especialmente con middleware, por lo que YMMV):

  1. juez de línea(enchufe descarado, ¡este es mi proyecto!)
  2. perfil.keas
  3. perfil.repoze
  4. topadora(pero necesitarás usar el alfa 0.2)

Esto le permitirá identificar cuellos de botella en su aplicación, es decir, ¿en qué funciones pasa la aplicación la mayor parte de su tiempo?

Otra cosa a verificar es, ¿cuánto tiempo le toma a uwsgi/nginx atender una solicitud? ¿Las solicitudes están en cola? ¿Cuánto tiempo tarda una solicitud promedio de principio a fin? Además, lo que es más importante, ¿cuál es su punto de referencia? Intente realizar la misma prueba con 1 usuario simultáneo para descubrirlo. Luego, aumente gradualmente la cantidad de usuarios hasta que pueda identificar dónde alcanza su punto máximo.

Con esta información, puedes empezar a establecer un patrón, ¡y esa es la clave para las pruebas de carga!

¡Buena suerte!

información relacionada