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

19340 次点击
所在节点    PHP
220 条回复
minuo0day
2022-05-27 10:36:17 +08:00
@yc8332 老哥,正解
skys215
2022-05-27 10:40:15 +08:00
用了 select *吗?避免吧…
pangpre
2022-05-27 10:40:47 +08:00
1. 试试 webman ,你代码稍微改动下,就可以签过去,他是长连接 mysql 的,是常驻内存的。你们可以压测下看看。 2.简单笨方法 每台 web 上装一个 mysql 空闲时间再汇总。 甚至可以降低配置,多搞几台这样干。 3.高逼格的 缓存 队列 微服务 cdn 都用下 4.建议以后 php 框架都用 webman ,心智负担很小,性能提升百倍,而且真开源的,绝没吃相难看之说。laravel 之类的,跟不上了
R18
2022-05-27 10:52:11 +08:00
确实 opcache 已经成了 php 必不可少的扩展了,最近一个新项目服务器一直 cpu100% 全是 fpm 占用,装了 opcache 占用没超过 50%
star7th
2022-05-27 15:05:03 +08:00
看了附言,难道你之前一直开着 larave 的 debug 模式? 天啊,debug 模式加载各种东西,还要写日志等等,比正常情况下慢好几倍。这种基础错误怎么可以犯。任何框架上线都要关闭开发模式,这是常识
KyoPi
2022-05-27 15:29:48 +08:00
对数据实时性要求不高的写可以用多队列,频繁的读可以放缓存里,剩下就是数据索引 /nginx/apache 等等的优化了
huigeer
2022-05-27 17:12:48 +08:00
看来还是数据库的锅,换成带长连接的 laravel 配置,rds 的连接数配置加上去
GeorgeGalway
2022-05-27 17:17:36 +08:00
@lmmlwen 我是一条条评论从下看到上,看到你回复的笑喷了,我也 Mark 一下
HiCode
2022-05-27 17:32:13 +08:00
@star7th 我也想知道题主是不是开着 debug 模式上线了。
minuo0day
2022-05-27 17:38:49 +08:00
@star7th 那是个肯定句,大哥,主要是数据库的问题
minuo0day
2022-05-27 17:51:41 +08:00
@HiCode 当然不是了
MCyunpeng98
2022-05-27 17:58:27 +08:00
@minuo0day OP 考虑重新发个帖子,说说你们是怎么优化的不
byte10
2022-05-27 18:40:18 +08:00
关于 QPS ,回答大家一下,崩的时候 QPS 才 7K 多,崩的原因是请求数过高,瞬时 1 万 5 ,导致 CPU 过载?

我想请教一下 瞬时 1.5W ,那么一秒是多少 w ?如果一秒涌入 1.5 个请求,没啥大问题吧。最多也就是慢,cpu 负载高,只是会导致处理慢,只要逻辑正常 进程不会挂的吧?
minuo0day
2022-05-27 18:54:37 +08:00
@byte10 我们有个采集点调用那块,之前程序是写了个递归调用,导致机器人一直在跑,也就是说是自己把自己给干挂了
Outshine
2022-05-28 01:07:48 +08:00
v2 现在什么风气,正经来寻求一个问题的解决方法,非要扯语言问题引战。

看了楼里很多人说用 go 重构的,等你重构完,要么楼主先被开了,要么疫情先结束了
byte10
2022-05-28 08:11:06 +08:00
@minuo0day 嗯了解。那些说框架性能的问题基本不用理会的。在 java 领域,netty 可能比 tomcat 快一半 50%。但是实际加上业务代码 差距不会超过 20%,因为业务代码的带来的性能消耗非常大,光看框架有鸡毛用。业务代码才是性能的杀手。比如-同等 qps 下 cpu 消耗 netty : tomcat = 10:20 。但是加上业务代码之后,netty+ business : tomcat + business = 10 + 100 : 20 + 100 = 110 : 120 。 但是很多小白一上来就说框架的问题,缺少基本的判断能力和实战经验。

框架的除非设计非常的烂,不然不可能会是因为框架 影响到整个性能,换框架带来的性能一般不超过 20%。当然除非你的业务是非常的轻量级的,那么框架带来的影响还是比较大的。
minuo0day
2022-05-28 18:24:28 +08:00
@byte10 说到底,还是时间太赶,某一块的业务逻辑按照惯性写了,没有好好测和检查,这种的民生类的项目出了问题,自己内心也很愧疚
liuyibao
2022-05-29 12:22:09 +08:00
其实 FPM+OpCache 真的是很稳的,并发很能抗。很多人上来就鼓吹、协程啥的,我倒是看了很多人写的协程 bug 一堆。PHP 的定位其实是很准的,就是用简单的办法,低成本的办法把一些事情做好。
NoahVI
2022-09-09 14:23:14 +08:00
先看下是不是数据库的原因,如果不是的话。框架换成常驻内存的应该能解决问题
LDJea
2023-04-11 16:40:26 +08:00
抛弃引战的,楼里一些大佬的思路值得学习

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

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

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

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

© 2021 V2EX