系统环境:

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测试注意点:Apache的ab进行并发性能测试的注意点

一、基准性能测试

1000并发,1万请求数:


ab -n10000 -c1000 {URL}


1、Nginx静态文件

laravel increment 并发 laravel可以支持多少并发_php

Nginx QPS: 14040/秒

暴力测试1.9万并发,19万请求(再高的并发服务就不稳定了):

laravel increment 并发 laravel可以支持多少并发_性能测试_02

没有失败请求,QPS: 10918/秒

2、原生PHP

laravel increment 并发 laravel可以支持多少并发_nginx_03

PHP QPS :3246/秒

暴力测试 3000并发,3万请求:

laravel increment 并发 laravel可以支持多少并发_PHP_04

QPS : 507/秒

并发再高的话,失败请求就逐渐多了起来,服务不可用了。

3、MIXPHP

基于 Swoole 的常驻内存型 PHP 高性能框架测试。

环境 swoole 1.10.4 、 mixphp 1.0.2

采用Nginx将php请求反向代理给mixphp:http://127.0.0.1:9501

laravel increment 并发 laravel可以支持多少并发_PHP_05

QPS : 6455/秒

暴力测试:

1.6万并发,16万请求数(再高的并发出错的请求就逐渐多了)

laravel increment 并发 laravel可以支持多少并发_nginx_06

QPS : 4020/秒

此时系统负载2,CPU 40%

4、Go语言

laravel increment 并发 laravel可以支持多少并发_性能测试_07

GO QPS:17489/秒

暴力测试2万并发,20万请求:

laravel increment 并发 laravel可以支持多少并发_php_08

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

laravel increment 并发 laravel可以支持多少并发_性能测试_09

php QPS :1735/秒

暴力测试

2000并发,2万请求(再高的并发失败请求就逐渐多了起来)

laravel increment 并发 laravel可以支持多少并发_nginx_10

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请求数:

laravel increment 并发 laravel可以支持多少并发_性能测试_11

QPS : 58/秒

对laravel进行性能调优:


APP_DEBUG=false
php artisan config:cache
php artisan route:cache
php artisan optimize --force


laravel increment 并发 laravel可以支持多少并发_性能测试_12

性能调优后,QPS上升到 118/秒

比未调优之前提高50%。

此时系统负载150,cpu 50%,高负荷运转。

3、MIXPHP框架(PDO短链接)

laravel increment 并发 laravel可以支持多少并发_nginx_13

QPS : 2935/秒

mixphp暴力测试

1.5万并发,15万请求数(再高的并发就不稳定啦)

laravel increment 并发 laravel可以支持多少并发_PHP_14

QPS : 2422/秒

此时系统负载6-8,cpu 60%,在高并发的场景下,QPS下降并不明显。

4、MIXPHP框架(PDO长链接)

laravel increment 并发 laravel可以支持多少并发_PHP_15

QPS : 4367/秒

长链接比短链接并发性能提高 50%。

mixphp长链接暴力测试

1.5万并发,15万请求

laravel increment 并发 laravel可以支持多少并发_php_16

QPS :3098/秒

此时系统负载6-8,cpu 60%,在高并发的场景下,QPS下降并不明显。

5、Go语言

laravel increment 并发 laravel可以支持多少并发_PHP_17

go QPS :4247/秒

go暴力测试,并发1.8万,请求18万:


ab -n 180000 -c 18000 http://localhost:9090/hello


laravel increment 并发 laravel可以支持多少并发_PHP_18

在如此高的并发下,没有失败的请求,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

完。