关于 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 几秒才能打开,这种情况请大神指点

19687 次点击
所在节点    PHP
220 条回复
loca1h0st
2022-05-26 10:13:18 +08:00
`前端页面会变得非常慢,基本上 10 几秒才能打开`
确认下前端资源是在 CDN 上还是在服务器上的,带宽是不是瓶颈

十合一或者二十合一可以不用一次性进数据库,先进缓存或者队列,慢慢进行消化,减少数据库的压力。

前端生成二维码的动作和医护扫描二维码的拆成两个站点,减轻压力

前端页面打开看看请求吧,有多少前端的多少后端的,哪些是可以降级或者不返回的
minuo0day
2022-05-26 10:14:31 +08:00
@gy123 带宽 100M 的流量计费模式,高压测的情况下,带宽 50%也用不了
ersic
2022-05-26 10:14:32 +08:00
参考一下,laravel 上线优化清单。https://learnku.com/laravel/t/24559
再查查数据库查询哪些地方能加缓存的,都加上。
minuo0day
2022-05-26 10:15:17 +08:00
@lp7631010 对,前端资源都放在了 OSS ,没有用 CDN
minuo0day
2022-05-26 10:15:54 +08:00
@heyjei 没有往 Nginx 想,感谢,这个值得排查一些
lp7631010
2022-05-26 10:16:04 +08:00
@minuo0day 这。。。cdn 用起来啊
ersic
2022-05-26 10:16:10 +08:00
实在不行,加上访问控制,慢点可以,别蹦了。
lp7631010
2022-05-26 10:16:33 +08:00
@minuo0day 而且要域名直接访问 oss 别经过服务器
liuyibao
2022-05-26 10:17:11 +08:00
最关键的一点,你的 opcache 开了没? 之前有朋友一个服务器,是做微信小程序接口的,经常报警,负载能打到 90%,opcache 配好后,从来没超过 5% , 另外楼上说的 调高 FPM 进程数,改成静态进程数,也是必要的,你这么高的服务器配置,开 300 个进程是没问题的。 @minuo0day
lp7631010
2022-05-26 10:17:35 +08:00
cdn 回源 oss
dem0ns
2022-05-26 10:18:12 +08:00
目测瓶颈在数据库字段索引上。建议前后端部署到不同的服务器上,前端高带宽,后端高性能。
gy123
2022-05-26 10:18:32 +08:00
@minuo0day 那感觉还是得确定看看哪里慢,比如对某个 api 埋点观察执行时间;sql 执行慢就优化相关 sql 或使用缓存队列等;接口返回慢,可能是大量请求过来线程被占用不能及时处理请求,看看是否加大线程以及是否开启了会话保活机制,关闭以应对大并发....个人浅见
minuo0day
2022-05-26 10:18:37 +08:00
@liuyibao 这些都有考虑到
Ansen
2022-05-26 10:19:34 +08:00
CPU 利用率在哪部分? user sys 还是 io?
minuo0day
2022-05-26 10:21:02 +08:00
@leo108
@gy123
一会程序低频使用的时候,我们打开 PHP-FPM 慢日志低压测看一下
minuo0day
2022-05-26 10:21:39 +08:00
@Ansen user sys
liuyibao
2022-05-26 10:23:34 +08:00
@minuo0day 确定 opcache 生效了吧,那可能是慢 sql 导致每个请求过慢。 实在不行加个 swoole 扩展,laravel 现在官方支持 swoole 和 roadrunner ,配置进去可以试下。

可以写个 aliyun 的接口调用工具,高峰时动态扩容下机器。闲时再注销掉。

这个很久以前方便临时代理用的,可以简单参考下,现在的 SDK 可能变了。启动好后加 api 调用加到负载均衡里就可以了。
liuyibao
2022-05-26 10:24:10 +08:00
570956418
2022-05-26 10:24:44 +08:00
你知道问题出在哪吗?是哪一步卡住了,那个页面有查询数据吗?现在是数据库高并发卡住了还是 PHP 处理数据卡住了?知道大概问题点更好分析一些,现在换框架可能来不及,不过有个 laravels 是 laravel + swoole 的框架,虽然不支持协程,但是性能应该比 laravel 好不少,关键切换过去,你代码几乎不用改。只是换了 PHP 的进程管理器。
liuyibao
2022-05-26 10:31:21 +08:00
https://laravel.com/docs/9.x/octane

实在不行是可以试下这个官方扩展

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

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

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

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

© 2021 V2EX