关于 PHP 高并发,请教各位

2022-05-26 09:53:36 +08:00
 minuo0day

H5 页面的核酸系统,前后端分离,前端 VUE ,后端 PHP 自己搭的 larave 框架,数据库 mysql,Nginx , 三台负载均衡的天翼云应用服务器,都是 32 核 64G ,一台数据库服务器 16 核 32G ; 基本业务逻辑: 用户端,进入页面绑定自己身份证号手机号乡镇信息等个人信息,前端凭借身份证号直接生成个人二维码,向医护人员出示二维码,1 个小时需要做 40 万人口的核酸; 医护端,手机号身份证号登录或者申请,登入先选采集点,扫开箱码,再扫试管码选择十合一或二十合一,再点击添加人员打开扫一扫扫居民个人码添加;

24 日早上 4 点 30 ,医护人员开始大量的开始进入程序扫箱码开箱,并在后台开始大量的添加临时采集点,于 4 点 58 分,CPU 使用率 100%,系统崩溃,日志显示,瞬间请求数 1 万 4 ,重启在进入还是崩;

24 日下午系统整体挪到阿里云服务器,也是三台负载均衡的服务器,三台 32 核 64G ,加了 OSS ,用了阿里云的云数据库 RDS 版,主实例 8 核 16G ,只读数据库服务器 8 核,压测 10 分钟 15 万人,和 4000 医护人员同时在线也崩了,数据库和应用服务器的 CPU 利用率都打到了 100%,为了保障第二天不出问题,临时调大了一台应用服务器调到了 52 核,并同时把读写的两台数据库服务器都调到了最大 104 核,第二天检测才扛过去。

问:我们虽然调大了服务器的配置,但调大以后压测 10 分钟 20 万人和 4000 医护在线,服务器承载 20%都上不去,但前端页面会变得非常慢,基本上 10 几秒才能打开,这种情况请大神指点

18780 次点击
所在节点    PHP
220 条回复
ferock
2022-05-26 15:25:51 +08:00
为什么有的人动不动 swoole ,真的是来解决问题的么?还是来制造问题的?
liunan1321
2022-05-26 15:26:57 +08:00
试下
undefinedList
2022-05-26 15:29:39 +08:00
楼上那些上来就说:竟然用 PHP 的
php 是吃你家大米了还是害了你了?项目写的不好和 PHP 啥关系,上来就喷,真就为喷而喷呗。

1 、首先人现有的系统正在跑,重写现有的系统这个代价还是很大的~
2 、其次根据描述,还是开 sql 慢日志 + fpm 慢日志 + opcache
3 、根据 2 的日志查并改,短时间之内能加钱就不要考虑其他。确定能解决找个低谷期或同配置复制机器去做压测。

大概率数据库的问题

OP 有结果了记得这里通知下~我想大家也都好奇你们是个什么情况, 当然,再出个溯源帖子是最棒了~

其他:我这边接手别人的烂项目主要问题出在:mysql 的索引上,看似有索引但 SQL 不规范导致的类型转换会没有使用上索引,规范 SQL 解决
liunan1321
2022-05-26 15:30:25 +08:00
试下:
1. Laravel 加路由缓存了吗? php artisan route:cache
2. 排查有没有 N+1 问题
3. 看你用了 redis ,那 Laravel 尽量能异步处理的任务都扔 redis 队列中去处理
4. 数据实时性要求不高的页面,全部用 redis 缓存处理
pengtdyd
2022-05-26 15:32:04 +08:00
PHP 也能谈并发了??? C 是不配还是怎么地。
pengtdyd
2022-05-26 15:34:53 +08:00
历史的教训告诉我们不要试图去优化一坨 s ,你应该做的是立刻丢弃它。
pastor
2022-05-26 15:43:10 +08:00
golang 火的依据+1
limingxinleo
2022-05-26 15:45:30 +08:00
@ferock 为什么提 Swoole ,是因为这个量,用 Swoole 真的很容易就顶住了。。。

哪来这么多麻烦事呢
tobeagoodfather
2022-05-26 15:47:17 +08:00
盲猜问题在数据层面。
tobeagoodfather
2022-05-26 15:51:15 +08:00
上一条没写完。建议楼主关注下查询和修改是否都命中索引,还有表设计是否合理。另外,看下日志里每次查询所花费的时间,关注重点接口的 sql 耗时,或者 db 的慢查询日志,逐条处理。还要看下 db 的连接数控制,阿里云的 rds 支持中间件,可以处理长连接,建议用上(不用改代码)。或者看下 Laravel 是否支持 db 长连接配置。
JaguarJack
2022-05-26 15:58:00 +08:00
坐等 OP 打楼上喷 PHP 性能的。从 OP 的描述来看,明显是代码写的有问题,大概是 SQL 导致的。

还有别一遇到性能就是 Swoole ,一个扩展社区都分裂。谁敢用呢?引入 Swoole ,只会引入新问题
limingxinleo
2022-05-26 16:01:59 +08:00
现阶段,如果不差钱的话,多加应用服务器放 Laravel 代码,然后 MySQL 加一个 代理,用来处理和 MySQL 的连接池。

或者不要代理,直接把 MySQL 写库性能顶到最高,加一排只读库。

都可以迅速解决问题。后面再慢慢排查吧。
lait233
2022-05-26 16:11:56 +08:00
swoole 口碑变差就是这帮无脑说 swoole 的人。人家已经定型的项目一直在这 BBswoole 。现在要的是 FPM 模式下的代优化和数据库优化。
HalfaMillion
2022-05-26 16:16:25 +08:00
哈哈 12306 为什么不用 swoole 做,swoole 这么牛掰
HalfaMillion
2022-05-26 16:17:39 +08:00
不对,还有 hypef
suyuyu
2022-05-26 16:19:24 +08:00
larave 高并发,,,上 swoole
chowhwei
2022-05-26 16:26:26 +08:00
卡在哪里知道吗?
pxllong
2022-05-26 16:29:43 +08:00
1 阿里云的 rds 对短连接不用好,先启用 php 长链接用阿里云的数据库代理,多开几个 rds 的从节点。
2. 配置这么高的 ecs 有点浪费。
3. 检查下数据库的慢查询和 php 的 slow log ,提前规划好分表, 建议用阿里云的 PolarDB.省去分表烦恼
4. 优化下访问链路 cdn->slb->ecs
5.大招 空间换时间了 redis 先抗住流量而不是打不开
MoYi123
2022-05-26 16:31:01 +08:00
larave 再差也是世界知名的框架, 并发量也不是很高, 一般情况都是先怀疑自己的代码的问题吧.

遇到性能问题上来就什么 GC 调优, 换框架, 加缓存, 加消息队列的感觉会把问题复杂化.
limingxinleo
2022-05-26 16:53:40 +08:00
加配置如果能顶住的话,就可以了。
多花点钱而已。
然后开始一点一点重构,无论是 Swoole 还是 Workerman 都行。

在 V2EX 里说 Swoole 很容易遭嘲讽,那就 Workerman 配合 fiber 。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/855361

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX