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。
下面我们来看一下该版本的主要特性:
支持Hack和PHP 5
支持最新版的PHP 7主要特性
可以作为服务器单独运行
可以配置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的模式启用。
tcp socket
hhvm --mode server -d hhvm.server.type=fastcgi -d hhvm.server.port=9000
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页面。
测试的方法:逐渐调整并发量,使得结果出现失败的情况为止。
不涉及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
简单的对比结果
在当前测试环境(有资料显示,最新版的PHP 7的性能和hhvm差不多了),和保证正确率的基础上,hhvm有更大的并发量,响应也更快速。
就并发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 |