go php7,PHP7.3+Swoole4.4 / Go1.13 / MixPHP2.2 / Beego1.12 性能对比

好几年没有做过性能对比了,因为越来越觉得性能并没有那么的重要(相对于生态),今天有时间简单测试一下,因为 Mix v2.1 开始就全部切换为单进程协程模式,因此本次主要测试的是 Co\Http\Server ,测试结果在最后面。

环境

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 个进程

代码

\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();

开启的进程

[[email protected]]$ 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 左右。

[[email protected]~]$ ab -n 100000 -c 1000 -k http://127.0.0.1:8888/

This is ApacheBench, Version 2.3

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)

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)

Go 1.13.4

Golang 默认使用全部 CPU 线程,因此只需开启一个进程即可。

代码

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)

}

}

开启的进程

[[email protected]~]$ ps -ef | grep gotest

nobody 4409 1859 0 20:25 pts/31 00:00:06 ./gotest_linux

测试:多跑几次,基本稳定在 121575.23 左右,比 Swoole 稍微差点,但非常接近,PHP 是动态语言借助 Swoole 做到这个性能确实是非常夸张了。

[[email protected]~]$ ab -n 100000 -c 1000 -k http://127.0.0.1:9999/

This is ApacheBench, Version 2.3

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)

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)

MixPHP V2.2

接下来我们看一下跑在 PHP7.3 + Swoole4.4 下的 Mix V2.2 能跑多少。

开启的进程

[[email protected]]$ 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%,整个框架的代码只降低了这个比例,还是蛮可以的。

[[email protected]~]$ ab -n 100000 -c 1000 -k http://127.0.0.1:9501/

This is ApacheBench, Version 2.3

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)

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)

我尝试减少进程测试:

当减少到 5 个进程时达到最高性能

[[email protected]]$ 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 为何会这样呢?

[[email protected]~]$ ab -n 100000 -c 1000 -k http://127.0.0.1:9501/

This is ApacheBench, Version 2.3

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)

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)

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 非常接近。

[[email protected]~]$ ab -n 100000 -c 1000 -k http://127.0.0.1:8989/index

This is ApacheBench, Version 2.3

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)

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)

PHP 7.3.12 + Swoole 4.4.14 二次测试

上面减少到 5 个进程依然可以达到 12 进程的性能,我猜测可能是 ab -c 1000 只能达到 12w 左右的并发,也就是说没有打满,需要降低使用的线程数来测试,我们采用 2 个线程重新测试一下。

先把测试进程减少到 2 个

[[email protected]]$ 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 左右

[[email protected]~]$ ab -n 100000 -c 1000 -k http://127.0.0.1:8888/

This is ApacheBench, Version 2.3

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)

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)

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 库。

[[email protected]~]$ ab -n 100000 -c 1000 -k http://127.0.0.1:9999/

This is ApacheBench, Version 2.3

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)

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)

MixPHP V2.2 二次测试

先把测试进程减少到 2 个

[[email protected]]$ 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 性能打满。

[[email protected]~]$ ab -n 100000 -c 1000 -k http://127.0.0.1:9501/

This is ApacheBench, Version 2.3

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)

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)

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 非常接近。

[[email protected]~]$ ab -n 100000 -c 1000 -k http://127.0.0.1:8989/index

This is ApacheBench, Version 2.3

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)

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)

总结一下

第一次测试:由于 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 |

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值