pcntl_fork()中意外的核心同步

时间:2017-10-15 11:48:45

标签: php multiprocessing fork pcntl

我正在研究PHP中的多核优化能力。我的测试程序分叉4个进程,这样每个进程的运行时间应该是之前的两倍。 代码是:

 $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);
    }
 }

现在看了CPU核心负载图后,我注意到2个核心几乎同时完成了工作: enter image description here 有时甚至3个核心都会尝试同步,并且它们的负载大约在同一时间内下降。

问题是 - 根据PHP测试脚本,为什么每个核心都没有完成工作,因为之前的核心需要两倍的时间?为什么两个核心几乎同时完成工作?

机器规格(lscpu output)

  

CPU:4

     

在线CPU列表:0-3

     

每个核心的线程:2

     

每个插座的核心:2

     

Socket(s):1

这种效果是否与测试机器只有2个真实内核相关,所以这种效果与超线程有关?

1 个答案:

答案 0 :(得分:0)

我有机会在有4个物理核心的机器上重复实验。关于机器CPU规范的lscpu输出:

  

CPU:4

     

在线CPU列表:0-3

     

每个核心的线程:1

     

每个插座的核心:4

     

Socket(s):1

运行实验时我有这样的CPU负载图: enter image description here

因此可以看出,在这种情况下,没有跨核心同步,并且每个核心加载的工作量是前一个核心的两倍。 确认上述效果与测试机器有4个虚拟核心(2个物理x 2个超线程)相关,而不仅仅是4个物理核心。