怎样获得更高的性能?

1. 运行环境

WSL2 Ubuntu20 php8 + mysql8

1). 当前使用的 Laravel 版本?

laravel9.17 + Octane

2). 当前使用的 php/php-fpm 版本?

PHP 版本:php8

php-fpm 版本:php8

3). 当前系统

Windows10 + wsl2

4). 业务环境

)
开发环境

5). 相关软件版本

ab mysql8

2. 问题描述?

最近做了一个系统,用户才1000多个4核8G的服务器就直接崩溃了。拿ab工具跑了了一下,部分接口支撑不了20个并发。
自己就在本地重复试了一下。本地配置是CPUi7-10700F内存64G硬盘SSD的,系统是window10+wsl2(Ubuntu20),php8.0+mysql8.0,golang1.18.2。
使用了以下几个框架:
1.原生php+pdo的方法查询users表id等于2的数据用json返回
2.thinkphp的Db方法查询users表id等于2的数据用json返回
3.laravel的User模型方法查询users表id等于2的数据用json返回
4.laravel+Octane使用User模型方法查询users表id等于2的数据用json返回
5.gin+gorm查询users表id等于2的数据用json返回
6.swoole连接池的方式查询users表id等于2的数据用json返回

测试的结果1234都没办法达到100个并发,原生php+pdo的方法提示连接过多,把数据库的max_connections调到10000也不行,大约能支撑到80左右,接口响应速度倒是一直在30ms以下。2、3、4接口响应都是十几秒。然而,测试gin+gorm竟然可以达到1000的并发,差别十倍之多。使用swoole连接池虽然可以接近1000并发,但是也没到,连接池释放不及时,容易崩溃。
我想问的是并发差别如此之大(朋友说gorm有查询结果缓存,我查了一下文档,没找到),laravel的性能瓶颈在什么地方,自动加载、路由、配置已优化过,还有什么地方可以提升吗?隐约感觉瓶颈在数据库,有什么办法优化?大家一般的laravel程序4核8G的云服务器能支撑多少的并发量?

3. 您期望得到的结果?

4. 您实际得到的结果?

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
最佳答案

堆机器

go协程针对堵塞操作还是有效果的

无论是laravel还是加上octane,本质上还是阻塞查询,只是提前把文件加载到内存里面了,无法加速数据库查询,可以尝试swoole先关框架hyperf或者swoft,或者直接上gin

1年前 评论
susa (楼主) 1年前
讨论数量: 41

堆机器

go协程针对堵塞操作还是有效果的

无论是laravel还是加上octane,本质上还是阻塞查询,只是提前把文件加载到内存里面了,无法加速数据库查询,可以尝试swoole先关框架hyperf或者swoft,或者直接上gin

1年前 评论
susa (楼主) 1年前

“Windows10 + wsl2”,“2、3、4 接口响应都是十几秒”

你怕不是把代码放在 Windows 的磁盘下的。

1年前 评论
susa (楼主) 1年前

:joy:说实在的laravel运行慢应该在你预料之中,laravel的流行得益于开发速度和生态,从来不少运行快。另外你拿来跟go对比就更不合适了。

1年前 评论
susa (楼主) 1年前
IT学徒 (作者) 1年前
mengdodo 1年前
susa (楼主) 1年前
mengdodo 1年前

laravels 试试 既可以使用swoole 也可以保留老laravel的代码。代码改动较小 性能也可以提升

1年前 评论
susa (楼主) 1年前
哪吒的狗腿子 (作者) 1年前
my38778570 1年前

我们线上用的就是laravels 感觉性能还可以、下面是我在本地mac压测的 cpu 40 左右、本地机器还比较烂
这个是 没有数据库只输出 ok
file

这个是带数据库业务的,在两万条记录里面查询一条

file

Laravel+nginx+fpm wrk -c 1024 -t 8 都压不起来
用的wrk -c 100 -t 8
Laravel

加swoole的用的wrk -c 100 -t 8

Laravel

1年前 评论
kis龍 1年前
哪吒的狗腿子 (作者) 1年前
Junwind

把接口代码一步步打印执行时间,看哪里最耗时,或者用webman等高性能框架,laravel不适合写接口

1年前 评论

看业务类型,如果对性能要求搞就上hyperf这类的。

你想想每秒100并发,那么一天就有8640000。

有这么多流量,早就赚翻了。多开几个机器洒洒水拉

1年前 评论
susa (楼主) 1年前

执行一下 php artisan optimize

代码里不要直接读 .env 变量

路由不要用闭包

opcache关闭定时检查文件变动

fpm 进程数改成static 200+

压测前先预热,也就是压两遍

1年前 评论
GDDD

上webman 你就打开新世界了。我这边登录接口,8核16g服务器 200m带宽。wrk压测7500qps,如果ab压测 差不多。主要是直接上手就是开搞

1年前 评论

PHP 8 + Octane,读取 Model
file

1年前 评论

swoole里面如果并发打了,整个协程defer后还数据库连接慢了,可以看b站查询,这部分可以优化的,不用等defer后归还数据库连接

1年前 评论

1.laravel的模型关联查询列表时最好不用,这东西是子查询,想一下如果是查询一个列表,实际运行效果就和循环里面写查询没有什么区别。
2.laravel orm的查询修改器也是循环处理,里面最好不要写sql相关的逻辑,最好只做简单计算和类型转换。
3.你的环境时原生还是docker,如果是docker,代码最好放在WSL2 里面。
4.Opcache开启了没有?jit开启了没有?
5.最好用laravel/telescope看看你的代码运行过程,分析一下慢的原因。

1年前 评论

直接上webman

1年前 评论

看一下服务器的负载,看到底是系统的问题还是服务器配置的问题

1年前 评论

虽然laravel慢,但也不会慢那么多,不至于100都不到,看看是不是代码写了循环查询。
附一张无mysql查询压测图
Laravel

1年前 评论
susa (楼主) 1年前
Aoyamakiri (作者) 1年前

fpm模式下任何框架都是并发很低,如果能抗住高并发php不至于没落成这样了

1年前 评论
susa (楼主) 1年前

fpm 我感觉很正常 我以前公司4核16G平时访问没啥问题 一做活动并发上来就完犊子了 300 400 就不行了

1年前 评论
susa (楼主) 1年前
jiangjun

可以从下面几个地方排查: 1.看下服务器状态,是cpu,内存怎么样,如果这两个都低,说明服务性能有浪费 2.看下php-fpm状态,这种情况多半有请求在排队,看下进程数量,是否设置合理 3.mysql的状态,是否有慢查询,连接数是否够用。 4.分析下代码,是否有不合理的地方,

1年前 评论
梦想星辰大海

好奇swoole代码是怎么写的?裸写的还是用框架?

1年前 评论
markyanggang 1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!