好几年没有作过性能对比了,由于愈来愈以为性能并无那么的重要(相对于生态),今天有时间简单测试一下,由于 Mix v2.1 开始就所有切换为单进程协程模式,所以本次主要测试的是 Co\Http\Server ,测试结果在最后面。php
环境
- CPU: Intel(R) Core(TM) i7-8700 CPU @ 3.20GHz
- CPU(s): 12
- Mem: 15G
- Linux version 3.10.0-957.10.1.el7.x86_64
PHP 7.3.12 + Swoole 4.4.14
代码中使用的单进程 Co\Http\Server ,所以须要利用端口复用 (须要 Linux >= 3.10),开启 12 个进程linux
- 代码
<?php \Swoole\Process::daemon(); $scheduler = new \Swoole\Coroutine\Scheduler; $scheduler->set([ 'hook_flags' => SWOOLE_HOOK_ALL, ]); $scheduler->add(function () { $server = new \Swoole\Coroutine\Http\Server('0.0.0.0', 8888, false, true); $server->handle('/', function($request, $response){ $response->end('hello, world!'); }); $server->start(); }); $scheduler->start();
- 开启的进程
[nobody@tmp]$ ps -ef | grep test.php nobody 1917 1 0 20:22 ? 00:00:02 /usr/local/php-7.3.12/bin/php test.php nobody 1923 1 0 20:22 ? 00:00:02 /usr/local/php-7.3.12/bin/php test.php nobody 1929 1 0 20:22 ? 00:00:02 /usr/local/php-7.3.12/bin/php test.php nobody 1934 1 0 20:22 ? 00:00:02 /usr/local/php-7.3.12/bin/php test.php nobody 2154 1 0 20:22 ? 00:00:02 /usr/local/php-7.3.12/bin/php test.php nobody 2166 1 0 20:22 ? 00:00:02 /usr/local/php-7.3.12/bin/php test.php nobody 2173 1 0 20:22 ? 00:00:02 /usr/local/php-7.3.12/bin/php test.php nobody 2181 1 0 20:22 ? 00:00:02 /usr/local/php-7.3.12/bin/php test.php nobody 2187 1 0 20:22 ? 00:00:02 /usr/local/php-7.3.12/bin/php test.php nobody 2194 1 0 20:22 ? 00:00:02 /usr/local/php-7.3.12/bin/php test.php nobody 2200 1 0 20:22 ? 00:00:02 /usr/local/php-7.3.12/bin/php test.php nobody 2205 1 0 20:22 ? 00:00:02 /usr/local/php-7.3.12/bin/php test.php
- 测试:多跑几回,基本稳定在
127441.95
左右。
[nobody@~]$ ab -n 100000 -c 1000 -k http://127.0.0.1:8888/ This is ApacheBench, Version 2.3 <$Revision: 1430300 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking 127.0.0.1 (be patient) Completed 10000 requests Completed 20000 requests Completed 30000 requests Completed 40000 requests Completed 50000 requests Completed 60000 requests Completed 70000 requests Completed 80000 requests Completed 90000 requests Completed 100000 requests Finished 100000 requests Server Software: swoole-http-server Server Hostname: 127.0.0.1 Server Port: 8888 Document Path: / Document Length: 13 bytes Concurrency Level: 1000 Time taken for tests: 0.785 seconds Complete requests: 100000 Failed requests: 0 Write errors: 0 Keep-Alive requests: 100000 Total transferred: 16600000 bytes HTML transferred: 1300000 bytes Requests per second: 127441.95 [#/sec] (mean) Time per request: 7.847 [ms] (mean) Time per request: 0.008 [ms] (mean, across all concurrent requests) Transfer rate: 20659.53 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 2.4 0 47 Processing: 2 7 0.5 7 47 Waiting: 0 7 0.4 7 14 Total: 2 8 2.6 7 58 Percentage of the requests served within a certain time (ms) 50% 7 66% 7 75% 7 80% 7 90% 8 95% 8 98% 8 99% 18 100% 58 (longest request)
Go 1.13.4
Golang 默认使用所有 CPU 线程,所以只需开启一个进程便可。git
- 代码
package main import ( "fmt" "net/http" ) func main() { http.HandleFunc("/", func(writer http.ResponseWriter, request *http.Request) { writer.Write([]byte("hello, world!")) }) err := http.ListenAndServe(":9999", nil) if err != nil{ fmt.Println(err) } }
- 开启的进程
[nobody@~]$ ps -ef | grep gotest nobody 4409 1859 0 20:25 pts/31 00:00:06 ./gotest_linux
- 测试:多跑几回,基本稳定在
121575.23
左右,比 Swoole 稍微差点,但很是接近,PHP 是动态语言借助 Swoole 作到这个性能确实是很是夸张了。
[nobody@~]$ ab -n 100000 -c 1000 -k http://127.0.0.1:9999/ This is ApacheBench, Version 2.3 <$Revision: 1430300 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking 127.0.0.1 (be patient) Completed 10000 requests Completed 20000 requests Completed 30000 requests Completed 40000 requests Completed 50000 requests Completed 60000 requests Completed 70000 requests Completed 80000 requests Completed 90000 requests Completed 100000 requests Finished 100000 requests Server Software: Server Hostname: 127.0.0.1 Server Port: 9999 Document Path: / Document Length: 13 bytes Concurrency Level: 1000 Time taken for tests: 0.823 seconds Complete requests: 100000 Failed requests: 0 Write errors: 0 Keep-Alive requests: 100000 Total transferred: 15400000 bytes HTML transferred: 1300000 bytes Requests per second: 121575.23 [#/sec] (mean) Time per request: 8.225 [ms] (mean) Time per request: 0.008 [ms] (mean, across all concurrent requests) Transfer rate: 18283.77 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 2.4 0 46 Processing: 2 8 1.1 7 46 Waiting: 0 8 1.1 7 30 Total: 2 8 2.7 7 56 Percentage of the requests served within a certain time (ms) 50% 7 66% 8 75% 9 80% 9 90% 9 95% 9 98% 10 99% 18 100% 56 (longest request)
MixPHP V2.2
接下来咱们看一下跑在 PHP7.3 + Swoole4.4 下的 Mix V2.2 能跑多少。github
- 开启的进程
[nobody@tmp]$ ps -ef | grep mix.php nobody 24783 1 0 20:51 ? 00:00:00 /usr/local/php-7.3.12/bin/php mix/bin/mix.php web -r -d nobody 24801 1 0 20:51 ? 00:00:00 /usr/local/php-7.3.12/bin/php mix/bin/mix.php web -r -d nobody 24821 1 0 20:51 ? 00:00:00 /usr/local/php-7.3.12/bin/php mix/bin/mix.php web -r -d nobody 24839 1 0 20:51 ? 00:00:00 /usr/local/php-7.3.12/bin/php mix/bin/mix.php web -r -d nobody 24856 1 0 20:51 ? 00:00:00 /usr/local/php-7.3.12/bin/php mix/bin/mix.php web -r -d nobody 24873 1 0 20:51 ? 00:00:00 /usr/local/php-7.3.12/bin/php mix/bin/mix.php web -r -d nobody 24891 1 0 20:51 ? 00:00:00 /usr/local/php-7.3.12/bin/php mix/bin/mix.php web -r -d nobody 24908 1 0 20:51 ? 00:00:00 /usr/local/php-7.3.12/bin/php mix/bin/mix.php web -r -d nobody 24927 1 0 20:51 ? 00:00:00 /usr/local/php-7.3.12/bin/php mix/bin/mix.php web -r -d nobody 24946 1 0 20:51 ? 00:00:00 /usr/local/php-7.3.12/bin/php mix/bin/mix.php web -r -d nobody 24963 1 0 20:51 ? 00:00:00 /usr/local/php-7.3.12/bin/php mix/bin/mix.php web -r -d nobody 24981 1 0 20:51 ? 00:00:00 /usr/local/php-7.3.12/bin/php mix/bin/mix.php web -r -d
- 测试:多跑几回,基本稳定在
110050.47
左右,比原生 Swoole 下降了13.6%
,整个框架的代码只下降了这个比例,仍是蛮能够的。
[nobody@~]$ ab -n 100000 -c 1000 -k http://127.0.0.1:9501/ This is ApacheBench, Version 2.3 <$Revision: 1430300 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking 127.0.0.1 (be patient) Completed 10000 requests Completed 20000 requests Completed 30000 requests Completed 40000 requests Completed 50000 requests Completed 60000 requests Completed 70000 requests Completed 80000 requests Completed 90000 requests Completed 100000 requests Finished 100000 requests Server Software: swoole-http-server Server Hostname: 127.0.0.1 Server Port: 9501 Document Path: / Document Length: 13 bytes Concurrency Level: 1000 Time taken for tests: 0.909 seconds Complete requests: 100000 Failed requests: 0 Write errors: 0 Keep-Alive requests: 100000 Total transferred: 18100000 bytes HTML transferred: 1300000 bytes Requests per second: 110050.47 [#/sec] (mean) Time per request: 9.087 [ms] (mean) Time per request: 0.009 [ms] (mean, across all concurrent requests) Transfer rate: 19452.28 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 2.5 0 45 Processing: 2 9 1.6 9 46 Waiting: 0 9 1.6 9 25 Total: 2 9 3.2 9 58 Percentage of the requests served within a certain time (ms) 50% 9 66% 9 75% 9 80% 9 90% 9 95% 10 98% 17 99% 23 100% 58 (longest request)
我尝试减小进程测试:web
- 当减小到 5 个进程时达到最高性能
[nobody@tmp]$ ps -ef | grep mix.php nobody 24946 1 0 20:51 ? 00:00:15 /usr/local/php-7.3.12/bin/php mix/bin/mix.php web -r -d nobody 24963 1 0 20:51 ? 00:00:15 /usr/local/php-7.3.12/bin/php mix/bin/mix.php web -r -d nobody 24981 1 0 20:51 ? 00:00:15 /usr/local/php-7.3.12/bin/php mix/bin/mix.php web -r -d nobody 27471 1 22 21:35 ? 00:00:05 /usr/local/php-7.3.12/bin/php mix/bin/mix.php web -r -d nobody 27522 1 18 21:35 ? 00:00:03 /usr/local/php-7.3.12/bin/php mix/bin/mix.php web -r -d
- 测试:多跑几回,基本稳定在
114070.87
左右,比 12 个进程的时候还高一点,证实再多开进程已经没法提高性能了,12 线程的 CPU 为什么会这样呢?
[nobody@~]$ ab -n 100000 -c 1000 -k http://127.0.0.1:9501/ This is ApacheBench, Version 2.3 <$Revision: 1430300 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking 127.0.0.1 (be patient) Completed 10000 requests Completed 20000 requests Completed 30000 requests Completed 40000 requests Completed 50000 requests Completed 60000 requests Completed 70000 requests Completed 80000 requests Completed 90000 requests Completed 100000 requests Finished 100000 requests Server Software: swoole-http-server Server Hostname: 127.0.0.1 Server Port: 9501 Document Path: / Document Length: 13 bytes Concurrency Level: 1000 Time taken for tests: 0.877 seconds Complete requests: 100000 Failed requests: 0 Write errors: 0 Keep-Alive requests: 100000 Total transferred: 18100000 bytes HTML transferred: 1300000 bytes Requests per second: 114070.87 [#/sec] (mean) Time per request: 8.766 [ms] (mean) Time per request: 0.009 [ms] (mean, across all concurrent requests) Transfer rate: 20162.92 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 2.0 0 33 Processing: 0 8 3.0 8 33 Waiting: 0 8 3.0 8 24 Total: 0 9 3.7 8 43 Percentage of the requests served within a certain time (ms) 50% 8 66% 9 75% 10 80% 11 90% 12 95% 13 98% 18 99% 21 100% 43 (longest request)
Beego V1.12.1
- 代码:
package main import ( "fmt" "net/http" "runtime" ) func main() { http.HandleFunc("/", func(writer http.ResponseWriter, request *http.Request) { writer.Write([]byte("hello, world!")) }) err := http.ListenAndServe(":9999", nil) if err != nil{ fmt.Println(err) } }
- 测试:多跑几回,基本稳定在
107428.35
左右,与 Mix 很是接近。
[nobody@~]$ ab -n 100000 -c 1000 -k http://127.0.0.1:8989/index This is ApacheBench, Version 2.3 <$Revision: 1430300 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking 127.0.0.1 (be patient) Completed 10000 requests Completed 20000 requests Completed 30000 requests Completed 40000 requests Completed 50000 requests Completed 60000 requests Completed 70000 requests Completed 80000 requests Completed 90000 requests Completed 100000 requests Finished 100000 requests Server Software: beegoServer:1.12.1 Server Hostname: 127.0.0.1 Server Port: 8989 Document Path: /index Document Length: 13 bytes Concurrency Level: 1000 Time taken for tests: 0.931 seconds Complete requests: 100000 Failed requests: 0 Write errors: 0 Keep-Alive requests: 100000 Total transferred: 18200000 bytes HTML transferred: 1300000 bytes Requests per second: 107428.35 [#/sec] (mean) Time per request: 9.309 [ms] (mean) Time per request: 0.009 [ms] (mean, across all concurrent requests) Transfer rate: 19093.71 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 2.4 0 45 Processing: 0 9 2.4 9 52 Waiting: 0 9 2.4 9 52 Total: 0 9 3.4 9 57 Percentage of the requests served within a certain time (ms) 50% 9 66% 9 75% 9 80% 9 90% 9 95% 15 98% 19 99% 24 100% 57 (longest request)
PHP 7.3.12 + Swoole 4.4.14 二次测试
上面减小到 5 个进程依然能够达到 12 进程的性能,我猜想多是 ab -c 1000 只能达到 12w 左右的并发,也就是说没有打满,须要下降使用的线程数来测试,咱们采用 2 个线程从新测试一下。apache
- 先把测试进程减小到 2 个
[nobody@tmp]$ ps -ef | grep test.php nobody 2200 1 0 7月22 ? 00:00:16 /usr/local/php-7.3.12/bin/php test.php nobody 9600 1 0 10:30 ? 00:00:00 /usr/local/php-7.3.12/bin/php test.php
- 测试:多跑几回,基本稳定在
136426.58
左右
[nobody@~]$ ab -n 100000 -c 1000 -k http://127.0.0.1:8888/ This is ApacheBench, Version 2.3 <$Revision: 1430300 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking 127.0.0.1 (be patient) Completed 10000 requests Completed 20000 requests Completed 30000 requests Completed 40000 requests Completed 50000 requests Completed 60000 requests Completed 70000 requests Completed 80000 requests Completed 90000 requests Completed 100000 requests Finished 100000 requests Server Software: swoole-http-server Server Hostname: 127.0.0.1 Server Port: 8888 Document Path: / Document Length: 13 bytes Concurrency Level: 1000 Time taken for tests: 0.733 seconds Complete requests: 100000 Failed requests: 0 Write errors: 0 Keep-Alive requests: 100000 Total transferred: 16600000 bytes HTML transferred: 1300000 bytes Requests per second: 136426.58 [#/sec] (mean) Time per request: 7.330 [ms] (mean) Time per request: 0.007 [ms] (mean, across all concurrent requests) Transfer rate: 22116.03 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 2.2 0 43 Processing: 2 7 1.7 6 43 Waiting: 0 7 1.7 6 19 Total: 2 7 2.9 6 53 Percentage of the requests served within a certain time (ms) 50% 6 66% 6 75% 6 80% 7 90% 8 95% 10 98% 16 99% 18 100% 53 (longest request)
Go 1.13.4 二次测试
- 代码:修改成 2 个线程
package main import ( "fmt" "net/http" "runtime" ) func main() { runtime.GOMAXPROCS(2) // 限制使用线程数 http.HandleFunc("/", func(writer http.ResponseWriter, request *http.Request) { writer.Write([]byte("hello, world!")) }) err := http.ListenAndServe(":9999", nil) if err != nil{ fmt.Println(err) } }
测试:多跑几回,基本稳定在 106834.75
左右,比 Swoole 性能低了 21.7%
,证实 Swoole 确实性能是高于 Go 的 net 库。swoole
[nobody@~]$ ab -n 100000 -c 1000 -k http://127.0.0.1:9999/ This is ApacheBench, Version 2.3 <$Revision: 1430300 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking 127.0.0.1 (be patient) Completed 10000 requests Completed 20000 requests Completed 30000 requests Completed 40000 requests Completed 50000 requests Completed 60000 requests Completed 70000 requests Completed 80000 requests Completed 90000 requests Completed 100000 requests Finished 100000 requests Server Software: Server Hostname: 127.0.0.1 Server Port: 9999 Document Path: / Document Length: 13 bytes Concurrency Level: 1000 Time taken for tests: 0.936 seconds Complete requests: 100000 Failed requests: 0 Write errors: 0 Keep-Alive requests: 100000 Total transferred: 15400000 bytes HTML transferred: 1300000 bytes Requests per second: 106834.75 [#/sec] (mean) Time per request: 9.360 [ms] (mean) Time per request: 0.009 [ms] (mean, across all concurrent requests) Transfer rate: 16066.95 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 1.5 0 21 Processing: 0 9 1.9 9 21 Waiting: 0 9 1.9 9 17 Total: 0 9 2.3 9 30 Percentage of the requests served within a certain time (ms) 50% 9 66% 9 75% 10 80% 10 90% 11 95% 12 98% 13 99% 17 100% 30 (longest request)
MixPHP V2.2 二次测试
- 先把测试进程减小到 2 个
[nobody@tmp]$ ps -ef | grep mix.php nobody 7482 1 2 10:27 ? 00:00:05 /usr/local/php-7.3.12/bin/php mix/bin/mix.php web -r -d nobody 27522 1 0 7月22 ? 00:00:35 /usr/local/php-7.3.12/bin/php mix/bin/mix.php web -r -d
- 测试:多跑几回,基本稳定在
53856.21
左右,果真,按这个数据分析,以前 12 进程测试的数据不合理,由于 ab -c 1000 没有将 CPU 性能打满。
[nobody@~]$ ab -n 100000 -c 1000 -k http://127.0.0.1:9501/ This is ApacheBench, Version 2.3 <$Revision: 1430300 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking 127.0.0.1 (be patient) Completed 10000 requests Completed 20000 requests Completed 30000 requests Completed 40000 requests Completed 50000 requests Completed 60000 requests Completed 70000 requests Completed 80000 requests Completed 90000 requests Completed 100000 requests Finished 100000 requests Server Software: swoole-http-server Server Hostname: 127.0.0.1 Server Port: 9501 Document Path: / Document Length: 13 bytes Concurrency Level: 1000 Time taken for tests: 1.857 seconds Complete requests: 100000 Failed requests: 0 Write errors: 0 Keep-Alive requests: 100000 Total transferred: 18100000 bytes HTML transferred: 1300000 bytes Requests per second: 53856.21 [#/sec] (mean) Time per request: 18.568 [ms] (mean) Time per request: 0.019 [ms] (mean, across all concurrent requests) Transfer rate: 9519.51 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 2.3 0 45 Processing: 0 18 5.5 17 46 Waiting: 0 18 5.5 17 38 Total: 0 18 5.6 17 55 Percentage of the requests served within a certain time (ms) 50% 17 66% 18 75% 19 80% 20 90% 25 95% 29 98% 32 99% 33 100% 55 (longest request)
Beego V1.12.1
- 代码:一样咱们限制使用 2 个线程
package main import ( "github.com/astaxie/beego" _ "hello/routers" "runtime" ) type IndexController struct { beego.Controller } func (c *IndexController) Index() { c.Ctx.Output.Body([]byte("hello, world!")) } func main() { runtime.GOMAXPROCS(2) // 限制使用线程数 beego.Router("/index", &IndexController{},"*:Index") beego.Run() }
- 测试:多跑几回,基本稳定在
54547.49
左右,与 Mix 很是接近。
[nobody@~]$ ab -n 100000 -c 1000 -k http://127.0.0.1:8989/index This is ApacheBench, Version 2.3 <$Revision: 1430300 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking 127.0.0.1 (be patient) Completed 10000 requests Completed 20000 requests Completed 30000 requests Completed 40000 requests Completed 50000 requests Completed 60000 requests Completed 70000 requests Completed 80000 requests Completed 90000 requests Completed 100000 requests Finished 100000 requests Server Software: beegoServer:1.12.1 Server Hostname: 127.0.0.1 Server Port: 8989 Document Path: /index Document Length: 13 bytes Concurrency Level: 1000 Time taken for tests: 1.833 seconds Complete requests: 100000 Failed requests: 0 Write errors: 0 Keep-Alive requests: 100000 Total transferred: 18200000 bytes HTML transferred: 1300000 bytes Requests per second: 54547.49 [#/sec] (mean) Time per request: 18.333 [ms] (mean) Time per request: 0.018 [ms] (mean, across all concurrent requests) Transfer rate: 9694.96 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 1.9 0 31 Processing: 0 18 6.3 19 40 Waiting: 0 18 6.3 19 40 Total: 0 18 6.3 19 41 Percentage of the requests served within a certain time (ms) 50% 19 66% 21 75% 22 80% 22 90% 24 95% 25 98% 28 99% 31 100% 41 (longest request)
总结一下
- 第一次测试:因为 ab -c 1000 测试的性能没有把 CPU 打满,致使测试结果不公正,应该不少人会忽略这个问题,认为本身的框架性能很高,实际上是没有打满。
语言/框架 | 进/线程数 | 数值 |
---|---|---|
PHP 7.3.12 + Swoole 4.4.14 | 12 | 127441.95 |
Go 1.13.4 | 1 <12线程> | 121575.23 |
PHP 7.3.12 + Swoole 4.4.14 + MixPHP 2.2 | 12 | 110050.47 |
Go 1.13.4 + Beego 1.12.1 | 12 | 107428.35 |
- 第二次测试:采用 2 线程测试比较公正,能打满 CPU ,这样出来的结果才是真实结果,Swoole 比 Go 性能高
21.7%
(毕竟是 C 写的),Mix 比 Swoole 原生下降了60.5%
的性能,而 Mix 大概是 Go 原生一半的性能,与 Beego 性能齐平。
语言/框架 | 进/线程数 | 数值 |
---|---|---|
PHP 7.3.12 + Swoole 4.4.14 | 2 | 136426.58 |
Go 1.13.4 | 1 <2线程> | 106834.75 |
PHP 7.3.12 + Swoole 4.4.14 + MixPHP 2.2 | 2 | 53856.21 |
Go 1.13.4 + Beego 1.12.1 | 2 | 54547.49 |