Swoole 加速 Laravel 哪家强?一组盲测见真晓
最近突然对「Swoole 加速 Laravel」这个话题来了兴趣,印象中前面也看到了好几个相关的开源作品——但苦于一直没有机会实际体验,所以也只能算是知道。
前阵子 PHP7.4发布,预加载(Preloading)功能特性十分令人兴奋。忽然想起 Swoole 加速 Laravel 的原理,觉得在还没有机会在生产环境上 7.4 的情况下先用 Swoole 折衷实现一下也挺好。但相关的开源作品这么多,到底哪个比较好呢?于是有了这两天的密集上手测试。实际看过的作品包括:
- scil/LaravelFly
- chongyi/swoole-laravel-framework
- StoneGroup/stone
- garveen/laravoole
- swooletw/laravel-swoole
- hhxsv5/laravel-s
而实际测试到的是后面 3 个:laravoole、laravel-swoole 和 laravel-s。前面 3 个放弃测试的原因是:
- 库的更新时间都比较久远,好几年前了
- 库的设计不太优雅,不够 Laravel 风...
当然了,按照以上标准看:测试到的 3 个里面,最优雅的是 laravoole,但也是最旧的(最后更新时间为2017 年 11 月 10 日)。
之所以说 laravoole 的设计优雅,主要体现在其与 nginx 配合食用的方式有 2 种:一种是常规的 proxy_pass,另一种是fastcgi_pass。我个人比较喜欢 fastcgi_pass,这就等于是平移了 php-fpm 的方式了。
下面说说测试方法和初步结果。
测试方法很简单:
- 先创建一个原始的 Laravel 项目
composer create-project --prefer-dist laravel/laravel lara
- 再按照各家文档引用相应的库
composer require ...
- 然后按说明简单配置后启动 swoole 服务,并配置基于端口的本地 nginx 虚机
- 最后使用 ab 进行压测
ab -k -n1000 -c10 http://127.0.0.1:port/
够简单吧?那么初步的测试结果如何呢?下面就来揭晓!
我最先测到的是 laravoole,因为最受我青睐嘛。不过测试结果让我非常疑惑,经过 swoole 加速之后的 QPS 竟然还不如 PHP-FPM 模式...我以为我看错了,反复数次结果都差不多。随后测试的是 laravel-swoole,竟然也和 laravoole 差不多,至少并没有表现得很惊艳。而让我发出「哇」声的是 laravel-s,大概有 4 倍的性能提升——是个很明显的差异。我反复测试了好几遍,这个差异一直能稳定复现。不知道各位看官,这个结果在你们意料之中吗?
测试过程中,我曾尝试各种配置调优。我发现 laravoole 和 laravel-swoole 在结合 nginx 后 QPS 有所下降,我怀疑是否跟未手动配置 keepalive 有关(目前尚未及验证)。反正 laravel-s 按照作者的配置指引之后,直接压测 swoole http服务与压测 nginx proxy_pass 基本看不出差异。我留意到其 nginx 配置里有 keepalive 相关优化。
怎么说呢?截至本篇发文,我只是进行了一次初步测试。可能并不能代表真实情况。也欢迎以上作品的作者和各位 Laraver 、PHPer 提供你们的测试讯息。
需要补充说明的是,涉及到的 3 个作品我都有分别针对 swoole http 服务及 nginx proxy 服务进行压测。laravoole 的 swoole http 服务会出现卡顿一会后直接超时退出的情况,导致压测直接失败...其他 2 个都能正常完成测试。(全文完)
补充介绍本次的测试环境:
- CentOS 7.4 64位 2 核 4G
- PHP 7.1.3 with OPCache
- Laravel 5.8.35
- Nginx 1.16.1
请问一下,我也试过用 laravel-s 加速 laravel 应用,出现的一种情况是 cpu 使用率上大大优于 fpm 对于 cpu 的使用,但是并发 \ 请求成功总数上并没有比 fpm 提升多少。这种情况是什么原因导致的?对了,单纯返回字符串的话可以提升4-5倍,但是连数据库后查询返回貌似就没很大差别了。