Ich benutze einen PHP-Code über CLI, indem ich einen Cron-Job setze. Das Skript liest etwa 10000 Datensätze aus der Datenbank und führt 10000 neue Skripts (nach dem Befehl exec
) aus, ohne auf das vorherige Skript warten zu müssen. Ich benutze das, weil ich möchte, dass alle diese Aufgaben schnell ausgeführt werden. (Jeder dauert etwa 10 Sekunden).
Wenn die Anzahl der ausgeführten Aufgaben groß wird, wird die CPU-Auslastung zu 100% und kann nicht mit dem Server (CentOS) arbeiten. Wie kann ich damit umgehen?Begrenzen der CPU-Nutzung auf mehreren PHP-Skripten, die asynchron laufen
Antwort
Sie müssen die Anzahl der parallel laufenden Skripts zu einem bestimmten Zeitpunkt begrenzen, da die Ausführung von 10.000 gleichzeitigen Skripts Ihr System klar sättigt. Stattdessen sollten Sie jede Aufgabe anordnen und 25 oder 50 (was auch immer eine angemessene Menge an Last verursacht) gleichzeitig verarbeiten.
Ohne viel Wissen darüber, wie diese Skripte tatsächlich funktionieren, kann ich nicht wirklich viel Code-weise geben, aber Sie müssen auf jeden Fall eine Warteschlange haben, um die Anzahl der gleichzeitig laufenden Instanzen des Skripts zu begrenzen gleiche Zeit.
Auch Semaphore Check-out, sie könnten für diesen Hersteller/Consumer-Modell
Danke @edhurtig. Ich habe versucht, die Anzahl der asynchronen Anrufe zu begrenzen. Aber das Problem ist, dass, wenn ich 10000 Skript zusammen laufen CPU-Nutzung 100% für etwa 10 Minuten (zum Beispiel) und wenn ich 25 Skript bei einer CPU läuft 100% für etwa 10 Sekunden. Und das Problem besteht immer noch. –
Dann müssen Sie wahrscheinlich einen Multi-Core-Prozessor verwenden und eine CPU-Affinität auf die obere Hälfte der Kerne (oder so ähnlich) einstellen. Sie können die Prozesspriorität auch sehr niedrig festlegen. Ihre CPU wird immer noch ausschöpfen, aber der Prozessplaner wird diese Scouts von der CPU nehmen, wenn Sie andere Dinge tun. – edhurtig
Ich würde auch mit @mjh einverstanden sein, wenn all diese Skripte eine Curl sind, dann würde ich Guzzle oder andere empfehlen andere eine Sync-HTTP-Anfrage-Technologie. Es kann immer noch zu einer hohen CPU-Last kommen, wenn das der Fall ist, dann sollte mein Kommentar zur CPU-Affinität und Prozesspriorität helfen – edhurtig
Sie haben zu erhöhen RAM-Größe – Monty
1) nützlich sein konnten 10.000 neue Skripte nicht ausgeführt, es überhaupt nicht klug ist, haben Sie nicht 10000 CPU-Kerne 2) Identifizieren Sie, warum Ihre Aufgaben langsam sind - eine zunehmende Anzahl von Skripten macht sie nicht schneller. Wenn Sie in die Datenbank schreiben, führt das Erstellen von 10k-Skripten nicht dazu, dass es schneller ausgeführt wird. Du gehst völlig falsch herum. – Mjh
@Mjh Danke. Jedes Skript führt einen curl-Befehl für eine externe URL aus, wartet auf eine Antwort und schreibt sie dann in die Datenbank. Ich brauche die Antwort jeder Anfrage. Ich versuche nur [gearman] (http://gearman.org/) zu überprüfen. Ich habe eine zukünftige Entscheidung, nodejs zu verwenden, um dies durch Warteschlangen zu behandeln. –