2017-10-15 2 views
1

Ich untersuche Multi-Core-Optimierung Fähigkeiten in PHP. Mein Testprogramm forkiert 4 so, dass jeder doppelt so lange laufen soll wie vorher. -Code ist:Unerwartete Kerne Synchronisation in pcntl_fork()

$iters = 20000000; 

for ($c = 0; $c < 4; $c++) { 

    $pid = pcntl_fork(); 

    if ($pid == 0) { 

     for ($i=0; $i < $iters * (pow(2,$c)); $i++) 
      $x = $i << 2; 

     exit(0); 
    } 
} 

nun nach an CPU-Kernen Last Graph sucht, habe ich bemerkt, dass zwei Kerne Job beendet ist fast zur gleichen Zeit: enter image description here Manchmal sogar drei Kerne versucht, zu synchronisieren und ihre Last fällt ca. in der gleichen Zeit.

Frage ist - Warum jeder der Kerne nicht beendet Job nach zweimal so viel Zeit vorherigen Kern nach PHP-Test-Skript benötigt? Und warum zwei Kerne fast gleichzeitig ihren Job beenden?

Maschinenspezifikationen (lscpu output):

CPU (s): 4

On-line CPU (s) Liste: 0-3

Thread (s) pro Kern: 2

Core (e) pro Sockel: 2

Socket (s): 1

Kann es sein, dass dieser Effekt damit zusammenhängt, dass die Testmaschine nur 2 echte Kerne hat, also ist dieser Effekt irgendwie mit Hyper-Threading verbunden?

Antwort

0

Ich hatte die Chance, Experiment auf der Maschine mit 4 physischen Kernen zu wiederholen. lscpu Ausgang über Maschine CPU Spezifikation:

CPU (s): 4

Online-CPU (en): 0-3

Thread (s) pro Kern: 1

Core (e) pro Sockel: 4

Socket (s): 1

Und ich habe solche CPU-Last Graph bekam, als Experiment ausgeführt wird: enter image description here

So kann es, dass in diesem Fall zu sehen ist, gibt es keine Quer Kern Synchronisation und jeder Kern mit etwa doppelt so viele Arbeiten wie vorherige geladen . Bestätigt, dass der oben erwähnte Effekt damit zusammenhängt, dass die Testmaschine 4 virtuelle Kerne (2 physische x 2 Hyper-Threads) und nicht nur 4 physische Kerne hat.