测试简介:
HipHop VM(HHVM)是Facebook推出的用来执行PHP代码的虚拟机,它是一个PHP的JIT(Just-In-Time)编译器,同时具有产生快速代码和即时编译的优点。根据Facebook透漏,HHVM在速度方面获得了显著改进,比目前使用的PHP解释器快60%,而使用内存减少90%。
测试目的:HHVM虚拟机以Jit方式编译PHP程序后运行的性能,比PHP原生性能是否有提高。主要从三方面进行对比:CPU,IO,MEM性能。
测试环境:
服务器系统: CentOSrelease 6.3 (Final) CPU: 16核 Intel(R)Xeon(R) CPU E5620 @ 2.40GHz 内存: 16G
软件环境: HHVM虚拟机版本:HipHopVM 2.4.0
PHP版本:PHP 5.3.8
NGINX版本:1.4.2
测试策略:
一、单次执行php程序,记录程序完成时间;
1. Time php test_xx.php 使用php方式运行
2. Time hhvm test_xx.php 使用hhvm方式运行(未开启Jit)
3. Time hhvm –v “Eval.Jit=true” test_xx.php 使用hhvm的Jit方式运行
二、并发执行php程序,记录每分钟运行次数;
Webbench–c 20 –t 60 http://172.30.205.22/test_cpu.php php方式并发运行
Webbench–c 20 –t 60 http://172.30.205.22:90/test_cpu.php hhvm方式并发运行
参数说明:
-c并发20个用户
-t运行60秒
测试结果一:(单次运行)
Cpu测试图:
Cpu测试表:
PHP | HHVM | HHVM_Jit |
real 0m6.557s | real 0m5.346s | real 0m0.437s |
user 0m6.533s | user 0m5.301s | user 0m0.404s |
sys 0m0.010s | sys 0m0.030s | sys 0m0.026s |
CPU操作性能对比 |
IO测试图:
IO测试表:
PHP | HHVM | HHVM_Jit |
real 0m14.041s | real 0m17.149s | real 0m17.319s |
user 0m4.517s | user 0m6.275s | user 0m6.598s |
sys 0m9.424s | sys 0m10.754s | sys 0m10.611s |
IO操作性能对比 |
MEM测试图:
MEM测试表:
PHP | HHVM | HHVM_Jit |
real 0m1.994s | real 0m1.090s | real 0m1.359s |
user 0m1.692s | user 0m0.950s | user 0m1.213s |
sys 0m0.297s | sys 0m0.133s | sys 0m0.138s |
MEM操作性能对比 |
测试结果二:(并发运行):
Cpu测试图表:
PHP | HHVM_Jit |
63 pages/min | 1819 pages/min |
|
IO测试图表:
PHP | HHVM_Jit |
20 pages/min | 0 pages/min |
不到1,不计数 |
MEM测试图表:
PHP | HHVM_Jit |
272 pages/min | 453 pages/min |
|
测试结论:
1、 以上CPU数据表明HHVM2.4在对CPU的性能优化上提升明显,HHVM使用Jit方式编译后,执行效率提升30倍;
2、 以上IO数据表明HHVM2.4在磁盘性能上没有起到优化的作用,甚至不如原生PHP的读写效率;
3、 以上MEM数据表明HHVM在内存性能优化方面稍有提升,提升效率将近1倍;
综上所述HHVM适合CPU密集型程序,而IO和MEM操作频繁的PHP代码并不需要HHVM的支持,HHVM本身还不成熟,很多PHP扩展支持的不是很好。而且在编译PHP过程也需要耗时,并且这种编译型代码会涉及到内存泄露,进程死锁等风险。如果能够在HHVM崩溃时自动转移服务到PHP+NGINX上,有这样的容错方案则可以尝试使用。
附录(测试代码):
1、cpu操作密集型代码Test_cpu.php如下:
<?php
function fib($n)
{
if ($n <= 2)
return 1;
else
return fib($n-1) + fib($n-2);
}
$n = 36;
printf("fib(%d) = %d\n",$n, fib($n, 2));
?>
2、IO操作密集型代码Test_io.php如下:
<?php
for($i =0; $i < 1000; $i++){
for($j =0;$j < 1000; $j++)
{
$h = fopen('./gfiles/'.$i, 'a');
fwrite($h,’dddddddddddddddddddddddddddddddfffffffffffffffffffffffffffffffff');
fclose($h);
}
}
?>
3、MEM操作密集型代码Test_mem.php如下:
<?php
ini_set('memory_limit','1024M');
$arr = array();
for($i = 0; $i < 2000000 ;$i++) {
$arr[$i] = $i;
}
$arr2 = array();
foreach($arr as $val){
$arr2[] = $val . $val;
}
?>