100 gleichzeitige Anfragen an eine Django-App mit Gunicorn führen zu „54: Verbindung vom Peer zurückgesetzt“ und 502

100 gleichzeitige Anfragen an eine Django-App mit Gunicorn führen zu „54: Verbindung vom Peer zurückgesetzt“ und 502

Ich hoste eine Django-App, die als API-Endpunkt dient. Leider führt die App, die die API verwendet, beim Laden der Seite viele gleichzeitige Anfragen aus (im Bereich von 80-90 Anfragen).

Nginx läuft als Reverse-Proxy vor Gunicorn und meldet folgendes Problem: kevent() reported that connect() failed (54: Connection reset by peer) while connecting to upstream

Das hat mich dazu gebracht, Gunicorn zu skalieren. Ich habe versucht -k gevent, zu erhöhen --worker-connections, aber es hat nicht viel geholfen. Ich hatte ungefähr den gleichen Erfolg mit --threadsund Sync-Workern.

Mir sind einige Vorkommen von Listen queue overflow: 16 already in queue awaiting acceptance (55 occurrences)in aufgefallen dmesg, die mich dazu veranlasst haben, den Wert kern.ipc.somaxconnauf bis zu 4096 zu erhöhen, aber auch hier: ohne Erfolg.

Gemäß der Gunicorn-Dokumentation verwende ich heyFolgendes, um zu prüfen, ob der Proxy das Richtige tut, und um einen Belastungstest des Endpunkts durchzuführen: hey -c 100 -n 200 -H "Authorization: token ${token}" 'https://example.com/api/'

Das Ergebnis ist ungefähr so ​​(manchmal etwas besser, manchmal etwas schlechter):

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

Relevante nginx-Konfiguration:

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;
    }
}

Gunicorn ausführen mit: gunicorn --workers=9 --bind 0.0.0.0:8000 --forwarded-allow-ips='*' -k gevent --worker-connections=1000 api.wsgi'

Ich kann dafür keine Lösung finden. Egal, was ich versuche, ich bekomme beim Laden der Seite immer „weniger“ 502er, aber nie zuverlässig gar keine. Was übersehe ich?

Gunicorn meldet keine Probleme – die Anfragen scheinen nie so weit zu gelangen.

verwandte Informationen