我今天测试的workmanQPS(10w+)这么离谱吗(本地压测结果)
2023-06-08: 最近一段时间改造了一下gin中记录日志的方式,用了异步日志,响应能力大幅提升(1w->7w),这种设计/架构层面的影响还是很猛的呀。本来也想改造一下php中,不过目前没有找到合适的方法,php中没有异步写入的方法。网络请求相关的可以采用异步,但是文件写入没有异步的途径,最多也只是 monolog 中的集中写入。相比入异步写入可以提升的程度还是相对有限的。也不知道有没有其他同学有什么方案优化。
很久没关注 workman 了。昨天一个好友提了一下 workman ,然后看到 workman 官网的压测排行,就装了跑一下。我是没想到跑了 10w qps。
我用的 macbook pro m1 16/256 测试的。
php是brew直接装的 php7.4 。
印象中本机跑到10w上的只有 fasthttp 。 rust 和 java 的试了几个都没有跑到10w过。
语言版本 | 框架 | 附加条件 | qps |
---|---|---|---|
go1.17 | fasthttp | - | 15w+ |
go1.17 | gin | - | 9w+ |
go1.17 | iris | - | 8~9w+ |
php7.4 | webman | - | 10w+ |
go1.17 | fasthttp | sqlite | 3w+ |
go1.17 | gin | sqlite | 3w+ |
php8.0 | webman | sqlite | 5w+ |
go1.17 | fasthttp | log(一次请求10条log) | 1.6w+ |
php8.0 | webman | log(一次请求10条log) | 1.7w+ |
go1.21 | gin | log(10条)异步日志 | 7w+ |
gin+异步日志
workman php7.4
iris go 1.17
gin go 1.17
fasthttp go 1.17
因为之前跑的 spring 和 actix-web 并不是多高。我就不在这贴出来了。不过 workman 跑的这个成绩我是挺吃惊。 欢迎大家讨论一下。
下午增加测试(下午的为 php8 下测试,其他不变)
fasthttp + db (gorm/sqlite)
gin + db (gorm/sqlite)
webman + db (default/sqlite)
…. 不清楚为什么这个这么离谱
fasthttp + + 10log/q (每次请求记录10条log)
风扇响了不知道有没有影响
webman + + 10log/q (每次请求记录10条log)
还挺稳定,而且性能上我是没想到纯php跑出来的成绩竟然和go在web api上不分伯仲。看到这个结果我是对手上的go代码陷入了深思
顺便补一个 php 和 go fbnq 数列的计算对比吧
(win11 php8/go1.17 i7-8565U )
这里还有一个斐波那契数列递归,在数学运算上,go 和 php 不是一个量级 ,斐波那契数列对比。因为递归的斐波那契数列的时间复杂度是 n^2 所以在这种场景 php 未来还有很大进步空间。
语言 | 斐波那契数列递归所求第n个 | 时间 | 备注 |
---|---|---|---|
GO | 46 | 4S+ | - |
PHP | 33 | 3S+ | 由于该场景下php表现与go差异较大,所以减少php求的 |
php 和 go 的字符串对比
语言 | 字符串拼接 | 时间 | 备注 |
---|---|---|---|
php | . 拼接 5000000 次 |
3s+ | - |
go | + 拼接 100000 次 |
27s+ | 因为 go + 的拼接速度实在是太慢了,所以减少循环次数 |
go | buf.WriteString 拼接 5000000 次 |
0.003s+ | - |
php 字符串拼接 5000000 次
go 用 +
进行字符串拼接 100000 (是上面的1/50次但是用时是上面的几十倍),(如果想要快一点go
要用 bytes.Buffer
)
go 用 buf.WriteString
处理字符串
尺有所短,寸有所长
:cow: :beer:
可惜没有多少人维护
hyperf swof 现在都能做到10w qps
试下fiber
大佬测试一下
laravel + Roadrunner
这个呗!~ :+1:其实单看性能,PHP一点都不差,至少对90%的公司来说。
开发速度,PHP绝对比 Go Java 一类快多了,所以中小公司,没有超高并发的场景,PHP 是完全可以胜任的。
不过 webman 能这么高的 qps 也是有原因的。。。
php 7.4 webman + db (default/sqlite):
这项测试为啥会出现,User 文件正在reloading …. 你没有关闭监控文件那个进程?
出现这个提示,一般只有项目文件夹有文件更新,子进程给主进程发送了reload 信号。
关闭monitor 进程,就不会出现这个提示:

建议:关闭这个进程,重新在测试一下!或许性能会更加高呢。
国外rank网站 Web Framework Benchmarks Round20 www.techempower.com/benchmarks/#se...
实际用户 就2个在线, 有那么高的 qps 有啥用.jpg 😂
挑选合适的,顺手的工具就完事了。 不要迷信性能测试
之前在b站看一个up测fiber qps也是挺高的 但还是比rust差一点
我感觉这样的测试没啥意义,说明不了什么
webman还是很强悍的
workman,swoole 很棒的,感觉市面上百分之85的公司做业务是ok的,定时器,分布式,性能,websocket,push
laravel怎么和workman结合做websocket应用,我看laravel文档的广播那节提到了laravel-websockets库,那个的性能是不是不如workman?
github 源码链接放一下 ?