uWSGI-python-highload-Konfiguration

Wir haben eine große EC2-Instanz mit 32 Kernen, derzeit läuft Nginx, Tornado und Redis, portion im Durchschnitt 5K Anfragen pro Sekunde. Alles scheint gut zu funktionieren, aber die CPU-Last bereits das erreichen von 70% und wir haben die Unterstützung von noch mehr Anfragen. Einer der Gedanken war, Sie zu ersetzen Tornado mit uWSGI, weil wir nicht wirklich verwenden, async-features der Tornado.

Unsere Anwendung besteht aus einer Funktion, es erhält eine JSON - (~=4KB), etwas blockieren, aber sehr schnellen Sachen (Redis) und JSON zurückgeben.

  • Proxy HTTP-Anfrage an einen der Tornado-Instanzen (Nginx)
  • Parsen von HTTP-Requests (Tornado)
  • POST Lesen Körper string (stringified JSON) und wandelt es in ein python-dictionary (Tornado)
  • Daten aus Redis (Sperrung) auf derselben Maschine (py-redis mit hiredis)
  • Verarbeiten der Daten (Python ist3.4)
  • Update Redis auf der gleichen Maschine (py-redis mit hiredis)
  • Vorbereiten stringified JSON-response (Python ist3.4)
  • Senden der Antwort an den proxy (Tornado)
  • Senden der Antwort an client (Nginx)

Dachten wir, dass die Verbesserung der Geschwindigkeit kommt von uwsgi-Protokoll, können wir Nginx installieren auf separaten server, und der proxy alle Anfragen an uWSGI mit uwsgi-Protokoll. Aber nach dem Versuch alle möglichen Konfigurationen und ändern von OS Parameter, die wir noch nicht bekommen kann es arbeiten auch auf die aktuelle Last.
Die meisten der Zeit, nginx log enthält 499 und 502 Fehler. Bei einigen Konfigurationen ist es gerade aufgehört zu empfangen neue Anfragen, wie es auf ein OS beschränken.

Also wie gesagt, wir haben 32 Kerne, 60GB Speicher frei und sehr schnellen Netzwerk. Das tun wir nicht, harte Sachen, nur sehr schnell blockierenden Operationen. Was ist die beste Strategie in diesem Fall? Prozesse, Threads, Async? Was OS-Parameter sollten gesetzt werden?

Aktuelle Konfiguration ist:

[uwsgi]
master = 2
processes = 100
socket = /tmp/uwsgi.sock
wsgi-file = app.py
daemonize = /dev/null
pidfile = /tmp/uwsgi.pid
listen = 64000
stats = /tmp/stats.socket
cpu-affinity = 1
max-fd = 20000
memory-report = 1
gevent = 1000
thunder-lock = 1
threads = 100
post-buffering = 1

Nginx config:

user www-data;
worker_processes 10;
pid /run/nginx.pid;

events {
    worker_connections 1024;
    multi_accept on;
    use epoll;
}

OS config:

sysctl net.core.somaxconn
net.core.somaxconn = 64000

Ich weiß, die Grenzen sind zu hoch, begann zu versuchen, jeden Wert möglich.

UPDATE:

Landete ich mit der folgenden Konfiguration:

[uwsgi]
chdir = %d
master = 1
processes = %k
socket = /tmp/%c.sock
wsgi-file = app.py
lazy-apps = 1
touch-chain-reload = %dreload
virtualenv = %d.env
daemonize = /dev/null
pidfile = /tmp/%c.pid
listen = 40000
stats = /tmp/stats-%c.socket
cpu-affinity = 1
max-fd = 200000
memory-report = 1
post-buffering = 1
threads = 2
InformationsquelleAutor offline15 | 2015-04-06
Schreibe einen Kommentar