2016-01-24 11 views
8

Controllo dell'applicazione di un client su un server virtuale di terze parti Ho notato un fenomeno intrigante: I singoli processi PHP sembrano utilizzare più di un core. Per quanto ne so, PHP non può farlo.In che modo PHP utilizza più del 100% della CPU?

descrizione problem
seguito il risultato di htop durante la manipolazione una singola richiesta all'applicazione web: Output of htop
Produzione di htop, verde CPU in uso e l'essere rosso CPU sistema

Tutto quattro core sono al 100%, c'è solo un processo PHP al 396% della CPU e l'utilizzo della memoria è basso.
Ho già studiato l'alta cpu del sistema usando strace o pidstat ma non ho trovato alcun problema di I/O.

informazioni Server
Il server virtuale è un ambiente Debain LAMP utilizzando virtualizzazione VT-x di Intel e Virtuozzo offrendo 4 core a 560 MHz:

Output of lscpu
uscita di lscpu

Il server esegue PHP 5.5.9 in CGI veloce servito da apache 2.4.7 (prefork). Nginx 1.9.4 serve come proxy reverese, Plesk 12.5 è usato per configurare il server.

Esempio di codice PHP (EDIT)
Per escludere il codice applicazioni come sorgente ho confermato il comportamento utilizzando un semplice pezzo di codice:

$array = array('z', 'y', 'x', 'h', 'd', 's', 'w', 'q', 'a'); 
for ($i=0; $i < 9999999; $i++) { 
    sort($array); // Delaying execution 
} 
echo 'loop ended'; 

Due o più processi PHP (EDIT) Se due o più richieste vengono gestite simultaneamente, ogni processo viene eseguito su più core possibile (2 processi => 2 core ciascuno, 3 processi => 1,33 core ciascuno).

Domande

  • è possibile per PHP per utilizzare più di un core contemporaneamente?
  • Potrebbe essere correlato alla virtualizzazione?
  • Follow-Up: quale potrebbe essere il motivo per cui l'utilizzo della CPU di sistema è dominante?
+2

Questo potrebbe sicuramente essere causato dal codice in esecuzione all'interno di PHP. Cosa sta facendo? – Will

+0

Grazie per il tuo contributo, Will. Ho effettivamente testato il comportamento utilizzando un semplice ciclo for e lo posso confermare. Ho aggiunto il caso di test alla domanda. – PvB

+1

Ah, capito! Grazie. Onestamente, se abbiamo escluso il codice, potrebbe essere necessario migrare questo a ServerFault, in quanto potrebbe ottenere il giusto tipo di occhi lì. Per quanto ne so, un singolo lavoratore PHP FastCGI non può utilizzare più core. Ma, in teoria, lo scheduler di Linux potrebbe cambiare il processo tra le CPU. Hmm ... – Will

risposta

0
  • È possibile che PHP utilizzi più di un core contemporaneamente?

Sì, si chiama pthreads. È progettato per fare vero multi-threading in PHP.

  • Potrebbe essere correlato alla virtualizzazione?

Improbabile.Penso che sia lo stesso di Will, probabilmente è un sotto processo lanciato da php.

  • Follow-up: quale potrebbe essere il motivo per cui l'utilizzo della CPU di sistema è dominante?

È completamente collegato all'applicazione. Ma qualsiasi attività multi-core lanciata da php potrebbe presentarsi così. Un'app java per rasterizzare un bucket di immagine svg per esempio.

+0

OP ha modificato il post e ha spiegato che sta accadendo anche con un semplice ciclo 'for'. Quindi non penso che siano coinvolti i pthreads. Ma forse lo scheduler di Linux lo sta passando tra le CPU per qualche motivo? Lo script non sembra essere multi-core in alcun modo. – Will

+0

@JesusTheHun: Grazie per la risposta. In questo caso, Pthread è fuori questione. Lo fa persino con il ciclo for. Ma migrerò la domanda al fault del server come suggerito da Will in quanto in realtà non è correlato al codice. – PvB

+0

Potresti postare qui il risultato della tua indagine? Sono interessato alla risposta. – JesusTheHun