系统环境:
4核8G 内存,SSD硬盘
CentOS 6.5 64位
MySQL 5.6.29
PHP 5.6.22
Apache 2.2.31
nginx 1.10.0
启用OPcache
web架构为:
把php请求利用Nginx反向代理给后端的Apache或者MIXPHP。
测试之前,请先查看apache的ab测试注意点:http://www.piaoyi.org/linux/Apache-ab-test.html
一、基准性能测试
1000并发,1万请求数:
ab -n10000 -c1000 {URL}
1、Nginx静态文件
Nginx QPS: 14040/秒
暴力测试1.9万并发,19万请求(再高的并发服务就不稳定了):
没有失败请求,QPS: 10918/秒
2、原生PHP
PHP QPS :3246/秒
暴力测试 3000并发,3万请求:
QPS : 507/秒
并发再高的话,失败请求就逐渐多了起来,服务不可用了。
3、MIXPHP
基于 Swoole 的常驻内存型 PHP 高性能框架测试。
环境 swoole 1.10.4 、 mixphp 1.0.2
采用Nginx将php请求反向代理给mixphp:http://127.0.0.1:9501
QPS : 6455/秒
暴力测试:
1.6万并发,16万请求数(再高的并发出错的请求就逐渐多了)
QPS : 4020/秒
此时系统负载2,CPU 40%
4、Go语言
GO QPS:17489/秒
暴力测试2万并发,20万请求:
2万并发的请求下,没有失败请求,QPS :9053/秒。
基准测试由于不连接数据库,一般不用于实际项目业务场景的测试使用,仅供参考而已。
基准测试(不操作数据库)总结:
常规性能测试对比
ab并发和请求数 | 框架或语言 | QPS(每秒请求数) |
1000并发,10000请求 | Nginx | 14040 |
1000并发,10000请求 | 原生PHP | 3246 |
1000并发,10000请求 | MIXPHP | 6455 |
1000并发,10000请求 | Go语言 | 17489 |
暴力性能测试对比
ab并发和请求数 | 框架或语言 | QPS(每秒请求数) |
19000并发,190000请求 | Nginx | 10918 |
3000并发,30000请求 | 原生PHP | 507 |
16000并发,160000请求 | MIXPHP | 4020 |
20000并发,200000请求 | Go语言 | 9053 |
二、读取数据库的性能测试
连接mysql数据库,只读取数据表中一行记录:
测试之前,先把mysql的并发连接数提高,my.cnf里面:
[mysqld]
thread_cache_size = 256
max_connections = 10000
否则在高并发时,mysql就会报错:
Error 1040: Too many connections
1、原生PHP
php QPS :1735/秒
暴力测试
2000并发,2万请求(再高的并发失败请求就逐渐多了起来)
QPS :641/秒
2、Laravel5.1框架QPS测试
laravel框架测试的注意点:
1、由于框架加载太多依赖,并发1000,1万请求时已经产生3000多个失败请求,所以需要降低测试要求;
2、对于laravel框架来说,需要给ab加上 -k 参数进行测试,否则会出现错误:apr_poll: The timeout specified has expired (70007) 。
测试命令:
ab -k -c350 -n3500 http://la.dev/
并发350,3500请求数:
QPS : 58/秒
对laravel进行性能调优:
APP_DEBUG=false php artisan config:cache php artisan route:cache php artisan optimize --force
性能调优后,QPS上升到 118/秒
比未调优之前提高50%。
此时系统负载150,cpu 50%,高负荷运转。
3、MIXPHP框架(PDO短链接)
QPS : 2935/秒
mixphp暴力测试
1.5万并发,15万请求数(再高的并发就不稳定啦)
QPS : 2422/秒
此时系统负载6-8,cpu 60%,在高并发的场景下,QPS下降并不明显。
4、MIXPHP框架(PDO长链接)
QPS : 4367/秒
长链接比短链接并发性能提高 50%。
mixphp长链接暴力测试
1.5万并发,15万请求
QPS :3098/秒
此时系统负载6-8,cpu 60%,在高并发的场景下,QPS下降并不明显。
5、Go语言
go QPS :4247/秒
go暴力测试,并发1.8万,请求18万:
ab -n 180000 -c 18000 http://localhost:9090/hello
在如此高的并发下,没有失败的请求,QPS依然达到了3037/秒;
服务器负载load average 平均5-10,cpu约50%。
再测试比1.8万高的并发,ab的Failed requests就逐渐多起来了(ab最多支持2万并发),原因是mysql数据库撑不住了,mysql报错:“dial tcp 127.0.0.1:3306: connect: connection timed out”
go不愧为天生的高并发王者!
测试总结:
常规性能测试对比
ab并发和请求数 | 框架或语言 | QPS(每秒请求数) |
1000并发,10000请求 | 原生PHP | 1735 |
350并发,3500请求 | Laravel 5.1(开发模式) | 58 |
350并发,3500请求 | Laravel 5.1(生产模式) | 118 |
1000并发,10000请求 | MIXPHP(短链接) | 2935 |
1000并发,10000请求 | MIXPHP(长链接) | 4367 |
1000并发,10000请求 | Go语言 | 4247 |
暴力性能测试对比
ab并发和请求数 | 框架或语言 | QPS(每秒请求数) |
2000并发,20000请求 | 原生PHP | 641 |
15000并发,150000请求 | MIXPHP(短链接) | 2422 |
15000并发,150000请求 | MIXPHP(长链接) | 3098 |
18000并发,180000请求 | Go语言 | 3037 |
完。