hhvm介绍和简单的本地压测对比

HHVM介绍

HHVM(HipHop Virtual Machine)是Facebook开发的开源虚拟机,可以运行Hack(Facebook自己开发的)和PHP。使用just-in-time(JIT)的编译方式以及其他技术,让PHP代码的执行性能大幅提升。据Facebook介绍,与PHP 5.2引擎+APC相比,HHVM可以处理的Web请求吞吐量增加了9倍,而内存消耗减少了5倍。

因为好奇,我Google了一下,了解Facebook开发全新PHP虚拟机的初衷。Facebook整个web系统已经非常庞大和复杂,想要重构整个系统提升性能变得非常困难。无论是迁移到性能更好的语言上,如 Java、C++、Go或者通过 RPC 将功能分离出来用其它语言实现,都需要投入巨大的成本。于是就从优化PHP着手,进而开发了全新的PHP虚拟机和Hack语言。

截至目前,在 github 上的最新版本是3.15。
下面我们来看一下该版本的主要特性:

  1. 支持Hack和PHP 5

  2. 支持最新版的PHP 7主要特性

  3. 可以作为服务器单独运行

  4. 可以配置fast-cgi模式,配合apache或者nginx运行

安装

系统环境

型号名称: MacBook Pro
操作系统版本:10.12.1 (16B2657)
处理器名称: Intel Core i7
处理器数目: 1
核总数: 4
内存: 16 GB

meizus-MacBook-Pro:~ meizu$ php -v
PHP 5.6.26 (cli) (built: Oct 10 2016 16:57:58) (DEBUG)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
    with Xdebug v2.4.1, Copyright (c) 2002-2016, by Derick Rethans
meizus-MacBook-Pro:~ meizu$ nginx -v
nginx version: nginx/1.10.1
meizus-MacBook-Pro:~ meizu$ php-fpm -v
PHP 5.6.26 (fpm-fcgi) (built: Oct 10 2016 16:58:00) (DEBUG)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
    with Xdebug v2.4.1, Copyright (c) 2002-2016, by Derick Rethans

hhvm 安装过程可以参照官方文档(好吧,需要呢,安装时间巨长)。
可以从源码编译,我们用最简单的方式吧,借助Homebrew

brew tap hhvm/hhvm
brew install hhvm

安装完毕,测试是否安装成功。直接以fast-cgi的模式启用。

  1. tcp socket

hhvm --mode server -d hhvm.server.type=fastcgi -d hhvm.server.port=9000
  1. unix sock

hhvm --mode server -d hhvm.server.type=fastcgi -d hhvm.server.file_socket=/var/run/hhvm/sock

我们采用9005端口,以daemon方式启动。

meizus-MacBook-Pro:~ meizu$ sudo hhvm --mode daemon -d hhvm.server.type=fastcgi -d hhvm.server.port=9005
Log file not specified under daemon mode.\n\n
meizus-MacBook-Pro:~ meizu$ sudo lsof -i -n -P | grep hhvm
hhvm      28227           root   14u  IPv6 0x3672bb2a611b41f9      0t0    TCP *:9005 (LISTEN)

本地测试

系统参数调整

默认的超时时间参数TIME_WAIT是15秒,调整为1秒。

meizus-MacBook-Pro:~ meizu$ sysctl net.inet.tcp.msl
net.inet.tcp.msl: 15000
meizus-MacBook-Pro:~ meizu$ sudo sysctl -w net.inet.tcp.msl=1000
net.inet.tcp.msl: 15000 -> 1000
meizus-MacBook-Pro:~ meizu$ sysctl net.inet.tcp.msl
net.inet.tcp.msl: 1000

查看最大文件描述符,调整为10000

meizus-MacBook-Pro:~ meizu$ ulimit -n
256
meizus-MacBook-Pro:~ meizu$ ulimit -n 10000
meizus-MacBook-Pro:~ meizu$ ulimit -n
10000

压测工具

siege
Mac安装可以参考这篇文章

文件

测试本地的app.bbs.meizu.cn其中一个框架接口,输出H5页面。

测试的方法:逐渐调整并发量,使得结果出现失败的情况为止。

http://app.bbs.meizu.cn/index...

不涉及redis和mysql操作。

php-fpm

配置

