Laravel 开发爽,但性能完全无法忍受,试试看用 octane 加持后是否能摆脱 Laravel 的性能魔咒。
Laravel 应用基本可可无缝迁移到 Hyperf,因此同时测试 Hyperf,看看 Swoole 协程异步加持的 Hyperf 是不是真的比 Laravel 快很多。
测试环境
服务器: 阿里轻量云服务器
CPU: 2核
内存: 2G
OS: CentOS 8.5
PHP: 8.2.5
MySQL: 8.0
Swoole: 5.0.3
Laravel: 10.8
Hyperf: 3.0
Laravel 压测
# 创建 Demo 模型、迁移、控制器
php artisan make:model Demo -mc
demos 表迁移结构:
Schema::create('demos', function (Blueprint $table) {
$table->id();
$table->string('text');
$table->timestamps();
});
Demo 模型类:
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Demo extends Model
{
use HasFactory;
protected $fillable = ['text'];
}
DemoController 控制器类:
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class DemoController extends Controller
{
public function hello()
{
return 'hello laravel';
}
public function dbRead()
{
$demo = \App\Models\Demo::find(1);
return ['text' => $demo->text];
}
public function dbQuery()
{
$items = \App\Models\Demo::query()
->where('id', '>', 100)
->limit(10)
->get();
return ['items' => $items];
}
public function dbWrite()
{
$demo = \App\Models\Demo::create([
'text' => date('Y-m-d H:i:s'). '/' . microtime()
]);
return ['id' => $demo->id];
}
}
php82 artisan route:list 查看路由:
GET|HEAD db-query ........................ DemoController@dbQuery
GET|HEAD db-read .......................... DemoController@dbRead
GET|HEAD db-write ........................ DemoController@dbWrite
GET|HEAD hello ............................. DemoController@hello
Laravel 默认启用了文件存储的 Session,每次压测前先删除 session 文件,否则 session 文件多了影响性能。
换成 redis 存储 session 可不用每次压测前删除 session,对测试结果影响不大。
- 启动 Laravel web 命令: php artisan serve
- 启动 Laravel octane 命令: php artisan octane:start
下面开始用 wrk 压力测试,每个链接测 3 次。
测试返回简单字符串
Laravel 返回简单字符串
wrk -c100 -t50 http://127.0.0.1:8000/hello
------
Running 10s test @ http://127.0.0.1:8000/hello
50 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 1.03s 575.81ms 1.95s 60.00%
Req/Sec 4.93 4.94 10.00 53.54%
101 requests in 10.04s, 112.93KB read
Socket errors: connect 0, read 101, write 0, timeout 81
Requests/sec: 10.06
Transfer/sec: 11.25KB
------
Running 10s test @ http://127.0.0.1:8000/hello
50 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 1.02s 567.66ms 1.92s 57.89%
Req/Sec 4.52 4.81 10.00 57.89%
101 requests in 10.10s, 112.93KB read
Socket errors: connect 0, read 101, write 0, timeout 82
Requests/sec: 10.00
Transfer/sec: 11.19KB
------
Running 10s test @ http://127.0.0.1:8000/hello
50 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 984.59ms 553.07ms 1.89s 57.89%
Req/Sec 4.91 4.91 10.00 7.07%
102 requests in 10.09s, 114.05KB read
Socket errors: connect 0, read 102, write 0, timeout 83
Requests/sec: 10.11
Transfer/sec: 11.30KB
Octane 加持 返回简单字符串
wrk -c100 -t50 http://127.0.0.1:8000/hello
------
Running 10s test @ http://127.0.0.1:8000/hello
50 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 176.85ms 63.66ms 486.86ms 86.20%
Req/Sec 11.63 5.04 30.00 62.43%
5677 requests in 10.10s, 5.88MB read
Requests/sec: 561.98
Transfer/sec: 596.00KB
------
wrk -c100 -t50 http://127.0.0.1:8000/hello
Running 10s test @ http://127.0.0.1:8000/hello
50 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 167.67ms 48.92ms 381.56ms 90.32%
Req/Sec 12.37 5.10 40.00 63.35%
5971 requests in 10.09s, 6.18MB read
Requests/sec: 591.68
Transfer/sec: 627.50KB
------
Running 10s test @ http://127.0.0.1:8000/hello
50 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 172.55ms 62.36ms 428.96ms 85.20%
Req/Sec 11.99 5.58 121.00 59.08%
5733 requests in 10.09s, 5.94MB read
Requests/sec: 568.07
Transfer/sec: 602.47KB
Laravel 数据库写入
Laravel MySQL 数据库写入
wrk -c100 -t50 http://127.0.0.1:8000/db-write
------
Running 10s test @ http://127.0.0.1:8000/db-write
50 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 1.04s 578.39ms 1.97s 62.50%
Req/Sec 4.23 4.49 10.00 65.85%
82 requests in 10.04s, 90.72KB read
Socket errors: connect 0, read 82, write 0, timeout 66
Requests/sec: 8.16
Transfer/sec: 9.03KB
------
Running 10s test @ http://127.0.0.1:8000/db-write
50 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 1.05s 587.46ms 1.96s 62.50%
Req/Sec 4.50 4.61 10.00 62.20%
82 requests in 10.05s, 90.81KB read
Socket errors: connect 0, read 82, write 0, timeout 66
Requests/sec: 8.16
Transfer/sec: 9.04KB
------
Running 10s test @ http://127.0.0.1:8000/db-write
50 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 1.03s 578.10ms 1.95s 62.50%
Req/Sec 4.41 4.59 10.00 63.86%
83 requests in 10.04s, 91.92KB read
Socket errors: connect 0, read 83, write 0, timeout 67
Requests/sec: 8.26
Transfer/sec: 9.15KB
Laravel Octane 加持 数据库写入
MySQL
wrk -c100 -t50 http://127.0.0.1:8000/db-write
------
Running 10s test @ http://127.0.0.1:8000/db-write
50 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 416.60ms 54.46ms 600.26ms 92.54%
Req/Sec 5.92 3.40 20.00 52.63%
2360 requests in 10.07s, 2.42MB read
Requests/sec: 234.35
Transfer/sec: 246.19KB
------
Running 10s test @ http://127.0.0.1:8000/db-write
50 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 421.20ms 70.59ms 595.63ms 85.63%
Req/Sec 5.35 3.02 20.00 64.08%
2331 requests in 10.06s, 2.39MB read
Requests/sec: 231.82
Transfer/sec: 243.59KB
------
Running 10s test @ http://127.0.0.1:8000/db-write
50 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 417.45ms 72.56ms 635.48ms 87.63%
Req/Sec 5.55 3.17 20.00 59.15%
2352 requests in 10.05s, 2.41MB read
Requests/sec: 233.92
Transfer/sec: 245.80KB
Sqlite
wrk -c100 -t50 http://127.0.0.1:8000/db-write
------
Running 10s test @ http://127.0.0.1:8000/db-write
50 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 441.21ms 103.73ms 882.21ms 82.12%
Req/Sec 4.97 2.84 20.00 65.66%
2226 requests in 10.04s, 2.28MB read
Requests/sec: 221.63
Transfer/sec: 232.89KB
------
Running 10s test @ http://127.0.0.1:8000/db-write
50 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 448.64ms 98.24ms 774.23ms 81.18%
Req/Sec 4.91 2.72 20.00 70.34%
2189 requests in 10.06s, 2.25MB read
Requests/sec: 217.59
Transfer/sec: 228.64KB
------
Running 10s test @ http://127.0.0.1:8000/db-write
50 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 438.36ms 74.98ms 622.64ms 84.38%
Req/Sec 5.72 3.45 20.00 50.08%
2241 requests in 10.04s, 2.30MB read
Requests/sec: 223.12
Transfer/sec: 234.60KB
测试 Laravel 读取数据库
Laravel MySQL 数据库读取
wrk -c100 -t50 http://127.0.0.1:8000/db-read
----
Running 10s test @ http://127.0.0.1:8000/db-read
50 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 1.03s 558.31ms 1.90s 60.00%
Req/Sec 4.44 4.61 10.00 63.41%
82 requests in 10.06s, 93.77KB read
Socket errors: connect 0, read 82, write 0, timeout 67
Requests/sec: 8.15
Transfer/sec: 9.32KB
------
Running 10s test @ http://127.0.0.1:8000/db-read
50 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 1.07s 593.05ms 2.00s 64.71%
Req/Sec 4.80 4.79 10.00 11.90%
84 requests in 10.05s, 96.06KB read
Socket errors: connect 0, read 84, write 0, timeout 67
Requests/sec: 8.36
Transfer/sec: 9.56KB
------
Running 10s test @ http://127.0.0.1:8000/db-read
50 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 1.06s 589.02ms 1.98s 64.71%
Req/Sec 3.95 4.30 10.00 70.24%
84 requests in 10.05s, 96.06KB read
Socket errors: connect 0, read 84, write 0, timeout 67
Requests/sec: 8.36
Transfer/sec: 9.56KB
Laravel + Octane 数据库读取
MySQL
wrk -c100 -t50 http://127.0.0.1:8000/db-read
------
Running 10s test @ http://127.0.0.1:8000/db-read
50 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 252.56ms 59.13ms 460.71ms 89.38%
Req/Sec 8.35 2.56 30.00 74.44%
3945 requests in 10.08s, 4.18MB read
Requests/sec: 391.33
Transfer/sec: 424.96KB
------
Running 10s test @ http://127.0.0.1:8000/db-read
50 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 258.04ms 69.85ms 588.53ms 88.38%
Req/Sec 7.93 2.63 20.00 70.36%
3858 requests in 10.08s, 4.09MB read
Requests/sec: 382.74
Transfer/sec: 415.63KB
------
Running 10s test @ http://127.0.0.1:8000/db-read
50 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 259.81ms 64.02ms 596.55ms 88.66%
Req/Sec 7.97 2.67 20.00 70.78%
3812 requests in 10.08s, 4.04MB read
Requests/sec: 378.12
Transfer/sec: 410.62KB
Sqlite
wrk -c100 -t50 http://127.0.0.1:8000/db-read
------
Running 10s test @ http://127.0.0.1:8000/db-read
50 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 196.67ms 55.13ms 429.39ms 88.82%
Req/Sec 10.31 4.03 40.00 76.70%
5081 requests in 10.10s, 5.42MB read
Requests/sec: 503.14
Transfer/sec: 549.33KB
------
Running 10s test @ http://127.0.0.1:8000/db-read
50 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 226.42ms 79.57ms 583.51ms 88.39%
Req/Sec 9.35 3.74 40.00 74.37%
4451 requests in 10.10s, 4.75MB read
Requests/sec: 440.62
Transfer/sec: 481.07KB
------
Running 10s test @ http://127.0.0.1:8000/db-read
50 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 207.83ms 69.91ms 581.83ms 87.62%
Req/Sec 10.17 4.10 29.00 73.47%
4863 requests in 10.10s, 5.18MB read
Requests/sec: 481.50
Transfer/sec: 525.70KB
Laravel dbQuery 压测
MyQSL 压测结果:
wrk -c100 -t50 http://localhost:8000/db-query
------
Running 10s test @ http://localhost:8000/db-query
50 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 1.03s 583.06ms 1.97s 62.50%
Req/Sec 4.44 4.62 10.00 62.96%
81 requests in 10.06s, 205.66KB read
Socket errors: connect 0, read 81, write 0, timeout 65
Requests/sec: 8.05
Transfer/sec: 20.45KB
------
Running 10s test @ http://localhost:8000/db-query
50 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 1.07s 596.18ms 1.99s 58.82%
Req/Sec 4.35 4.51 10.00 62.65%
83 requests in 10.09s, 210.74KB read
Socket errors: connect 0, read 83, write 0, timeout 66
Requests/sec: 8.22
Transfer/sec: 20.88KB
------
Running 10s test @ http://localhost:8000/db-query
50 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 1.01s 569.61ms 1.93s 62.50%
Req/Sec 4.60 4.67 10.00 60.98%
82 requests in 10.06s, 208.20KB read
Socket errors: connect 0, read 82, write 0, timeout 66
Requests/sec: 8.15
Transfer/sec: 20.70KB
Laravel + Octane dbQuery 压测
MyQSL 压测结果:
wrk -c100 -t50 http://localhost:8000/db-query
------
Running 10s test @ http://127.0.0.1:8000/db-query
50 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 338.83ms 82.20ms 694.42ms 87.27%
Req/Sec 6.35 2.80 20.00 62.32%
2923 requests in 10.07s, 7.09MB read
Requests/sec: 290.16
Transfer/sec: 720.59KB
------
Running 10s test @ http://127.0.0.1:8000/db-query
50 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 318.90ms 58.37ms 541.45ms 89.61%
Req/Sec 6.49 2.63 20.00 66.13%
3110 requests in 10.08s, 7.54MB read
Requests/sec: 308.58
Transfer/sec: 766.32KB
------
Running 10s test @ http://127.0.0.1:8000/db-query
50 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 332.35ms 77.59ms 691.96ms 84.84%
Req/Sec 6.55 2.96 30.00 58.93%
2989 requests in 10.09s, 7.25MB read
Requests/sec: 296.20
Transfer/sec: 735.58KB
Sqlite 压测结果:
Running 10s test @ http://127.0.0.1:8000/db-query
50 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 250.18ms 66.68ms 633.87ms 86.06%
Req/Sec 8.25 2.68 50.00 76.08%
4002 requests in 10.10s, 9.73MB read
Requests/sec: 396.21
Transfer/sec: 0.96MB
------
Running 10s test @ http://127.0.0.1:8000/db-query
50 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 266.82ms 80.43ms 640.53ms 86.86%
Req/Sec 7.95 2.60 20.00 73.93%
3744 requests in 10.10s, 9.10MB read
Requests/sec: 370.64
Transfer/sec: 0.90MB
Hyperf 压测
创建表迁移、模型、控制器命令:
php bin/hyperf.php gen:migration create_demos_table
php bin/hyperf.php gen:model demos
php bin/hyperf.php gen:controller DemoController
demos 表迁移结构:
Schema::create('demos', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('text');
$table->datetimes();
});
Hyperf Demo 模型类:
namespace App\Model;
class Demo extends Model
{
protected ?string $table = 'demos';
protected array $fillable = ['text'];
}
Hyperf DemoController 控制器类:
namespace App\Controller;
use Hyperf\HttpServer\Contract\RequestInterface;
use Hyperf\HttpServer\Contract\ResponseInterface;
use Hyperf\HttpServer\Annotation\AutoController;
#[AutoController]
class DemoController
{
public function hello()
{
return 'hello hyperf';
}
public function dbRead()
{
$demo = \App\Model\Demo::find(1);
return ['text' => $demo->text];
}
public function dbQuery()
{
$items = \App\Model\Demo::query()
->where('id', '>', 100)
->limit(10)
->get();
return ['items' => $items];
}
public function dbWrite()
{
$demo = \App\Model\Demo::create([
'text' => date('Y-m-d H:i:s'). '/' . microtime()
]);
return ['id' => $demo->id];
}
}
php bin/hyperf.php describe:routes 查看路由表:
+--------+---------------+---------------+----------------------------------------+------------+
| Server | Method | URI | Action | Middleware |
+--------+---------------+---------------+----------------------------------------+------------+
| http | GET|POST|HEAD | /demo/hello | App\Controller\DemoController::hello | |
+--------+---------------+---------------+----------------------------------------+------------+
| http | GET|POST|HEAD | /demo/dbRead | App\Controller\DemoController::dbRead | |
+--------+---------------+---------------+----------------------------------------+------------+
| http | GET|POST|HEAD | /demo/dbQuery | App\Controller\DemoController::dbQuery | |
+--------+---------------+---------------+----------------------------------------+------------+
| http | GET|POST|HEAD | /demo/dbWrite | App\Controller\DemoController::dbWrite | |
+--------+---------------+---------------+----------------------------------------+------------+
Hyperf 返回简单字符串
wrk -c100 -t50 http://localhost:9501/demo/hello
Running 10s test @ http://localhost:9501/demo/hello
50 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 4.68ms 2.13ms 40.85ms 79.38%
Req/Sec 436.05 107.57 4.67k 96.71%
217542 requests in 10.10s, 31.95MB read
Requests/sec: 21538.14
Transfer/sec: 3.16MB
------
Running 10s test @ http://localhost:9501/demo/hello
50 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 4.73ms 2.43ms 50.35ms 81.39%
Req/Sec 434.94 91.08 2.66k 86.01%
217204 requests in 10.10s, 31.90MB read
Requests/sec: 21505.09
Transfer/sec: 3.16MB
------
Running 10s test @ http://localhost:9501/demo/hello
50 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 4.85ms 2.47ms 45.37ms 80.47%
Req/Sec 424.21 88.95 1.69k 82.74%
212146 requests in 10.10s, 31.16MB read
Requests/sec: 21005.48
Transfer/sec: 3.08MB
启用 session 后:
wrk -c100 -t50 http://localhost:9501/demo/hello
Running 10s test @ http://localhost:9501/demo/hello
50 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 21.56ms 5.02ms 50.58ms 69.68%
Req/Sec 92.94 13.73 131.00 62.73%
46749 requests in 10.10s, 14.09MB read
Requests/sec: 4628.33
Transfer/sec: 1.39MB
------
Running 10s test @ http://localhost:9501/demo/hello
50 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 20.96ms 4.86ms 68.71ms 71.41%
Req/Sec 95.69 12.63 141.00 65.36%
48038 requests in 10.10s, 14.48MB read
Requests/sec: 4758.43
Transfer/sec: 1.43MB
------
Running 10s test @ http://localhost:9501/demo/hello
50 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 22.21ms 6.09ms 56.34ms 72.82%
Req/Sec 90.30 16.62 222.00 67.81%
45348 requests in 10.10s, 13.67MB read
Requests/sec: 4490.46
Transfer/sec: 1.35MB
Hyperf 读写 MySQL
Hyperf 不支持 Sqlite,故只测试MySQL。
Hyperf MySQL 写入
wrk -c100 -t50 http://localhost:9501/demo/dbWrite
------
Running 10s test @ http://localhost:9501/demo/dbWrite
50 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 139.25ms 42.26ms 273.96ms 60.27%
Req/Sec 14.89 5.88 40.00 85.85%
7140 requests in 10.05s, 1.08MB read
Requests/sec: 710.16
Transfer/sec: 110.26KB
------
Running 10s test @ http://localhost:9501/demo/dbWrite
50 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 137.73ms 55.83ms 403.52ms 78.72%
Req/Sec 15.57 6.42 40.00 82.73%
7335 requests in 10.10s, 1.12MB read
Requests/sec: 726.56
Transfer/sec: 113.34KB
------
Running 10s test @ http://localhost:9501/demo/dbWrite
50 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 137.33ms 45.05ms 284.23ms 59.26%
Req/Sec 15.15 6.36 40.00 92.15%
7269 requests in 10.06s, 1.11MB read
Requests/sec: 722.54
Transfer/sec: 112.90KB
启用 session 后:
wrk -c100 -t50 http://localhost:9501/demo/dbWrite
Running 10s test @ http://localhost:9501/demo/dbWrite
50 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 144.75ms 42.94ms 314.75ms 77.15%
Req/Sec 14.32 5.32 30.00 57.96%
6909 requests in 10.08s, 2.12MB read
Requests/sec: 685.49
Transfer/sec: 215.55KB
------
Running 10s test @ http://localhost:9501/demo/dbWrite
50 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 142.23ms 36.90ms 359.51ms 77.87%
Req/Sec 14.44 5.12 30.00 49.45%
7027 requests in 10.07s, 2.16MB read
Requests/sec: 697.91
Transfer/sec: 219.46KB
------
Running 10s test @ http://localhost:9501/demo/dbWrite
50 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 143.96ms 49.21ms 445.88ms 89.59%
Req/Sec 14.74 5.25 30.00 45.12%
7044 requests in 10.10s, 2.16MB read
Requests/sec: 697.63
Transfer/sec: 219.37KB
Hyperf MySQL 读取
wrk -c100 -t50 http://localhost:9501/demo/dbRead
------
Running 10s test @ http://localhost:9501/demo/dbRead
50 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 49.83ms 11.10ms 104.91ms 68.28%
Req/Sec 40.03 7.74 60.00 54.90%
20138 requests in 10.07s, 3.86MB read
Requests/sec: 1999.25
Transfer/sec: 392.43KB
------
Running 10s test @ http://localhost:9501/demo/dbRead
50 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 48.28ms 10.99ms 127.69ms 69.88%
Req/Sec 41.30 7.99 60.00 58.06%
20787 requests in 10.09s, 3.98MB read
Requests/sec: 2060.64
Transfer/sec: 404.48KB
------
Running 10s test @ http://localhost:9501/demo/dbRead
50 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 51.42ms 11.68ms 130.67ms 71.05%
Req/Sec 38.80 8.13 90.00 54.78%
19529 requests in 10.09s, 3.74MB read
Requests/sec: 1935.29
Transfer/sec: 379.88KB
启用session后:
wrk -c100 -t50 http://localhost:9501/demo/dbRead
Running 10s test @ http://localhost:9501/demo/dbRead
50 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 78.52ms 24.37ms 212.00ms 81.27%
Req/Sec 25.36 8.09 49.00 79.84%
12767 requests in 10.10s, 4.42MB read
Requests/sec: 1264.00
Transfer/sec: 448.08KB
------
Running 10s test @ http://localhost:9501/demo/dbRead
50 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 83.17ms 29.72ms 270.40ms 82.09%
Req/Sec 24.27 8.84 49.00 74.57%
12087 requests in 10.10s, 4.18MB read
Requests/sec: 1196.88
Transfer/sec: 424.29KB
------
Running 10s test @ http://localhost:9501/demo/dbRead
50 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 76.05ms 20.62ms 196.60ms 82.76%
Req/Sec 26.43 7.74 50.00 81.25%
13220 requests in 10.10s, 4.58MB read
Requests/sec: 1309.28
Transfer/sec: 464.13KB
Hyperf MySQL 查询
(启不启用 session 差别不明显)
wrk -c100 -t50 http://localhost:9501/demo/dbQuery
Running 10s test @ http://localhost:9501/demo/dbQuery
50 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 319.12ms 125.24ms 568.95ms 57.50%
Req/Sec 7.62 4.55 20.00 72.17%
3066 requests in 10.07s, 4.30MB read
Requests/sec: 304.52
Transfer/sec: 437.75KB
------
Running 10s test @ http://localhost:9501/demo/dbQuery
50 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 321.21ms 121.50ms 579.74ms 61.30%
Req/Sec 7.50 4.30 40.00 76.54%
3052 requests in 10.05s, 4.28MB read
Requests/sec: 303.68
Transfer/sec: 436.54KB
------
Running 10s test @ http://localhost:9501/demo/dbQuery
50 threads and 100 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 324.07ms 125.57ms 683.32ms 63.97%
Req/Sec 7.25 4.19 20.00 75.42%
3033 requests in 10.10s, 4.26MB read
Requests/sec: 300.30
Transfer/sec: 431.67KB
数据对比(每秒处理次数)
- | Laravel | Laravel + Octane | Hyperf 启用 session | Hyperf 不启用 session |
返回简单字符串 | 10 | 560 | 4600 | 20000 |
MySQL 表写入 | 8 | 230 | 690 | 720 |
MySQL 单条读取(WHERE id = 1) | 8 | 380 | 1200 | 2000 |
MySQL 范围查询(WHERE id > 100 LIMIT 10) | 8 | 300 | 300 | 300 |
总结
- Laravel 性能真的非常差;
- Laravel 10 使用 Octane 加速效果非常好,有 30~50 倍的提升,完全能解决 Laravel 性能差的诟病;
- Hyperf 数据写入及主键等(=)查询速度大约是 Laravel Octane 加持后的3倍,范围查询或排序查询速度相等,用上数据库后,Hyperf 的速度优势不是特别大。
你完全可以放心的使用 Laravel 10,不必担心性能问题,有性能瓶颈时用 Octane 加速可完美解决。
之前在这台服务器上测试 Octane 加速 Laravel9, PHP-8.0、Swoole 4.x,速度只有原 Laravel9 的 3~8倍,而且没测试数据库,没有这一次的结果好。
注明
用 wrk 压测前用已先用 ab 测试,确保 Failed requests 为 0,如:
ab -n 2000 -c 50 http://127.0.0.1:8000/db-read
This is ApacheBench, Version 2.3 <$Revision: 1843412 gt;
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 200 requests
Completed 400 requests
Completed 600 requests
Completed 800 requests
Completed 1000 requests
Completed 1200 requests
Completed 1400 requests
Completed 1600 requests
Completed 1800 requests
Completed 2000 requests
Finished 2000 requests
Server Software: swoole-http-server
Server Hostname: 127.0.0.1
Server Port: 8000
Document Path: /db-read
Document Length: 53 bytes
Concurrency Level: 50
Time taken for tests: 4.181 seconds
Complete requests: 2000
Failed requests: 0
Total transferred: 2302000 bytes
HTML transferred: 106000 bytes
Requests per second: 478.30 [#/sec] (mean)
Time per request: 104.536 [ms] (mean)
Time per request: 2.091 [ms] (mean, across all concurrent requests)
Transfer rate: 537.62 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.2 0 2
Processing: 7 103 36.4 96 318
Waiting: 5 103 36.4 96 318
Total: 7 103 36.3 96 318
Percentage of the requests served within a certain time (ms)
50% 96
66% 102
75% 106
80% 108
90% 116
95% 125
98% 261
99% 307
100% 318 (longest request)