Php pcntl_fork()中意外的内核同步
我正在研究PHP的多核优化能力。我的测试程序分叉了4个进程,因此每个进程的运行时间应该是前一个进程的两倍。 代码是:Php pcntl_fork()中意外的内核同步,php,multiprocessing,fork,pcntl,Php,Multiprocessing,Fork,Pcntl,我正在研究PHP的多核优化能力。我的测试程序分叉了4个进程,因此每个进程的运行时间应该是前一个进程的两倍。 代码是: $iters=20000000; 对于($c=0;$c
$iters=20000000;
对于($c=0;$c<4;$c++){
$pid=pcntl_fork();
如果($pid==0){
对于($i=0;$i<$iters*(pow(2,$c));$i++)
$x=$i我有机会在具有4个物理内核的机器上重复实验。lscpu
关于机器CPU规格的输出:
中央处理器:4
在线CPU列表:0-3
每个芯的螺纹数:1
每个插座的芯数:4
插座:1个
在运行实验时,我得到了这样的CPU负载图:
所以可以看出,在这种情况下,没有跨核同步,每个核加载的工作量大约是前一个核的两倍。
确认上述影响与测试机有4个虚拟核(2个物理x 2个超线程)相关,而不仅仅是4个物理核。我有机会在有4个物理核的机器上重复实验。lscpu
关于机器CPU规格的输出:
中央处理器:4
在线CPU列表:0-3
每个芯的螺纹数:1
每个插座的芯数:4
插座:1个
在运行实验时,我得到了这样的CPU负载图:
所以可以看出,在这种情况下,没有跨核同步,每个核加载的工作量大约是前一个核的两倍。
确认上述影响与测试机有4个虚拟核(2个物理x2超线程)而不仅仅是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);
}
}