154       location ~ .*\.(php|php5)?$ {
155         # php-fpm
156         fastcgi_pass   127.0.0.1:9000;
157         # hhvm
158         # fastcgi_pass   127.0.0.1:9005;
159         fastcgi_index  index.php;
160         fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
161         include        fastcgi_params;
162       
163       }

siege压测结果

并发100,重复运行 10次

meizus-MacBook-Pro:~ meizu$ siege -c 100 -r 10 http://app.bbs.meizu.cn/index.php?mod=album

Transactions:                5000 hits
Availability:              100.00 %
Elapsed time:                7.22 secs
Data transferred:          142.46 MB
Response time:                0.06 secs
Transaction rate:          692.52 trans/sec
Throughput:               19.73 MB/sec
Concurrency:               44.77
Successful transactions:        5000
Failed transactions:               0
Longest transaction:            1.30
Shortest transaction:            0.00

并发150,重复运行 20次

meizus-MacBook-Pro:~ meizu$ siege -c 150 -r 20 http://app.bbs.meizu.cn/index.php?mod=album

Transactions:               14416 hits
Availability:               99.04 %
Elapsed time:               20.25 secs
Data transferred:          408.29 MB
Response time:                0.13 secs
Transaction rate:          711.90 trans/sec
Throughput:               20.16 MB/sec
Concurrency:               91.16
Successful transactions:       14526
Failed transactions:             140
Longest transaction:            1.51
Shortest transaction:            0.00

hhvm

配置

154       location ~ .*\.(php|php5)?$ {
155         # php-fpm
156         # fastcgi_pass   127.0.0.1:9000;
157         # hhvm
158         fastcgi_pass   127.0.0.1:9005;
159         fastcgi_index  index.php;
160         fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
161         include        fastcgi_params;
162 
163       }

siege压测结果

并发100,重复运行 10次

meizus-MacBook-Pro:~ meizu$ siege -c 100 -r 10 http://app.bbs.meizu.cn/index.php?mod=album

Transactions:                5000 hits
Availability:              100.00 %
Elapsed time:                3.87 secs
Data transferred:          139.07 MB
Response time:                0.00 secs
Transaction rate:         1291.99 trans/sec
Throughput:               35.94 MB/sec
Concurrency:                5.39
Successful transactions:        5000
Failed transactions:               0
Longest transaction:            0.15
Shortest transaction:            0.00

并发150,重复运行 20次

meizus-MacBook-Pro:~ meizu$ siege -c 150 -r 20 http://app.bbs.meizu.cn/index.php?mod=album

Transactions:               15000 hits
Availability:              100.00 %
Elapsed time:                7.91 secs
Data transferred:          417.22 MB
Response time:                0.01 secs
Transaction rate:         1896.33 trans/sec
Throughput:               52.75 MB/sec
Concurrency:               21.85
Successful transactions:       15000
Failed transactions:               0
Longest transaction:            0.50
Shortest transaction:            0.00

并发200,重复运行 20次

Transactions:              19885 hits
Availability:              99.66 %
Elapsed time:               9.56 secs
Data transferred:         548.19 MB
Response time:              0.03 secs
Transaction rate:        2080.02 trans/sec
Throughput:            57.34 MB/sec
Concurrency:               57.46
Successful transactions:       19892
Failed transactions:              67
Longest transaction:            1.36
Shortest transaction:           0.00

简单的对比结果

  1. 在当前测试环境(有资料显示,最新版的PHP 7的性能和hhvm差不多了),和保证正确率的基础上,hhvm有更大的并发量,响应也更快速。

  2. 就并发150,重复运行 20次的情况做对比

测试 官方 hhvm 差距
完成处理次数 14416 15000 +584
成功率 99.04% 100% +9.96%
耗时 20.25 secs 7.91 secs -12.34 secs
数据传输 408.29 MB 417.22 MB +9MB
响应耗时 0.13 secs 0.01 secs -0.12secs
平均每秒处理请求数 711.90 1896.33 +1184
平均每秒传送数据 20.16 MB/sec 52.75 MB/sec +32.59 MB/sec
实际最高并发连接数 91.16 21.85 -70
成功处理次数 14526 15000
失败的请求数 140 0
每次传输所花最长时间 1.51 0.50 -1
每次传输所花最短时间 0.00 0.00

你可能感兴趣的:(php,hhvm)