V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
minuo0day
V2EX  ›  PHP

关于 PHP 高并发,请教各位

  minuo0day · 2022-05-26 09:53:36 +08:00 · 19573 次点击
这是一个创建于 911 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

第 1 条附言  ·  2022-05-26 17:29:30 +08:00
嚯,没想到引发了热议,对语言和框架就不评判了,目前确定 opcache 生效后,DEBUG 关闭后,5 分钟 30 万读和 4700 医护人员同时开管扫码加人速度提高了 10 倍不止,目前程序每个接口运行 1.7S ,速度很快,感谢各位大佬
第 2 条附言  ·  2022-05-26 18:23:43 +08:00
“确定 opcache 生效和 DEBUG 关闭后”这个是一个确定语句,伙计们,勿喷
具体做了,直接取 redis 缓存,不用直接操作数据库,只有在用户更换采集点的时候去修改下缓存,以及而且大量操作的时候添加了一下锁;
第 3 条附言  ·  2022-05-27 10:40:42 +08:00
已解决,数据库调整一下,不用分库分表,做索引,优化下缓存就解决问题了,大佬们不用讨论框架的问题了,FPM 是没有问题的
第 4 条附言  ·  2022-05-27 10:53:59 +08:00
关于 QPS ,回答大家一下,崩的时候 QPS 才 7K 多,崩的原因是请求数过高,瞬时 1 万 5 ,导致 CPU 过载
220 条回复    2023-04-11 16:40:26 +08:00
1  2  3  
minuo0day
    201
minuo0day  
OP
   2022-05-27 10:36:17 +08:00
@yc8332 老哥,正解
skys215
    202
skys215  
   2022-05-27 10:40:15 +08:00
用了 select *吗?避免吧…
pangpre
    203
pangpre  
   2022-05-27 10:40:47 +08:00 via iPhone
1. 试试 webman ,你代码稍微改动下,就可以签过去,他是长连接 mysql 的,是常驻内存的。你们可以压测下看看。 2.简单笨方法 每台 web 上装一个 mysql 空闲时间再汇总。 甚至可以降低配置,多搞几台这样干。 3.高逼格的 缓存 队列 微服务 cdn 都用下 4.建议以后 php 框架都用 webman ,心智负担很小,性能提升百倍,而且真开源的,绝没吃相难看之说。laravel 之类的,跟不上了
R18
    204
R18  
   2022-05-27 10:52:11 +08:00
确实 opcache 已经成了 php 必不可少的扩展了,最近一个新项目服务器一直 cpu100% 全是 fpm 占用,装了 opcache 占用没超过 50%
star7th
    205
star7th  
   2022-05-27 15:05:03 +08:00
看了附言,难道你之前一直开着 larave 的 debug 模式? 天啊,debug 模式加载各种东西,还要写日志等等,比正常情况下慢好几倍。这种基础错误怎么可以犯。任何框架上线都要关闭开发模式,这是常识
KyoPi
    206
KyoPi  
   2022-05-27 15:29:48 +08:00
对数据实时性要求不高的写可以用多队列,频繁的读可以放缓存里,剩下就是数据索引 /nginx/apache 等等的优化了
huigeer
    207
huigeer  
   2022-05-27 17:12:48 +08:00
看来还是数据库的锅,换成带长连接的 laravel 配置,rds 的连接数配置加上去
GeorgeGalway
    208
GeorgeGalway  
   2022-05-27 17:17:36 +08:00
@lmmlwen 我是一条条评论从下看到上,看到你回复的笑喷了,我也 Mark 一下
HiCode
    209
HiCode  
   2022-05-27 17:32:13 +08:00
@star7th 我也想知道题主是不是开着 debug 模式上线了。
minuo0day
    210
minuo0day  
OP
   2022-05-27 17:38:49 +08:00
@star7th 那是个肯定句,大哥,主要是数据库的问题
minuo0day
    211
minuo0day  
OP
   2022-05-27 17:51:41 +08:00
@HiCode 当然不是了
MCyunpeng98
    212
MCyunpeng98  
   2022-05-27 17:58:27 +08:00
@minuo0day OP 考虑重新发个帖子,说说你们是怎么优化的不
byte10
    213
byte10  
   2022-05-27 18:40:18 +08:00
关于 QPS ,回答大家一下,崩的时候 QPS 才 7K 多,崩的原因是请求数过高,瞬时 1 万 5 ,导致 CPU 过载?

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

看了楼里很多人说用 go 重构的,等你重构完,要么楼主先被开了,要么疫情先结束了
byte10
    216
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
    217
minuo0day  
OP
   2022-05-28 18:24:28 +08:00
@byte10 说到底,还是时间太赶,某一块的业务逻辑按照惯性写了,没有好好测和检查,这种的民生类的项目出了问题,自己内心也很愧疚
liuyibao
    218
liuyibao  
   2022-05-29 12:22:09 +08:00   ❤️ 1
其实 FPM+OpCache 真的是很稳的,并发很能抗。很多人上来就鼓吹、协程啥的,我倒是看了很多人写的协程 bug 一堆。PHP 的定位其实是很准的,就是用简单的办法,低成本的办法把一些事情做好。
NoahVI
    219
NoahVI  
   2022-09-09 14:23:14 +08:00
先看下是不是数据库的原因,如果不是的话。框架换成常驻内存的应该能解决问题
LDJea
    220
LDJea  
   2023-04-11 16:40:26 +08:00
抛弃引战的,楼里一些大佬的思路值得学习
1  2  3  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5822 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 31ms · UTC 01:59 · PVG 09:59 · LAX 17:59 · JFK 20:59
Developed with CodeLauncher
♥ Do have faith in what you're doing.