Skip to content

Instantly share code, notes, and snippets.

@nullx5
Last active February 26, 2025 13:42
Show Gist options
  • Save nullx5/6f1cbdcdc05dc198457d83aa18804e15 to your computer and use it in GitHub Desktop.
Save nullx5/6f1cbdcdc05dc198457d83aa18804e15 to your computer and use it in GitHub Desktop.

Manejo de muchas conexiones simultáneas o concurrentes.

apache + gunicorn.

El número de peticiones por segundo que Apache + Gunicorn puede manejar depende de varios factores:

  • Configuración de Gunicorn (número de workers y tipo de worker).
  • Modo de Apache (prefork, worker o event).
  • Especificaciones del servidor (CPU, RAM).
  • Carga de la aplicación (uso de base de datos, procesamiento de datos, etc.).

Configuración de Gunicorn (número de workers y tipo de worker).

Modos de Apache (prefork, worker o event).

Apache en su configuración por defecto usa el modo prefork, que no es eficiente para muchas conexiones simultáneas. En este modo, cada petición se maneja con un proceso separado, lo que consume más RAM y limita la cantidad de conexiones concurrentes.

Para mejorar el rendimiento, puedes cambiar al modo worker o event, que usa hilos en lugar de procesos.

sudo a2dismod mpm_prefork
sudo a2enmod mpm_event
sudo systemctl restart apache2

¿Cuántas peticiones por segundo puede manejar?

🔹 Configuración básica (Prefork, 4 workers en Gunicorn) Apache: Modo prefork, 10 procesos. Gunicorn: 4 workers tipo sync (gunicorn -w 4 myapp:app).

📌 Rendimiento estimado (en un servidor de 2 vCPUs y 4GB RAM):

~100-300 RPS (requests per second) con respuestas ligeras (~100ms). Puede colapsar rápidamente con muchas conexiones simultáneas.

🔹 Configuración optimizada (Event MPM, Gunicorn async/gevent) Apache: Modo event, MaxClients 256. Gunicorn: 4 workers gevent (gunicorn -w 4 -k gevent myapp:app).

📌 Rendimiento estimado:

~500-1000 RPS (requests per second) en un servidor de 2 vCPUs y 4GB RAM. Mejor manejo de concurrencia, pero aún limitado comparado con Nginx. Si aumentas los workers en Gunicorn (workers = núcleos * 2 + 1), puedes mejorar el rendimiento.

ApacheBench

ab -n 1000 -c 100 http://127.0.0.1:8000/

🔹 -n 1000 → Enviar 1000 peticiones.

🔹 -c 100 → Enviar 100 peticiones simultáneas.

wrk

wrk -t4 -c100 -d30s http://127.0.0.1

🔹 -t4 → 4 hilos de prueba.

🔹 -c100 → 100 conexiones simultáneas.

🔹 -d30s → Ejecutar la prueba durante 30 segundos.

Esto te dirá cuántas RPS soporta tu configuración. 🚀

nginx + gunicorn.

El rendimiento de Nginx + Gunicorn en términos de requests per second (RPS) depende de varios factores clave:

  • Configuración de Gunicorn (número de workers y tipo de worker).
  • Configuración de Nginx (buffers, keepalive, conexiones concurrentes).
  • Especificaciones del servidor (CPU, RAM, tipo de almacenamiento).
  • Carga de la aplicación (si solo sirve contenido estático o si ejecuta lógica pesada).

🔹 Configuración optimizada Gunicorn async/gevent, (gunicorn -w 4 -k gevent myapp:app) Nginx optimizado (worker_connections 4096) en /etc/nginx/nginx.conf:


worker_processes auto;
events {
    worker_connections 4096;
    multi_accept on;
}

📌 Rendimiento estimado (en un servidor de 2 vCPUs y 4GB RAM):

1000-5000 RPS (requests per second) en un servidor con 2 vCPUs y 4GB RAM.

Aumentar el límite de archivos abiertos en el sistema.

Configurar el balanceo de carga (opcional)

upstream backend {
    least_conn;  # Balanceo de carga basado en el menor número de conexiones
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com;
}

server {
    listen 80;
    server_name example.com;

    location / {
        proxy_pass http://backend;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment