Laravel的某个接口用gin改写,效率提升这么多的嘛?

公司的服务器配置:标准型S5 - 8核 16G

整个后端除了socket用的nodejs,其他部份都是laravel。

laravel 版本是6,php版本是7.4。

有个接口特别繁忙,100个请求里,九十几个都是它的。CPU使用率超高,每天会有两个高峰时刻:8AM-9AM和17PM-18PM,CPU飙到九十多。

那个接口是设备上传监测信息的接口,几千台设备。和行政讨论了一下要不要再升级下服务器配置,希望是能不得已再去升配,就想着那个接口单独用GO改写一下。

我内心想着,能下来个30%就不错了,甚至都没想过能下来一半。
昨天下午写完上线,用nginx把那个接口通过proxy_pass单独转发到GO程序的监听端口上,结果CPU使用率直接降到十几。。。我直接惊呆了。以前都觉得所谓的运行效率最多也就高那么些,各个语言其实大差不差的。没想到第一次直接发现,差距这么明显。

Laravel的某个接口用gin改写,效率提升这么多?

今天早上九点截的图,按往常这个时候CPU又要到高峰期了,然而并没有明显的上升。

go这边,第一次写,怎么简单快捷怎么来。用的是gin框架,标准库的sql查询函数,没有用第三方ORM。然后再配了个redis,这个接口的数据需要和其他功能共用的都放到redis里,laravel那边可以通过redis拿数据去处理原来要做的其他业务。

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 43
随波逐流

php 的工资, 干 go 的活 :joy:

1个月前 评论
随波逐流

php 的工资, 干 go 的活 :joy:

1个月前 评论

laravel就要做好牺牲性能的准备,但你把业务放到其他语言上,后来的人要怎么维护?

1个月前 评论
小李世界 1个月前
xbvan 1个月前
silie (作者) 1个月前
随波逐流 1个月前
志玲爸爸 (楼主) 1个月前

使用laravel CPU肯定高。并发上去CPU先干满。

1个月前 评论

单独接口换到go后不能和有业务的php接口比。要比,你该单独的把这个接口写到一个laravel项目里,这个laravel项目也只有这个接口,然后用nginx代理过去,最后看下情况。
不过,为啥想到的不是先把接口用单独的laravel或者一个纯的php写,而是想到用go写。
单独接口可以用slim试下

1个月前 评论
志玲爸爸 (楼主) 1个月前
狒狒达人 1个月前
志玲爸爸 (楼主) 1个月前

如果只用laravel 可以接口先扔redis队列 再异步写入mysql

1个月前 评论

用webman,hyperf一樣的

1个月前 评论

你go用webman可能也是这个效果

1个月前 评论

laravel 文件加载是个问题, go能省去这部分, 除去这个优势基本可以忽略语言问题,可能是FPM的分发性能太烂

1个月前 评论

毕竟在加载这块,laravel就比不上gin。还有包管理机制的问题,gin一个项目下来,不包含静态资源文件,能有1、2MB都算大的了,它所有用到的包都放在了工作区,而不是在项目里。laravel一个裸项目都40,50M。

性能方面毕竟一个是脚本语言,一个是编译型的强语言。还是FPM存在的问题,无解。

1个月前 评论

也许用 Octane 就解决了呢?

启动laravel还是挺费时的

另外 配置,路由有没有缓存?

1个月前 评论
志玲爸爸 (楼主) 1个月前

换成webman试试,可能比gin效果更好

1个月前 评论
志玲爸爸 (楼主) 1个月前

使用go 最明显的可以解决目前PHP存在的两个问题:

  • 请求时的文件读取和解析的耗时
  • 请求时创建数据库连接的耗时
1个月前 评论
志玲爸爸 (楼主) 1个月前
mowangjuanzi (作者) 1个月前

想了解下设备上传监测信息的接口,到底处理了什么业务,居然能把cpu打高,是接口接近并发上限,还是业务比较重处理时间较长,导致后续请求阻塞,导致cpu打高。

1个月前 评论
lovewei (作者) 1个月前
志玲爸爸 (楼主) 1个月前
志玲爸爸 (楼主) 1个月前
农夫山泉 1个月前
她来听我的演唱会 1个月前
志玲爸爸 (楼主) 1个月前

有开opcache,开配置缓存,路由缓存,持久化数据库和缓存链接,这个配置的机器性能不至于那么不堪呀,还是要具体问题具体分析。赞成@lovewei 说的,最好还是要看一下接口的性能卡点。 Reids 的 slowlog, SQL的慢查。还有打SQL日志,外部RPC的请求日志。往往有时候性能开销产生在一些不经意的写法上。

另外好奇一下,单独哪个接口用Go重写,那业务是怎么部署的呢? 所有客户端改那个接口地址?还是用NG做个反代?

1个月前 评论
志玲爸爸 (楼主) 1个月前

2000台设备每10秒请求一次,平均每秒请求200次.高峰还不只.你要说明你开多少个php-fpm进程和这个接口的响应时间.如果响应时间是1秒的话.你开200个fpm进程只处理这个接口.勉强是能应付得了.

1个月前 评论
lovewei 1个月前
农夫山泉 (作者) 1个月前
xiusin 1个月前
志玲爸爸 (楼主) 1个月前
农夫山泉 (作者) 1个月前
GeorgeKing 1个月前
PolarX 1个月前

用长连接试试啊

1个月前 评论

脚本缓存开了没,看着像是文件i/o拖累了cpu

1个月前 评论

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