100 solicitudes simultáneas a una aplicación Django con Gunicorn conducen a "54: Restablecimiento de conexión por parte del par" y 502

100 solicitudes simultáneas a una aplicación Django con Gunicorn conducen a "54: Restablecimiento de conexión por parte del par" y 502

Estoy alojando una aplicación Django que sirve como punto final API. Lamentablemente, la aplicación que utiliza la API realiza muchas solicitudes simultáneas al cargar la página (en el ámbito de 80 a 90 solicitudes).

Nginx se ejecuta como proxy inverso frente a gunicorn e informa el siguiente problema: kevent() reported that connect() failed (54: Connection reset by peer) while connecting to upstream

Eso me llevó a escalar gunicorn. Lo intenté -k geventy aumenté --worker-connections, pero no ayudó mucho. Tuve aproximadamente el mismo éxito con --threadslos trabajadores de sincronización.

Noté algunas apariciones de Listen queue overflow: 16 already in queue awaiting acceptance (55 occurrences)in dmesg, lo que me llevó a aumentar kern.ipc.somaxconnhasta 4096, pero nuevamente: sin éxito.

Según la documentación de gunicorn, suelo heyver si el proxy está haciendo lo correcto y probar la carga del Endpoint: hey -c 100 -n 200 -H "Authorization: token ${token}" 'https://example.com/api/'

Lo que devuelve algo parecido (a veces un poco mejor, a veces un poco peor):

Status code distribution:
  [200] 126 responses
  [502] 74 responses

Configuración de nginx relevante:

worker_processes  auto;

events {
    worker_connections  1024;
    accept_mutex on;
    use kqueue;
}

upstream backend-api {
  server 127.0.0.1:8000 fail_timeout=0;
}

server {
    listen 443 ssl http2 accept_filter=httpready;
    server_name example.com;

    ssl_certificate /usr/local/etc/nginx/sites/example.com.crt;
    ssl_certificate_key /usr/local/etc/nginx/sites/example.com.key;

    location = /favicon.ico { access_log off; log_not_found off; }
    root /usr/local/www/example.com/web;
    index index.html ;

    keepalive_timeout 5;

    location ~  ^/(static|assets|index.html|$) {
        root /usr/local/www/example.com/web;
    }

    location / {
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header X-Forwarded-Proto $scheme;
      proxy_set_header X-Forwarded-Host $http_host;
      proxy_set_header X-Real-IP $proxy_add_x_forwarded_for;
      proxy_set_header Host $http_host;
      proxy_redirect off;
      proxy_intercept_errors on;
      proxy_pass http://backend-api;
    }
}

Ejecutando gunicorn con: gunicorn --workers=9 --bind 0.0.0.0:8000 --forwarded-allow-ips='*' -k gevent --worker-connections=1000 api.wsgi'

Parece que no puedo encontrar una solución a esto. No importa lo que intente, sólo puedo obtener "menos" 502 al cargar una página, pero nunca ninguno de manera confiable. ¿Qué me estoy perdiendo?

Gunicorn no informa ningún problema: las solicitudes nunca parecen llegar tan lejos.

información relacionada