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使用率直接降到十几。。。我直接惊呆了。以前都觉得所谓的运行效率最多也就高那么些,各个语言其实大差不差的。没想到第一次直接发现,差距这么明显。

今天早上九点截的图,按往常这个时候CPU又要到高峰期了,然而并没有明显的上升。
go这边,第一次写,怎么简单快捷怎么来。用的是gin框架,标准库的sql查询函数,没有用第三方ORM。然后再配了个redis,这个接口的数据需要和其他功能共用的都放到redis里,laravel那边可以通过redis拿数据去处理原来要做的其他业务。
关于 LearnKu
高认可度评论:
领
php的工资, 干go的活领
php的工资, 干go的活用
laravel就要做好牺牲性能的准备,但你把业务放到其他语言上,后来的人要怎么维护?使用laravel CPU肯定高。并发上去CPU先干满。
单独接口换到go后不能和有业务的php接口比。要比,你该单独的把这个接口写到一个laravel项目里,这个laravel项目也只有这个接口,然后用nginx代理过去,最后看下情况。
不过,为啥想到的不是先把接口用单独的laravel或者一个纯的php写,而是想到用go写。
单独接口可以用slim试下
如果只用laravel 可以接口先扔redis队列 再异步写入mysql
用webman,hyperf一樣的
你go用webman可能也是这个效果
laravel 文件加载是个问题, go能省去这部分, 除去这个优势基本可以忽略语言问题,可能是FPM的分发性能太烂
毕竟在加载这块,laravel就比不上gin。还有包管理机制的问题,gin一个项目下来,不包含静态资源文件,能有1、2MB都算大的了,它所有用到的包都放在了工作区,而不是在项目里。laravel一个裸项目都40,50M。
性能方面毕竟一个是脚本语言,一个是编译型的强语言。还是FPM存在的问题,无解。
也许用 Octane 就解决了呢?
启动laravel还是挺费时的
另外 配置,路由有没有缓存?
换成webman试试,可能比gin效果更好
使用go 最明显的可以解决目前PHP存在的两个问题:
想了解下
设备上传监测信息的接口,到底处理了什么业务,居然能把cpu打高,是接口接近并发上限,还是业务比较重处理时间较长,导致后续请求阻塞,导致cpu打高。有开opcache,开配置缓存,路由缓存,持久化数据库和缓存链接,这个配置的机器性能不至于那么不堪呀,还是要具体问题具体分析。赞成@lovewei 说的,最好还是要看一下接口的性能卡点。 Reids 的 slowlog, SQL的慢查。还有打SQL日志,外部RPC的请求日志。往往有时候性能开销产生在一些不经意的写法上。
另外好奇一下,单独哪个接口用Go重写,那业务是怎么部署的呢? 所有客户端改那个接口地址?还是用NG做个反代?
2000台设备每10秒请求一次,平均每秒请求200次.高峰还不只.你要说明你开多少个php-fpm进程和这个接口的响应时间.如果响应时间是1秒的话.你开200个fpm进程只处理这个接口.勉强是能应付得了.
用长连接试试啊
脚本缓存开了没,看着像是文件i/o拖累了cpu