Anfragen konzentrieren sich auf bestimmte Prozesse
Phänomen
Manchmal sehen wir durch den Befehl php start.php status, dass Anfragen in bestimmten Prozessen verarbeitet werden, während andere Prozesse völlig untätig sind.
Preemption-Mechanismus
Die Art und Weise, wie Workerman mehrere Prozesse Verbindungen erhält, ist standardmäßig preemptiv. Das bedeutet, dass alle freien Prozesse die Möglichkeit haben, diese Verbindung zu erhalten, sobald ein Client eine Verbindung initiiert. Der schnellere Prozess erhält die Verbindung zuerst. Wer schneller ist, wird durch den Scheduler des Betriebssystems bestimmt. Das Betriebssystem könnte den zuletzt verwendeten Prozess bevorzugen, um die CPU-Nutzung zu übernehmen, da möglicherweise noch Kontextinformationen des vorherigen Prozesses im CPU-Register vorhanden sind. Dies kann die Kosten für den Kontextwechsel reduzieren. Daher kann es bei ausreichend schneller Geschäftsanwendung oder während der Lasttests häufiger vorkommen, dass Verbindungen von bestimmten Prozessen verarbeitet werden, da diese Strategie häufige Prozesswechsel vermeidet und die Leistung oft optimal ist, was kein Problem darstellt.
Round-Robin-Mechanismus
Workerman kann durch Setzen von $worker->reusePort = true; die Art und Weise, wie Verbindungen erhalten werden, auf Round-Robin umstellen. In diesem Modus verteilt der Kernel die Verbindungen annähernd gleichmäßig auf alle Prozesse, sodass alle Prozesse zusammen die Anfragen bearbeiten.
Missverständnis
Viele Entwickler glauben, dass eine höhere Anzahl an Prozessen, die an der Bearbeitung von Anfragen beteiligt sind, die Leistung verbessert. Tatsächlich ist das nicht unbedingt der Fall. Wenn die Geschäftslogik ausreichend einfach ist, wird die Durchsatzrate des Servers umso höher, je näher die Anzahl der verarbeiteten Prozesse an der Anzahl der CPU-Kerne liegt. Zum Beispiel erreicht ein 4-Kern-Server mit 4 Prozessen die höchsten QPS bei "helloworld"-Tests. Wenn die Anzahl der an der Bearbeitung beteiligten Prozesse deutlich die Anzahl der CPU-Kerne übersteigt, werden die Kosten für den Prozesskontext höher, und die Leistung wird schlechter. Bei geschäftlichen Anwendungen, die üblicherweise eine Datenbank verwenden, kann es jedoch besser sein, die Anzahl der Prozesse auf das 3- bis 6-Fache der CPU-Kerne zu setzen, um eine bessere Leistung zu erzielen.