好几年没有做过性能对比了,因为越来越觉得性能并没有那么的重要(相对于生态),今天有时间简单测试一下,因为 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 个进程
- 代码
<?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 核,因此只需开启一个进程即可。
- 代码
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 能跑多少。
- 开启的进程
[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)
我尝试减少进程测试:
- 当减少到 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)
总结一下:
语言框架 | 进程数 | 数值 |
---|---|---|
PHP 7.3.12 + Swoole 4.4.14 | 12 | 127441.95 |
Go 1.13.4 | 1 | 121575.23 |
PHP 7.3.12 + Swoole 4.4.14 + MixPHP V2.2 | 12 | 110050.47 |
PHP 7.3.12 + Swoole 4.4.14 + MixPHP V2.2 | 5 | 114070.87 |
有疑问加站长微信联系(非本文作者)