一、需求: 某用户移动端App: 客户端:Vue2+Tp6 管理端:FastAdmin 服务器配置:CPU:32核,内存:32G 单体架构(宝塔):所有服务都在一台机器上具体配置如下
某用户移动端App:
客户端:Vue2+Tp6
管理端:FastAdmin
服务器配置:CPU:32核,内存:32G
单体架构(宝塔):所有服务都在一台机器上具体配置如下
linux7.x + Nginx1.1.9 + Mysql5.6 + PHP7.2
由于平台发展用户量以及
访问活跃度激增
,导致CPU + 内存跑满
,大量请求出现502状态
和500状态
,大概QPS
高的时候在1000左右
检查网站被攻击的可能性
2、检查磁盘I/O
读写速度延迟问题导致CPU和内存跑满
3、查看当前Linux吃内存和CPU较多的进程都是哪些
然后具体分析是否有执行时间过长的进程,再优化代码层面
4、优化php-FPM参数
、优化mysql参数
、优化Nginx参数
5、开启PHP慢日志
6、开启Mysql慢查询日志
根据服务商提供的信息和Nginx日志查询不曾有攻击的可能性
2、查看磁盘I/O读写有延迟
问题(可能存在问题 1.Mysql大量读写
2.日志大量读写
3.上传下载文件
)此问题存在问题3
上,有大量的图片并发上传而且没有经过压缩图片大小都在 3MB-10MB之间
,首先从代码层面改造上传压缩后的图片,将图片大小控制在1MB以内
,然后将图片上传至OSS服务
(阿里云
、腾讯云
、七牛云
)与服务器分离
,此后CPU 内存 有所缓解
。
解决负载问题,但
用户访问依旧出现502和Mysql Too many connections 问题
,查看进程存在大量PHP-FPM
进程,服务器负载无问题,则判断是PHP-FPM进程不够导致502的出现
,找到PHP-FPM的配置文件发现参数并没有根据服务器配置进行优化,服务器的配置为32核,32GB
,则可以将FPM的运行方式更改为
pm = static
(PHP-FPM运行模式)pm.max_children = 根据服务器内存计算,按照每个内存使用20MB进行计算,需要留出一切内存给其他服务使用
,pm.max_requests = 根据访问量实际情况调试
具体参数参见注意事项和结果
,配置完成重启PHP服务,观察一段时间,502问题成功解决,新的问题又出现了,Mysql Too many connections
字面意思为Mysql 连接太多
那我们就去优化一下Mysql的连接数Max_connections
此参数如果MySql 没有则自己添加一行即可,它的设置范围我是根据php的pm.max_children * 2
设置的这样目前不会出现链接数不够用的情况。设置完重启Mysql
问题也得到了很好的解决,Nginx参数优化需要根据服务器内核更改Nginx配置文件此次不做讲解(优化是为了更好的亲和服务器CPU本身Nginx的并发能力就无可厚非所以暂不讲解下次再说)
问题都解决了,还需要给每个服务开启日志记录以便后续出现问题可以快速定位到问题,或平时优化迭代使用
php慢日志开启:
request_slowlog_timeout = 3
(脚本执行超过3秒则记录到日志)slowlog = var/log/slow.log
(此文件需要自己创建)
mysql慢查询日志:
slow_query_log=1
(控制慢日志 是否开启,参数 ON|OFF) 1代表开启
slow-query-log-file=/www/server/data/mysql-slow.log
(控制文件的写入位置,参数为文件的具体位置)long_query_time=1
(设置 SQL
执行时间大于等于多少秒(可精确到微秒)时记录到日志中)log_queries_not_using_indexes
= on (参数
ON|OFF) 开启后 slow_log 文件不仅仅会记录慢查询日志,还会把查询过程中未使用索引或全表扫描的 SQL 记录到日志中
php-fpm:
如何控制子进程,选项有static(静态配置高的服务器)和dynamic(动态配置低的服务器)。如果选择static,则由pm.max_children指定固定的子进程数。如果选择dynamic,则由下开参数决定:
pm.max_children:子进程最大数
pm.start_servers: 启动时的进程数
pm.min_spare_servers :保证空闲进程数最小值,如果空闲进程小于此值,则创建新的子进程
pm.max_spare_servers :保证空闲进程数最大值,如果空闲进程大于此值,此进行清理
慢日志内容分析:
[19-Dec-2013 16:54:49] [pool www] pid 18575script_filename = /home/admin/WEB/htdocs/sandbox_canglong/test/tt.php[0x0000000003a00dc8] curl_exec() /home/admin/web/htdocs/sandbox_canglong/test/tt.php:2[0x0000000003a00cd0] exfilter_curl_get() /home/admin/web/htdocs/sandbox_canglong/test/tt.php:6日志说明:script_filename 是入口文件curl_exec() : 说明是执行这个方法的时候超过执行时间的。exfilter_curl_get() :说明调用curl_exec()的方法是exfilter_curl_get() 。每行冒号后面的数字是行号。开启后,在错误日志文件中也有相关记录。如下:[19-Dec-2013 15:55:37] WARNING: [pool www] child 18575, script '/home/admin/web/htdocs/sandbox_canglong/test/tt.php' (request: "GET /test/tt.php") executing too slow (1.006222 sec), logging[19-Dec-2013 15:55:37] NOTICE: child 18575 stopped for tracing[19-Dec-2013 15:55:37] NOTICE: about to trace 18575[19-Dec-2013 15:55:37] NOTICE: finished trace of 18575
mysql:
慢查询内容分析:
show master status;# Time: 2020-11-16T08:27:16.777259+08:00# User@Host: root[root] @ [127.0.0.1] Id: 248# Query_time: 15.293745 Lock_time: 0.000000 Rows_sent: 0 Rows_examined: 0SET timestamp=1605486436;
show master status #慢 SQLTime #出现该慢 SQL 的时间query_time# SQL 语句的查询时间(在 MySQL 中所有类型的 SQL 语句执行的时间都叫做 query_time,而在 oracle 中则仅指 select)lock_time: #锁的时间rows_sent: #返回了多少行,如果做了聚合就不准确了rows_examined:#执行这条 SQL 处理了多少行数据SET timestamp #时间戳
注意事项:参数优化完还需要再代码层面进行优化,可以定期查看PHP和Mysql的慢日志,根据记录内容进行优化。根据各个服务的参数和mysql的数据量后期可以进行服务器负载均衡以及Mysql主从
分表,分库的架构改进,根据业务逻辑增加缓存服务器和CDN服务器等等,业务处理逻辑使用MQ进行异步处理,使用Swoole协程提高并发和重构成微服务项目等等
通过此次实战解决单体架构高配置服务器调优并开启各个服务的慢日志解决访问量暴增和并发高出现的 PHP-FPM 502 以及Mysql Too many connections 问题
,也对php mysql 的配置文件进行学习 参数的意义
感谢此次阅读,如有不理解的地方请在下方留言或进行私信,如果对你产生了帮助还请给予点赞
、收藏
、或打赏
、以及分享
给需要的伙伴
。谢谢!!!
来源地址:https://blog.csdn.net/wl609586369/article/details/127949175
--结束END--
本文标题: 【PHP】宝藏级别 解决访问量暴增和并发高出现的 PHP-FPM 502 以及Mysql Too many connections 问题
本文链接: https://lsjlt.com/news/390941.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-10-23
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0