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

19339 次点击
所在节点    PHP
220 条回复
documentzhangx66
2022-05-26 19:16:59 +08:00
@JaguarJack

1.PHP 本来就是有性能问题,只会 PHP 的入门程序员当然不知道。

2.Mysql 也有性能问题,真正的大佬会选 Mysql 企业版、Mariadb 、Percona 。知道为啥嘛?

3.那些说用 Redis 的也是醉了,一个简单的数据读写业务,还需要 Redis ?多大点数据?直接内存缓存不香嘛?
ferock
2022-05-26 19:19:03 +08:00
本来就一些基本优化就有 “速度提高了 10 倍不止” 的收益的事情,非要搞个 “重构”?
不重构没法显得自己技术牛逼?还是那句话


是来解决问题的还是来制造问题再解决制造的问题?
minuo0day
2022-05-26 19:33:02 +08:00
@ferock 问题解决了就好了,老哥,莫生气
KasuganoSoras
2022-05-26 19:59:42 +08:00
Swoole 一把梭,4 核 16G 机器,Mariadb 数据库+连接池,配合 Redis 缓存,正常业务查询可以做到 5~6W QPS ,简单查询可以做到 10~15w QPS ,我们公司现在就在用。
另外 Laravel 也可以轻松迁到 Swoole 的,详见 https://github.com/swooletw/laravel-swoole
hefish
2022-05-26 20:10:43 +08:00
贵公司跟 ZF 的关系通常都比较硬,没事的。
Felldeadbird
2022-05-26 21:17:06 +08:00
@minuo0day 看到了。第一次附言我以为是检查 opcache 有没有生效。生效后结束 DEBUG 。 。。
JaguarJack
2022-05-26 21:21:11 +08:00
@documentzhangx66 PHP 会有性能瓶颈。但是针对 op 情况,肯定不存在性能瓶颈的。从他的附言来看,已经无需多做解释
kingjpa
2022-05-26 21:41:19 +08:00
@JaguarJack 你就不该搭理那个 x66 键盘侠,30 万请求在他眼里都是可以直接写内存的, 他这种人除了会敲键盘 ,估计连个百人并发项目都没做过
ahu
2022-05-26 22:03:43 +08:00
@minuo0day 希望 OP 能做到管挖也管埋 😆

最后是否解决了?怎么解决的?也请及时的介绍一下,不枉这么多热心 V2er 给你出谋划策。

谢谢!
defunct9
2022-05-26 23:11:34 +08:00
@rapperx2 叫我上去的话,我估计会把它整个架构弄成 K8S 的。
minuo0day
2022-05-27 07:51:27 +08:00
@ahu 就是数据库索引还有队列优化和 redIs 缓存优化,把更多的资源请求和回源放到了 oss 和 redis
yc8332
2022-05-27 08:54:44 +08:00
直接抗流量用数据库不死就怪了。。。加一层 redis ,这个流量一点问题没有。。这个和语言没关系
cagev5
2022-05-27 09:08:55 +08:00
就喜欢这种用技术解答说明的,看不起那种既不解答直接就怼下的。
xiaotianhu
2022-05-27 09:28:56 +08:00
laravel-s/swoole 是个不错的解决方式,但是有风险。

可以找到哪个请求量不小,但是速度比较慢的接口,单独部署 2 台服务器走 laravle-s/swoole ,用 nginx rewrite 一下就行;如果失败了在走传统的 FPM 。
这样就 1-2 个接口,比较好测试,出了问题也好降级,随便弄 2 个 4 核 8G 的 ECS 就能抗住很多量了。
yc8332
2022-05-27 09:34:26 +08:00
这种流量不要去搞什么 php 常驻进程的 swoole 之类的,因为没必要,而且有很大的风险。。你们都不熟悉。。这种问题就是加一层缓存就好了,不要让性能瓶颈落到 mysql ,如果缓存还不行就是加个队列,把耗时的异常处理一下。。laravel 并发问题更容易解决了,多开几台 web 服务器,配置不用太高。成本又低
wangsfox
2022-05-27 09:45:27 +08:00
既然已经迁移到阿里云, 那就建议购买个阿里云队列服务, 调整一下请求的策略, 前端直接请求队列服务, php 程序作为队列服务的消费者在队列之后消费请求
lysS
2022-05-27 09:56:26 +08:00
语言不是太大瓶颈,数据库才是
ElmerZhang
2022-05-27 10:01:24 +08:00
楼主提供的只是些服务器、场景、性能数据等外围数据,单根据这些没办法给出准确的优化建议。
如果可以让我看数据库结构和源码的话可以微信联系我,就这场景单请求降到 100ms 以内应该不是问题。
微信号同 v2 id 。
PS:无偿的,只是想为防疫做点事情,我排队核酸时也遇到过系统崩溃的情况。
ElmerZhang
2022-05-27 10:02:28 +08:00
顺便说一下,楼上让你换框架换语言的都不要理他们,这种场景下框架和语言带来的影响不会超过 5ms
minuo0day
2022-05-27 10:33:48 +08:00
@ElmerZhang 感谢大牛,目前问题已经解决,各方派过来的技术团队都在做支撑,现在的情况基本应对轻松,如果有需要,再叨扰你,感谢~

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

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

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

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

© 2021 V2EX