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

18764 次点击
所在节点    PHP
220 条回复
Dart
2022-05-26 13:47:26 +08:00
是 DB 卡吧~~~~。 做个 queue 不就行了??
iSecret
2022-05-26 13:47:41 +08:00
遇到过高并发 CPU 打满的问题,大概率 SQL 问题,70# 说得很对,得先排查读写压力,再尝试做缓存。
fuchish112
2022-05-26 13:48:15 +08:00
mark 一下,后续反馈处理结果呀,以及到底啥原因造成的
yangqingrong
2022-05-26 13:52:09 +08:00
这个需要分表,分库。mysql 调优。还需要用 nio 之类的技术。
markgor
2022-05-26 13:52:20 +08:00
>数据库和应用服务器的 CPU 利用率都打到了 100%
提议换 GO/JAVA 的,请问是 JAVA 或 GO 有超能力使 MYSQL 不被 100%吗?
如果不是的话,建议关注点还是放在 SQL 上。
数据库 100%后,应用服务器开始堆积请求,自然就大家 100%了。
遇到那么明显的问题,建议还是老老实实排查 SQL 语句吧。
markgor
2022-05-26 13:57:21 +08:00
1 、排查下 SQL ,rds 应该有配 slowLog 的啊,直接查 rds 的慢查日志。
2 、是否涉及 curl 操作,如果有设计 curl 的操作自己抽取出来或者在 curl 附近做做监测,看是否 curl 导致挂起。
3 、larave 的话建议可以替换为 webman ,但涉及改动,等哪天不是数据库 CPU100%再去考虑吧
d119
2022-05-26 14:02:34 +08:00
还是要分布式,读写分离、动静分离、高低频分离来应对这种情况,如此才好做扩展,并且能快速定位问题。
shanghai1998
2022-05-26 14:29:03 +08:00
1 可以自己用阿里云压测看下并发,你这种系统应该要 1wQPS 才好使

2 这种情况我们遇到过,原因是 php mysql 组件会占用数据库链接,导致链接数据库卡死

3 解决方案,接口换 swoole 或 go ,php fast_cgi 模式过万真的吃力
dyyhobby
2022-05-26 14:30:42 +08:00
1 、前端资源图片 js 走七牛或者阿里 OSS
2 、将 php-fpm 进程数调整到 cpu x2 并设置为静态调整。
3 、开启 opcache 将并设置缓存文件数和内存使用数等。
4 、检查 mysql 查询,利用索引优化慢查询。
5 、检查 mysql 连接数避免超出连接数。
6 、检查 mysql cpu 和内存使用频率,不可超出 80%。
7 、mysql 应读使用写分离。
8 、接口响应应低于 100ms 。
9 、如果还是很难撑过去,先读写 Reids 再同步到 MySQL 。
running17
2022-05-26 14:30:55 +08:00
和我们之前接的一个重构成 java 的项目有点像,主要瓶颈其实在递归死锁还有 SQL 上面,最早原逻辑重构到 java 也是扛不住 20w 的并发,后面整个逻辑重写+涉及的 SQL 挨条排查优化+能用缓存全部上缓存,还有一条就是不管 mysql 还是 redis 全部用 rds 后,很平稳的就撑过去了
zhaokun
2022-05-26 14:37:18 +08:00
有可能是服务器连接达到了最大限制,也可能是 fpm 进程数量达到了最大限制
shuimugan
2022-05-26 14:38:50 +08:00
阿里云 rds 有诊断报告,选中那个时间段,然后诊断一下,把报告脱敏出来看看呗
gengchun
2022-05-26 14:52:09 +08:00
不是自己开发的系统,至少火焰图整一张出来吧,APM 也上一下。一帮人瞎猜不知道猜到什么时候。
reneiw
2022-05-26 14:54:59 +08:00
如果你机器利用率上不去,看下你的 php-fpm 子进程的数量,尝试用固定模式并调大数值
yumobs
2022-05-26 14:57:50 +08:00
前端页面会变得非常慢,优化前端嘛做个 CDN 分布式嘛分开服务器放
buaacss
2022-05-26 15:05:57 +08:00
我说下我们排查这种问题的思路

1 、首先可以开一下阿里云 slb 的访问日志,你要先分析出所有的请求里哪些接口的请求是最多的,哪些是最慢的。sls 非常方便做统计和排查,比如访问最多的前 10 个 request_uri:
* | select request_uri, count(*) as cnt group by request_uri order by cnt desc limit 10 ,如果你的 request_uri 带有不同的 get 参数,可以用 split 处理一下;
访问最慢的* | select request_uri, request_time where request_time > 3 order by request_time desc

后面你说服务器 load 20%都上不去,要先确定 slb 这里有没有问题,因为 slb 的规格非常重要,首先您要看这里有没有丢弃的流量

2 、做好全平台监控。可以快速使用 cloudmonitor 建立全平台的监控大盘,包括 slb 、ecs 、memcache 、redis 、rds 、nat 。所有资源的 cpu 、内存、连接数使用率。

3 、做压测,在压测的时候看哪块是瓶颈,可以针对性优化。
1 、opcache 有没有开
2 、ecs sys 有没有很高,如果有可以通过 strace 或者 perf 看是什么系统调用占用导致
3 、全平台监控看哪儿有具体的瓶颈
4 、用 xhprof 看具体的 php 函数指标,找出调用链上的瓶颈

4 、优化
通过你的描述,比如创建临时采集点的时候,如果是录入信息太多,可否先用 mns 来写入到一个 queue 里,php 这边启动几个 consumer 来写入数据库,同时刷一个 memcache 缓存,前端可以通过查询缓存的方式来避免数据库的压力


其他的信息还比较少,暂时能想到的就这些,祝好运
geligaoli
2022-05-26 15:07:29 +08:00
嘿,楼主是不是在石家庄东软? 我也做了套功能类似的核酸检测系统,thinkphp 版本的,实际运行一小时的峰值 4 万的时候还是很稳定未崩溃过。硬件配置是单台阿里云的特价 4 核 16G 。这种检测系统业务逻辑并不复杂,如果一小时四十万的峰值,我会做标配的数据库的分库分表、读写负载均衡,然后努力加缓存,数据异步入库,避免数据库锁。管码和用户信息在 APP 端做缓存并批量上传。再者说,这么赚钱的业务,就用几台服务器,公司真是会找省钱的。
Joker520
2022-05-26 15:18:18 +08:00
大概率 sql 问题
limingxinleo
2022-05-26 15:19:10 +08:00
换成 Hyperf 框架,解决战斗!!
geligaoli
2022-05-26 15:21:25 +08:00
就一个优化方向,php 尽量使用 redis 缓存,尽量减少数据库连接和读写操作。

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

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

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

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

© 2021 V2EX