
目前状况: 1 )有 2 台 8 核 16G 服务器,tps1000 多。
2 )使用 nginx+php-fpm+laravel。
3 ) php-fpm 进程占有的 cpu 较高,经常飙到 80%以上。
目前想一步步地将 laravel 上的 api 接口,逐步使用 golang 重构,并部署到生产环境,但又不影响生产环境功能的正常使用。比如今天先把某个使用频率较高的 api,重构成 golang,部署上去;明天再部署新的 api,一步步操作。
1 )如果使用 Laravel-Swoole 测试了下并发性能确实提到了几十倍,但是有很多坑,怕部署到生产环境出问题。。。
2 )若使用 golang 重构,是要在 nginx 中配置,当请求某个 api 的时候,给他转发到 go 服务器吗?有没有具体的教程,在网上没有找到了的解决方法,有没有大神求助下
1 liqihang 2019-04-28 13:47:39 +08:00 或者 golang 做服务通过 RPC 串起来呢 |
2 alpha2016 2019-04-28 14:00:55 +08:00 尝试用 swoole 来替换 nginx 的分发呢,可以在某台机器上小规模测试一下,效果不错的话全站引入。 |
3 zjtsunshine OP @liqihang 使用 laravel,php-fpm,就只返回个“ hello world ”,单机最多也就几百并发,cpu 就 80%多,所以通过 RPC 恐怕不行,资源消耗,主要集中在 laravel 的环境初始化中了 |
4 zjtsunshine OP @alpha2016 使用 laravel-swoole 有一些坑,session 混乱,上传,下载 excel 等都会有点问题,可能还有很多其他没有发现的问题,不敢部署到生产环境 |
5 freefcw 2019-04-28 14:08:03 +08:00 并不一定需要重构,或者全部重构,先找到热点在哪里吧,这么高 cpu,肯定某些接口造成的 @zjtsunshine 对于某些 swoole 不影响的可以直接切换 swoole,对于 swoole 可能会影响到的,就继续用 fpm,这都是解决方案 |
6 oneonesv 2019-04-28 14:08:50 +08:00 用 golang 也会遇到新的问题并且还要重写,何不把现有代码兼容 swoole 呢 |
7 zjtsunshine OP @freefcw 多谢知道~~ |
8 alpha2016 2019-04-28 14:10:44 +08:00 @zjtsunshine session 是个问题,不过一般来说引入个新语言不是优先的方案 |
9 zjtsunshine OP @oneonesv 嗯嗯,我们试一试 swoole 兼容 |
10 zjtsunshine OP @oneonesv 你有将 laravel-swoole 部署到生产环境中吗?总感觉有点虚 |
11 Kilerd 2019-04-28 14:16:03 +08:00 拆成小服务,然后用灰度发布的方式来逐步迁移过去就行了。 |
12 sunmonster 2019-04-28 14:19:04 +08:00 @zjtsunshine 用 Go 重构吧,重构之后回过头来看你会发现其实有其他更好的方案 |
13 LuoyeBug 2019-04-28 14:19:35 +08:00 可以 nginx 指定路由,反向代理到后端的 go 服务 |
14 oneonesv 2019-04-28 14:21:23 +08:00 @zjtsunshine 我们前公司再用 量也不小 没啥问题 |
15 zjsxwc 2019-04-28 14:22:05 +08:00 把要 替换部分匹配的 api 通过 nginx 转发到你 golang 服务器里 |
16 blless 2019-04-28 14:22:05 +08:00 via Android 用 go 做转发效率也还可以,先写一个转发层,然后重写后的业务不转发 自己处理,随着版本更新可以慢慢把旧业务全部覆盖掉 |
17 xioxu 2019-04-28 14:23:27 +08:00 nginx 中配置特定 location 进行反向代理, 例如^~ /api/users 意思是以 /api/users 开头的所有 http 请求, 直接 proxy_pass 到 golang 的 http 地址即可。 当然这也要看你们 api 的认证方式了, 如果是较规范的认证方式的话这样没有问题, 否则如果是使用 session 认证的话就需要做些额外工作了。 |
18 m939594960 2019-04-28 14:24:10 +08:00 用 openresty 做转发的逻辑,逐渐用 golang 编写的部分接口替换 laravel 的接口,等到 lravel 彻底没流量后直接干掉 laravel |
19 zjtsunshine OP 回复好快,各位多谢多谢指导~~ |
20 robot1 2019-04-28 15:45:50 +08:00 可以参考知乎的 golang 重构方案,漫长稳妥的方案 |
21 peinhu 2019-04-28 16:07:06 +08:00 不建议使用 laravel-swoole 和 laravel-s 等方案,虽然看上去很方便,性能也有不小提升,但原项目要改的地方太多,有点像针对这种方案开发项目了,得不偿失。 要上 swoole 只能使用完全基于 swoole 开发的框架,不过现在这种框架都不成熟,周边生态也不完善,要是学那个还不如学其它语言的成熟框架了。 |
22 mscb 2019-04-28 16:09:07 +08:00 via Android 建议先 swoole |
23 PHPJit 2019-04-28 16:11:43 +08:00 easyswoole 吧,有一个项目生产环境已经用上了。 另外一个用 laravels 的也用上生产环境了 |
24 luozic 2019-04-28 16:49:32 +08:00 |
25 flashrick 2019-04-28 16:55:24 +08:00 我也在纠结是 go 还是 swoole 。能说下你的机器配置么 |
26 jswh 2019-04-28 17:09:24 +08:00 go 承接所有请求,对于还没有实现的部分,转发到 nginx 上去。 |
27 triptipstop 2019-04-28 17:34:06 +08:00 仅仅把消耗过大的业务用 Go 写成 api Laravel 用 Go 的 api ROR 已经是很好的设计了 |
28 smallX 2019-04-28 17:41:42 +08:00 via Android 果断上 go 啊。楼主的问题已经很具体了,还怕找不到解决方法。撸 go 将是另一片天地... |
29 loading 2019-04-28 17:46:49 +08:00 via Android 解决 session 共用,然后 nginx 匹配后转发。 |
30 namek 2019-04-28 17:49:48 +08:00 helloworld 8 核 16G 80%cpu 单这一点 我觉得是代码的问题 跟语言没关系 |
31 zarte 2019-04-28 17:50:23 +08:00 golang 本身是不需要 nginx 的并发性能也 ok。 要用 nginx 的话反代到对应地址就可以了。 |
32 zjtsunshine OP @namek 老哥你用下 laravel 就知道了 |
33 namek 2019-04-28 18:02:11 +08:00 @zjtsunshine 我们是 lumen+hprose+swoole laravel 初始化确实会占用 fpm 更多的内存跟 cpu 关系不大,laravel 写接口尝试去掉意义不大的中间件比如是否初始化了 session,6 楼和 26 楼的建议都很好,几百 tps 的 hellworld cpu80%有点高了。 |
34 OMGZui 2019-04-28 18:18:50 +08:00 这么好的写 go 经验,干吧 |
35 tanszhe 2019-04-28 18:28:23 +08:00 我也用过 laravel 确实有点慢,你的瓶颈是 php 本身还是数据库? 你可以看看 one 框架 和 laravel 非常像,性能保守估计比 laravel 高 10 倍以上 https://github.com/lizhichao/one |
36 snail404 2019-04-28 18:30:14 +08:00 hello world 几百并发不至于 80% 吧,什么配置,opcache 开启了吗? |
37 veike 2019-04-28 18:30:20 +08:00 8 核几百并发就彪到 80%了吗,有点恐怖啊。 |
38 KgM4gLtF0shViDH3 2019-04-28 18:31:42 +08:00 via iPhone 还是用 go 吧,变成体验完全不一样,php 在内网做管理后台比较适合 |
39 Trim21 2019-04-28 19:09:06 +08:00 via Android 可以看看知乎 Python 迁移 golang 的做法 |
40 ben1024 2019-04-28 19:27:13 +08:00 建议先考虑下项目本身的优化和问题定位 |
41 runningman 2019-04-28 19:32:17 +08:00 via iPhone @tanszhe one 你搞连接池没 为啥快呢 或者加你微信聊聊 |
42 zhchyu999 2019-04-28 19:39:32 +08:00 via Android 低配多台机器比高配更少太机器更好用 |
43 zjtsunshine OP @namek 感谢 |
44 king2014 2019-04-28 21:35:30 +08:00 8 核几百并发就彪到 80%,听到也有点诧异 |
45 blless 2019-04-28 22:16:13 +08:00 via Android php 不知道 不过 python 切换过来那个延迟跟 cpu 内存突然下降成一条直线简直不能再爽 |
46 dawniii 2019-04-28 22:16:19 +08:00 |
47 xiaolanger 2019-04-28 23:22:48 +08:00 现在是越来越感觉,laravel 似乎有些臃肿?多余? |
48 xiaotianhu 2019-04-28 23:43:47 +08:00 swoole+laravels 基本上没啥问题,性能提升很大 |
49 xiaotianhu 2019-04-28 23:44:25 +08:00 swoole+laravels 提升很大,稳定性也 ok 没啥问题.不放心的就启一个 fpm 实例,用负载均衡兜底. 我们线上就这么干了很久了.很爽. |
50 2kCS5c0b0ITXE5k2 2019-04-28 23:48:30 +08:00 不是有 lumen 吗... |
51 autogen 2019-04-29 01:49:55 +08:00 额。。。遇到点问题就想着换语言。。。。 tps1000 不算高, php-fpm 占 CPU 高可能是 php-fpm.conf 配置不正确, 1. 可以考虑固定下 php-fpm 进程数: > pm = static > pm.max_children = 300 2. 关闭超时链接: > request_terminate_timeout 10s 3. 记录 slow log: > slowlog = logs/slow.log > request_slowlog_timeout = 3s 4. 如果 slow log 太多,考虑代码问题(有没有用 cache,db 连接数,查看 sql slow query log,优化索引、查询语句等。。) 5. 在 php-fpm 前面加一层 nginx,把静态页面(html/js/css/jpg/gif/png)放到 nginx 和 CDN - |
52 nine 2019-04-29 06:29:19 +08:00 用 go 就没有坑了么? 虽然 7、8 年没用过 PHP 了,也没用过 laravel,但直觉告诉我,是你运维工作没做到位。 前年受人所托,优化了一个 PHP 线上业务,每天 2000 万+访问,简单优化后单台 4 核 VPS,CPU 平均负载 25%左右。业务框架是 ThinkPHP,代码几乎没动。 |
53 lestat 2019-04-29 07:39:41 +08:00 via Android 2c4g,laravel5.5+php-fpm 7.3,并发只能到 60 多,开了 opcache 之后的...不开只有不到 20...也在考虑怎么提升性能,之前用 laravels 没有解决 jwt 在多用户表切换时候的 token 解析错误的问题,先 mark 一下 |
54 Zhongwei 2019-04-29 08:53:25 +08:00 Laravel 对于 CPU 的占用确实高的离谱,即使开了 opcache 也没法满足要求。 建议后台管理部分继续使用 Laravel ; API 接口按照调用的频繁程度,从高到低逐步替换成 Golang。 |
56 klgd 2019-04-29 09:01:47 +08:00 没有分析是哪里的问题吗?我们线上也有 laravel 项目在跑,目前也没遇到你这样吃 cpu 的情况 我觉得找出问题点可能比你迁移更划算 |
57 flashrick 2019-04-29 09:09:44 +08:00 我觉得 laravel 就做后台管理不错 API 还是算了吧 |
58 hanzhao 2019-04-29 09:21:29 +08:00 我司有一个项目是使用 Laravel-Swoole 部署的,不过是全新做起来的,没遇到什么问题。3 台 4 核 8G 的服务器,常年 TPS 在 2000 左右。 |
59 triptipstop 2019-04-29 09:23:09 +08:00 17 年 1 核 1G 单机 生成二维码海报 2000W PV 高峰 1000 并发 瓶颈在 MySQL 线上跑的 Laravel 一万个总有吧 你这种问题 能算万一了 |
60 tanszhe 2019-04-29 09:23:30 +08:00 @runningman 有连接池啊,github 首页就是大概介绍。看一篇你应该就知道了,最下面有 qq |
61 triptipstop 2019-04-29 09:24:26 +08:00 动不动就 Go 的人 换成任何语言 结果都一样 |
63 qbhy 2019-04-29 09:58:47 +08:00 swoole 挺好,坑都是些现成的。而且大多坑也不是因为 swoole 本身的原因,而是从 fpm 模式转变到类似 node 这种常驻脚本模式带来的问题,或者说 laravel 的设计本就不适合使用这种模式来启动程序,但是也都有相应的解决方案了。我司已经上 swoole |
64 oops1900 2019-04-29 10:16:36 +08:00 两台 2 核 8G 单台机器并发可以轻松扛起 1000+ 并发,采用的是 FPM 工作模式,楼主需要先优化 laravel 框架的一些配置缓存,然后把 FPM 设置成 static 模式,一个进程大概 20 M 你需要根据自己内存设置,然后开启 opcache,优化 nginx,问题不是出在框架上,而且优化上面,laravel 框架是比其他框架加载稍微慢了些,但是也提供了优化配置方案。 按照楼主机器这个配置负载均衡后到 1000 ~ 2000 不是问题 |
65 oops1900 2019-04-29 10:18:23 +08:00 另外 laravel-swoole 性能的确显著,不过会有一些坑。楼主可以尝试解决。 |
66 fuxiaohei 2019-04-29 10:55:53 +08:00 先优化,实在没办法再换语言 |
67 runningman 2019-04-29 11:52:19 +08:00 @tanszhe 好。加群了 |
68 jxgccaaron 2019-04-29 12:19:58 +08:00 via iPhone 贵公司还要人么 |
69 zjtsunshine OP @xiaotianhu 多谢,我们这几天就在测试 swooles,还在兼容一些代码。。。今天服务器爆炸了,紧急加了 2 台 8 核 16G,好蛋疼 |
71 raysonlu 2019-04-29 13:22:15 +08:00 @zjtsunshine 紧急加了 2 台 8 核 16G ?已经是负载均衡了? |
72 jhdxr 2019-04-29 13:31:31 +08:00 虽然 laravel 是很臃肿,但是也没这么夸张吧。你有做 profiling 看过么? |
73 eslizn 2019-04-29 13:56:16 +08:00 与其用不支持协程的 laravel swoole 解决方案,不如考虑下 zend expressive swoole ? |
74 nine 2019-04-29 14:04:28 +08:00 @raysonlu 你先看下 64 楼的吧,我就是按默认该怎么配置怎么配置的,没做什么特殊优化,因为都是早期积累的经验,你问我怎么优化的,我也说不上来,因为默认认为这么配置就行了,反而不知道错误的配置是什么样。 |
75 barbery 2019-04-29 14:31:30 +08:00 今年有个活动我们用了 laravel-s 上生产,挺稳定的没啥问题,就是协程的特征没办法用,不过实例可以长连接,在高并发场景还是不错的,省下不少创建连接的消耗,还有就是很省内存,8core16g 机器,跑 16 个 worker,内存占用率只用了 1 个 g |
76 allenhu 2019-04-29 14:43:46 +08:00 不着到问题的根源,下次慢了,继续换? |