Sellerie für HTTP-Aufrufe von Drittanbietern optimieren

8

Wir verwenden Sellerie, um HTTP-Anrufe von Dritten zu tätigen. Wir haben rund 100 Aufgaben, die einfach die HTTP-API-Aufrufe von Drittanbietern aufrufen. Einige Tasks rufen die APIs in großen Mengen auf, z. B. eine halbe Million Anfragen um 4 Uhr morgens, während einige kontinuierliche Streams von API-Aufrufen fast einmal oder zweimal pro Sekunde Anfragen erhalten.

Die Reaktionszeit für API-Aufrufe liegt meist zwischen 500 und 800 ms.

Bei Sellerie sehen wir sehr niedrige Lieferraten. Für die meisten der oben genannten Aufgaben beträgt die maximale Zustellungsrate etwa 100 / s (maximal) bis fast 1 / s (min). Ich glaube, das ist sehr schlecht und etwas ist definitiv falsch, aber ich bin nicht in der Lage herauszufinden, was es ist.

Wir haben mit einem Cluster von 3 Servern begonnen und schrittweise einen Cluster von 7 Servern geschaffen, aber ohne Verbesserung. Wir haben mit verschiedenen Parallelitätseinstellungen von Autoscale zu festen 10, 20, 50, 100 Arbeitern versucht. Es gibt kein Ergebnis-Backend und unser Broker ist RabbitMQ.

Da unsere Task-Ausführungszeit sehr klein ist, weniger als eine Sekunde für die meisten, haben wir auch versucht, Prefetch-Zählungen auf verschiedene Werte zu begrenzen.

--time-limit=1800 --maxtasksperchild=1000 -Ofair -c 64 --config=celeryconfig_production

Server sind 64 G RAM, Centos 6.6.

Können Sie mir eine Idee geben, was falsch sein könnte oder Hinweise, wie Sie es lösen können?

Sollen wir mit gevents gehen? Obwohl ich wenig Ahnung davon habe, was es ist.

    
Madhur Ahuja 19.03.2016, 19:33
quelle

1 Antwort

5

Zuallererst - GIL - das sollte kein Fall sein, da mehr Maschinen schneller gehen sollten. Aber - bitte prüfen Sie, ob die Last nur auf einen Kern des Servers geht ...

Ich bin mir nicht sicher, ob der ganze Sellerie in Ihrem Fall eine gute Idee ist. Das ist großartige Software mit einer Menge Funktionalität. Aber wenn das nicht benötigt wird, ist es besser, etwas einfacher zu verwenden - nur für den Fall, dass einige dieser Funktionen stören. Ich würde kleine PoC schreiben, andere Client-Software überprüfen, wie Pika. Wenn das nicht helfen würde - das Problem ist mit der Infrastruktur. Wenn hilft - Sie haben eine Lösung. :)

Es ist wirklich schwer zu sagen, was vor sich geht. Es kann etwas mit IO oder zu viele Netzwerkanrufe sein ... Ich würde zurücktreten - um etwas zu finden, das funktioniert. Schreiben Sie Integrationstests, aber stellen Sie sicher, dass Sie 2-3 Maschinen verwenden, nur um den vollen tcp-Stack zu verwenden. Stellen Sie sicher, CI zu haben, und führen Sie diese Tests einmal am Tag oder so aus - um zu sehen, ob die Dinge in die richtige Richtung gehen.

    
Michał Zaborowski 19.04.2016, 23:09
quelle