2016-01-24 99 views
8

在第三方虚拟服务器上检查客户端的应用程序我注意到一个有趣的现象: 单个PHP进程似乎使用多个核心。据我所知,PHP无法做到这一点。PHP如何使用超过100%的CPU?

行为描述
这里的HTOP处理一个请求的Web应用程序时的输出: Output of htop
HTOP的输出,绿色福利用户的CPU和红色表示系统CPU

所有四核处于100%,只有一个PHP进程在396%的CPU和内存使用率很低。
我已经使用strace或pidstat调查了高系统cpu,但找不到任何IO问题。

服务器信息
虚拟服务器是使用Intel的VT-X虚拟化和Virtuozzo的在560兆赫提供4个内核一个的Debain LAMP环境:

Output of lscpu
lscpu的输出

该服务器在Apache 2.4.7(prefork)服务的快速CGI中运行PHP 5.5.9。 Nginx 1.9.4作为reverese代理,Plesk 12.5用于配置服务器。

示例PHP代码(编辑)
为了排除应用代码作为我使用简单的代码确认行为源:

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

两个或更多个PHP进程(编辑) 如果同时处理两个或多个请求,则每个进程在尽可能多的内核上运行(2个进程=> 2个内核,3个进程=> 1.33个内核)。

问题

  • 是否有可能为PHP同时使用一个以上的核心是什么?
  • 可能这与虚拟化有关?
  • 后续行动:系统CPU使用率占优势的原因是什么?
+2

这肯定是由PHP内部运行的代码引起的。它运行的是什么? – Will

+0

感谢您的意见,Will。 我已经用一个简单的for循环测试了行为,并且可以确认它。我在这个问题中加入了测试用例。 – PvB

+1

啊,明白了!谢谢。老实说,如果我们排除了代码,我们可能需要将它迁移到ServerFault,因为它可能会在那里获得正确的眼睛。据我所知,一个PHP FastCGI worker不能使用多个内核。但是,理论上,Linux调度程序可以在CPU之间切换进程。嗯... – Will

回答

0
  • PHP可以同时使用多个内核吗?

是的,它被称为pthreads。它旨在在PHP中实现真正的多线程。

  • 这可能与虚拟化有关吗?

不太可能。我认为和Will说的一样,这可能是由php发起的一个子进程。

  • 后续问题:系统CPU使用率占优势的原因是什么?

它与应用程序完全绑定。但是任何由PHP发起的多核心任务都可能出现这种情况。一个用于栅格化一桶svg图像的java应用程序。

+0

OP编辑了这篇文章,并解释说即使使用简单的for循环也会发生这种情况。所以我不认为涉及pthreads。但是,由于某种原因,Linux调度程序可能会将其切换到CPU?该脚本似乎没有任何形式的多核心。 – Will

+0

@JesusTheHun:谢谢你的回答。在这种情况下,Pthread不存在问题。它甚至用简单的for循环来做。但是我会将问题转移到服务器故障上,因为Will建议,因为这实际上与代码无关。 – PvB

+0

您可以在这里发布您的调查结果吗?我对答案感兴趣。 – JesusTheHun