先日ちょっとした機会があってSymfonyとLaravelの負荷テストを行ったことがありましたので、そのときの結果を共有させていただきたいと思います。
テスト環境
- EC2: m4.large
- Amazon Linux: 忘れた
- Nginx: 忘れた
- php: 7.2
- Laravel: 5.6
- Symfony: 3.4
チューニングに関して
- phpはopcacheを有効にしてvalidateしない設定にしてチューニング。
- php-fpmもプロセス管理をオートではなく、dynamicで設定。
- max_childrenとかstart_servers, min_spare_serversとかを適宜設定。
システム要件
- Nginxサーバでリクエストを受け付けて、同サーバ内のphp-fpmにFatCGI形式で投げる(unixソケット経由)。
- Symfony/Laravelは同VPC内の別のAPIサーバにhttpリクエストしてJSON形式でデータを受け取り、パースして簡単な表示を行う。
- SymfonyもLaravelもhttp clientはguzzleを採用。
テスト結果
Laravel
同時接続数 | レスポンスタイム(ms) | スループット(requests/s) |
---|---|---|
10 | 19 | 14.85 |
20 | 36 | 23.22 |
30 | 83 | 22.3 |
40 | 122 | 22.58 |
50 | 175 | 22.17 |
同時接続数を10ずつ刻んで上げていきました。レスポンスタイムは徐々に上がっていきます。スループットは20くらいで頭打ち(泣)
Symfony
同時接続数 | レスポンスタイム(ms) | スループット(requests/s) |
---|---|---|
10 | 20 | 14.89 |
20 | 69 | 16.44 |
30 | 129 | 16.55 |
40 | 195 | 15.65 |
50 | 252 | 15.64 |
こちらもレスポンスタイムは順調に遅くなっていきます。スループットも20くらいで頭打ち。そんなに変わんないな。
レスポンスタイムの比較
レスポンスタイムは総合的にLaravelのほうが速め。同時接続が20のときは倍くらい違う。だいたい30msくらい速い。ただし、20ですでに頭打ちなので、それ以上の実績はあまり参考にならないかも。
スループットの比較
スループットでもLaravelのほうがいい。これを見る限りLaravelは20もうちょっとくらい行けそうだが、Symfonyはまあ20くらいなのかなぁという程度。
考察・総括
まあ20くらいの同時接続でこんな感じなので正直負荷テストとしてはあまりいい結果になっていない。同時接続は5ずつくらいで刻んでも良かったかもしれない。
実はphp以外にもRubyやNodeでのパフォーマンス計測が先に行われていて、そっちは100とか200とか同時接続しても捌けていたので100くらいまではやるつもりでいたので、こんな感じになってしまいました。
以前、2コアのマシンでもphp5.6、CakePHP2系のアプリケーションががんばっても同時接続で20くらいだったので、こんなもんか。
正直どんくらべの背比べ状態なのですが、Symfonyは4系が出ているにも関わらずLTSの関係上v1で使えなさそうだったので、3系でテストをしています。一方Laravelは最新の5.6でLTSではないのですが、v1が世に出るときにはLTSになっていそうな雰囲気だったので最新版を使っています。そういう意味ではちょっとフェアではなかったかも。Symfony4だったらもっと速かったかもしれない。
ちなみにムキになってバックエンドのAPIへの接続をやめたり、Lumenやあまり余計なものが入っていないSymfonyでテストしてみましたが多少パフォーマンスは良くなるもののあまり変わらなかったです。