返回顶部
首页 > 资讯 > 数据库 >【PHP】宝藏级别 解决访问量暴增和并发高出现的 PHP-FPM 502 以及Mysql Too many connections 问题
  • 913
分享到

【PHP】宝藏级别 解决访问量暴增和并发高出现的 PHP-FPM 502 以及Mysql Too many connections 问题

phpmysql服务器nginx 2023-09-02 14:09:19 913人浏览 薄情痞子
摘要

一、需求: 某用户移动端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

猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作