Ich habe einen Server, auf dem eine von Gunicorn bereitgestellte Django-Anwendung und eine Celery-Task-Warteschlange laufen.
WaffenhornDokumente empfehlen(2 x $num_cores) + 1 als Standardanzahl an Workern.
Sellerie-Dokumentezeigen, dass die Anzahl der Celery-Worker standardmäßig 1 x $num_cores beträgt.
Und beide schlagen vor, zu experimentieren, um die richtige Zahl zu finden.
Meine Frage ist, was wäre eine gute Faustregel, um sowohl Gunicorn als auch Celery auf derselben Maschine laufen zu lassen? Sollte ich auf einer Maschine mit acht Kernen mit 17 Gunicorn- und 8 Celery-Workern beginnen? Oder wäre es sinnvoll, beispielsweise mit 9 Gunicorn- und 4 Celery-Workern zu beginnen?
Das System ist CPU-gebunden, falls das hilft.
Antwort1
Jede Art der Leistungsoptimierung ist oft mehr ein Sprichwort als eine feste Regel. Ich musste kürzlich etwas Ähnliches mit meiner Django-App machen, die jemand missbraucht hatte. Wenn Sie sowohl Gunicorn als auch Celery auf derselben Maschine ausführen, sollten Sie idealerweise mit einem ausgewogeneren Ansatz beginnen, anstatt die Gunicorn-Worker voll auszulasten. Das ist mein Ansatz:
Gunicorn-Arbeiter:
- Beginnen Sie mit einer etwas geringeren Anzahl von Gunicorn-Arbeitern nach der Formel: 2 * $num_cores + 1
- Für eine 8-Core-Maschine können Sie mit 8-12 Gunicorn-Arbeitern beginnen
- Der Grund hierfür besteht darin, dass Sie sicherstellen möchten, dass noch einige CPU-Ressourcen für Celery-Worker übrig sind, da Celery-Aufgaben CPU-intensiv sein können.
Selleriearbeiter:
- Sie können die „empfohlene“ Anzahl an Celery-Mitarbeitern verwenden
- Es kann als 1 * $num_cores definiert werden.
- Bei einer 8-Kern-Maschine können Sie beispielsweise mit 8 Celery-Workern beginnen.
Daher könnte auf einer 8-Core-Maschine ein gutes Start-Setup wie folgt aussehen:
- Gunicorn: 8-12 Arbeiter
- Sellerie: 8 Arbeiter
Das Ziel besteht darin, die Gunicorn-Arbeiter nicht zu überfordern. Sie lassen die CPU-Ressourcen zumindest für die Celery-Arbeiter übrig.