Richieste concentrate in alcuni processi

Fenomeno

A volte, eseguendo il comando php start.php status, possiamo osservare che le richieste vengono concentrate nel trattamento di alcuni processi specifici, mentre altri processi rimangono completamente inattivi.

Meccanismo di preemption

Il metodo predefinito per il Workerman di acquisire le connessioni tra più processi è preemptive, il che significa che quando un client avvia una connessione, tutti i processi inattivi hanno la possibilità di ottenere questa connessione, con i più veloci che la ottengono per primi. Chi è più veloce è determinato dalla pianificazione del kernel del sistema operativo. Il sistema operativo potrebbe privilegiare il processo utilizzato più recentemente per ottenere il diritto di utilizzo della CPU, poiché le informazioni di contesto del processo precedente possono ancora risiedere nei registri della CPU, riducendo così il costo del cambio di contesto. Quindi, quando l'attività è sufficientemente veloce o durante i test di carico, è più probabile che le connessioni vengano concentrate in alcuni processi, poiché questa strategia può evitare frequenti cambi di processo, ottimizzando le prestazioni e non rappresentando un problema.

Meccanismo di round-robin

Il Workerman può cambiare il metodo di acquisizione delle connessioni impostando $worker->reusePort = true; in modo che il metodo di acquisizione diventi round-robin. In questo modo, il kernel distribuirà le connessioni in modo grossomodo uniforme tra tutti i processi, consentendo a tutti i processi di trattare le richieste simultaneamente.

Fallacia

Molti sviluppatori credono che coinvolgere tutti i processi nel trattamento delle richieste migliorerà le prestazioni, ma in realtà non è sempre così. Quando l'attività è sufficientemente semplice, il numero di processi impegnati nel trattamento delle richieste dovrebbe avvicinarsi al numero dei core della CPU per massimizzare la produttività del server. Ad esempio, su un server a 4 core, se impostiamo il numero di processi a 4, il QPS della misurazione "helloworld" è generalmente il più alto. Se il numero di processi coinvolti nel trattamento supera di molto il numero di core della CPU, il costo del contesto del processo aumenta e le prestazioni peggiorano. Per le attività che coinvolgono un database, un numero di processi pari a 3-6 volte il numero dei core della CPU potrebbe risultare in prestazioni migliori.