100 solicitações simultâneas para um Django-App com Gunicorn levam a "54: Conexão redefinida por peer" e 502's

100 solicitações simultâneas para um Django-App com Gunicorn levam a "54: Conexão redefinida por peer" e 502's

Estou hospedando um Django-App que serve como API-Endpoint. Infelizmente, o aplicativo que usa a API faz muitas solicitações simultâneas no carregamento da página (na faixa de 80 a 90 solicitações).

O Nginx está sendo executado como proxy reverso na frente do gunicorn e relata o seguinte problema: kevent() reported that connect() failed (54: Connection reset by peer) while connecting to upstream

Isso me levou a escalar o gunicórnio. Eu tentei -k gevente aumentei --worker-connections, mas não ajudou muito. Tive quase o mesmo sucesso com --threadsos trabalhadores de sincronização.

Notei algumas ocorrências de Listen queue overflow: 16 already in queue awaiting acceptance (55 occurrences)in dmesg, que me levaram a aumentar kern.ipc.somaxconnpara 4096, mas novamente: Sem sucesso.

De acordo com a documentação do gunicorn, eu uso heypara ver se o proxy está fazendo a coisa certa e testando a carga do Endpoint: hey -c 100 -n 200 -H "Authorization: token ${token}" 'https://example.com/api/'

O que retorna algo nesse sentido (às vezes um pouco melhor, às vezes um pouco pior):

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

Configuração 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;
    }
}

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

Não consigo encontrar uma solução para isso. Não importa o que eu tente, só consigo obter "menos" 502 no carregamento de uma página, mas nunca nenhum de forma confiável. o que estou perdendo?

Gunicorn não relata nenhum problema - os pedidos parecem nunca chegar tão longe.

informação relacionada