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

18737 次点击
所在节点    PHP
220 条回复
konakona
2022-05-26 12:10:50 +08:00
1. 数据库主从和读写分离,一定要做,可以用现成的云服务(腾讯云有、阿里云也有),只需要在 laravel 的 config/database.php 里配置好,再引入 laravel 支持这样读写数据库的 package (有的,在官网文档里有)就可以运作
2. 做二级缓存,也就是 Redis 或者 Memcache 。
3. Sql 语法优化 —— 之所以提一下是没有必要做。再好的 Sql 语法,在并发到达临界线的时候都会全部卡死。只能重启 mysql 来解决。
4. php-fpm 优化,做静态分配进程数,就是有个配置叫 pm=的那个,根据每个 php-fpm 子线程的占用内存计算出这台电脑最大的 php-fpm 进程数量,然后在 php-fpm 服务启动时就启动着么多个进程,避免使用动态进程过慢引起的并发问题。
5. 做流量负载均衡,做外网访问服务的流量分发。可以用现成的云服务(腾讯云有、阿里云也有)。

6. 改成微服务架构,由于功能没多少,该用 swoole 的同时改成微服务其实很快的。让每个模块独立化运作,由统一的 local gateway 做内网通信分发。
shot
2022-05-26 12:15:42 +08:00
> 10 分钟 20 万人和 4000 医护在线
按这个数量级,并发数 1k 都不到,算不上「高并发」。
系统设计的好的话,单机 16C32G 带数据库都能撑住。

不了解 PHP 生态,但是作为一个主流成熟的框架,laravel 不至于连 1k 并发都撑不住。 → 不建议伤筋动骨换开发框架。
---

盲猜这些问题是设计开发没有质量管控,代码堆叠错乱导致的。
临时方案:先上个应用性能监控工具找出性能瓶颈吧,New Relic 或者 SkyWalking 之类,根据监控数据针对性地做优化、测试、压测。
长期方案:建立系统的软件质量管控体系。
jhdxr
2022-05-26 12:20:36 +08:00
laravel 现在有自带的 swoole 支持,Laravel Octane 。

数据库那边炸了的话应用服务器的确可能跟着炸(已经进来的请求卡在数据库查询上,还没进来的请求又排着队——你直说做了 LB ,没说限流的话我还是理解成你流量会全量打到应用服务器上的)

『但前端页面会变得非常慢,基本上 10 几秒才能打开』如果已经做了前后端分离,打开依然是白屏的那种慢,考虑上 CDN ,可能是你们的带宽到极限了。没做前后端分离那就要具体分析了,debug tool 看看是卡在 html 的返回( php 那继续优化,看看啥卡住了),还是前端资源卡住了(参考前后端分离时的方案)
roundgis
2022-05-26 12:24:39 +08:00
@minuo0day 還有遞歸?如果可以在中間加 message queue
micean
2022-05-26 12:25:54 +08:00
绝对不是 php 的事
cpu 100%是等待数据库的线程积压的结果
1 个小时需要做 40 万人口,平均 1 秒钟也要 111 人,如果一直是单条入库,数据库肯定顶不住
使用批量入库或者用 redis 做中间层
documentzhangx66
2022-05-26 12:37:35 +08:00
1.核酸这种系统,居然用 PHP 。

2.应用服务器居然只有 3 台,还是虚拟化的云服务器,而且还只是 32C 64G 。

3.服务器居然也是虚拟化的云服务器,而且只有一台,还只是 32 核 64G 。

求求你们这些官僚资本主义,能放过人民群众吗?那个城市的?我能点举报吗?
Yunen
2022-05-26 12:45:57 +08:00
@documentzhangx66 系统竞标 200W ,实际总成本 20W ,人力成本 2W
guanhui07
2022-05-26 12:48:31 +08:00
php 用 swoole 罗 ,别用 laravel ,fpm 下 laravel 抗不了 用 hyperf swoft laravel-s 这些依赖 swoole 的 ,常驻内存性能就好很多了,加上协程 类似 golang 了
LeeReamond
2022-05-26 12:48:39 +08:00
不是很理解,你们产品上线前没压测吗?自己能提供多少服务没数,为什么会出现生产中业务节点被压力打卦的情况。防火墙和任务队列应该先挂
rming
2022-05-26 12:52:07 +08:00
用 laravel 做过并发 2k 的系统,ngx + php + redis + mysql ,需要优化的细节太多,犯错的机会也太多,静态语言确实能够通过编译系统检查和高性能的轮子规避一些问题,但是业务逻辑和程序设计模式的问题,同样也会出现
举个自己的例子,很早之前用 go + opencv 写过一个图片处理的程序,因为当时不熟悉 go 和 cv ,程序性能非常差,后来用 python 重写了,发现 py 有更完善的文档和更成熟应用,更多的社区支持
@documentzhangx66
@shot
earthyan
2022-05-26 12:59:43 +08:00
先从 sql 入手吧
yEhwG10ZJa83067x
2022-05-26 13:03:25 +08:00
哈哈,OP 空的时候记得 append 分享下最后原因和结果哦,v 友都热情帮你分析了
mahone3297
2022-05-26 13:13:15 +08:00
* 阿里云的 rds ,不是有监控么?看看,db 是否有压力( cpu ,io )
* db 看有没有慢 sql
* db 没压力的话,ecs 有压力?那就水平扩展?
* 静态资源 cdn
lmmlwen
2022-05-26 13:17:18 +08:00
我先收藏一下,手上的项目日活 50w ,使用 php5.5 和 tp3 写的
DoveAz
2022-05-26 13:30:00 +08:00
二维码是前端生成的吗
qbmiller
2022-05-26 13:35:53 +08:00
1 .这么多地方 都在自建自己的 核酸二维码.... xx 人员也都想自建, 这可是活啊..😋
2. 能上 cdn 都上 ,只是比 oss 多一点成本 . 尤其图片类的,多看看大小
3. 查询那些全上 redis.
4. php 临时换 go java 也来不及, 交钱找 swool 团队看看改造方案
qbmiller
2022-05-26 13:36:51 +08:00
小程序不复杂,没几个接口,直接 go java 重写吧,
imnpc
2022-05-26 13:40:46 +08:00
这种很大概率是数据库索引有点问题 可以使用 overtrue/laravel-query-logger ,
在本地压测下 , 看日志里面那些语句执行时间长 ,
优先对查询时间长的对应语句使用下联合索引(复合索引 /混合索引)
zhuzhibin
2022-05-26 13:43:02 +08:00
@jhdxr 哥哥,依赖 roadrunner 的 php 版本基本都要 8.0+,如果是旧项目,很难迁移重构的
imnpc
2022-05-26 13:44:40 +08:00
另外 Redis 务必使用阿里云的云服务的 不要使用本机自建 因为读写性能受限的

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

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

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

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

© 2021 V2EX