关于php服务器502问题处理(cpu过高,内存过高)

关于php服务器502问题处理(cpu过高,内存过高)

以前从未关注过各项配置问题,但公司项目运行稳定,客户量逐渐增加,这些问题逐渐显露出来.服务器开始出现502问题,于是踏上了痛苦的探索道路

最初问题CPU经常达到90%以上

一、连接到服务器使用top命令查看服务器可以看到以下结果

接下来查找资料我了解到:
load average即cpu负载情况
分别代表了最近1分钟,5分钟,15分钟CPU的平均负载情况。
如果是单核CPU的话,1.00就表示CPU已经满负荷了,
如果是多核CPU的话,load average达到CPU的核数即说明该CPU已经满负荷了,
如果是多颗物理CPU,则当load average达到所有物理CPU的总核数时,说明系统CPU满负荷了。
正常情况下负载达到CPU核数乘以0.7,我们就需要注意了
当然一个小公司并没有59核CPU这种牛逼闪闪的东西,综上我们的4核CPU快炸了
在这里插入图片描述

二、然后我们查看进程 ps -ef | grep php-fpm | wc -l

这个当时只顾着解决问题了并没有截图,模糊记得起了很多php-fpm的进程占用了cpu
一些太深入专业的东西我可能描述不清,只能笼统的认为php-fpm是管理php进程的一个东西,我们可以通过一些参数控制他
运行方式pm = dynamic(此配置为动态,即根据实际需求分配线程数,此状态下一下参数均生效,可以设置为静态,如果设置为静态,仅最大进程数pm.max_children生效)
启动时进程数 pm.start_servers(动态模式下,最开始启动的线程数)
最大进程数,pm.max_children(动态模式下最多会启用的线程数,或静态状态下一直保持的进程数)
空闲最小进程数,pm.min_spare_server(当空闲时如果达到最大进程数会将杀死一些进程,剩余到此配置个数)
空闲最大进程数 pm.max_spare_servers(当空闲是达到多少进程数开始杀死进程)
一个进程可以接受的多少请求pm.max_requests(一个进程接受多少个请求后被杀死,启动新的进程)
请求超时时间request_terminate_timeout(避免死循环,运行多久后超时)
由以上可知如果设置的最大请求数为0,空闲最大进程数又过大就可能出现很多进程占用了cpu的情况出现
修改了这些参数cpu占用问题得以解决
至于设置pm.max_children为多少,一个php-fpm进程会占用内存为20-30M之间,可根据自己服务器配置进行设置(个人认为要记得预留一部分空间给其他程序)

经过以上配置CPU占用高问题暂时得以解决

内存占满问题(以下是一个错误的方向,只能算个人学习的一个记录 )

一、服务器稳定了大概一个星期左右,后台进行一些操作时依然出现502问题,惆怅,再次踏上征程

依然使用top命令,查看了服务器的状态
在这里插入图片描述
当时的截图没有了截了一个现在的,当时情况差不多服务器时8G的内存,但是现实79xxxxxx被使用,当时有点方,各种资料瞎查起来
当时执着的认为跟PHP-FPM有关修改了无数遍参数,依然会出现502情况
但是通过ps aux --sort -rss查看内存使用情况,看上去使用的内存并不足以占满内存
使用ps -ef | grep php-fpm | wc -l查看php-fpm进程数,按照自己设置的值起最大线程每个线程占用30M也不应该到达这个量
使用ps aux | awk '{mem += $6} END {print mem/1024/1024}'查看当前进程占用的内存,果然并不足以占满

彻底迷茫了,只能通过重启服务解决,最后跟老板申请升级内存,觉得升级以后肯定能解决

二、升级内存后,没几天又出现502,心情彻底炸了…

有开始了查资料,通过这次才了解到,linux服务器的内存被占用并不是真正的被占用,它分为了进程占用和缓存占用
使用free -m查看内存使用情况
在这里插入图片描述
我们可以看到按以上
其实这是linux的一个特别好的特性,linux将空余的内存拿出来做缓存,将读写过的东西放到缓存里,当再次用到时可以直接拿出来,提高反应速度,buffer对应写缓存cached为读缓存 ,当系统判断你的内存不够跑你的程序的时候回自动释放一部分缓存给你的程序
在以上中我们可以看到这两项加起来占用了8G左右,其实这部分是可以释放的并不影响
当时我固执的认为是以为系统释放给我的内存不够我的程序跑才造成502
然后各种查资料想要设置内存释放的阙值,但是果然太高深,我彻底的绝望了,再次开始了定期重启的做法

三、此间偶然发现只有在访问特定后台页面后会出现502情况,忽然感觉摸到了什么

查看了服务器的Mysql,发现没有问题,又捣鼓了好几天发现使用的是阿里云rds服务器
查询了阿里云rds服务器,发现在访问了这个页面以后rds服务器cpu达到90%多这期间开始出现502
卧槽、卧槽、卧槽
然后就是查rds的各种操作了,查慢日志,让同事优化他们这个页面的sql,加索引,但是依然无法解决问题,依然在访问页面时出现cpu升高的问题
仔细查看了代码,查询速度很快,完全不知道为什么会出现cpu升高的问题
最后在js代码中发现有一个ajax请求,是ecshop中原带的一个请求,查询量极大循环一个数组,在数组中再查询mysql,每次循环中大概查询操作10w条数据,但具体是干嘛的又因为代码太高深看不懂了,最后只能注释了这段代码,发现好像对日常的功能并没有影响,最后没有深究

参考资料:
php-fpm占用cpu和内存过高100% 解决办法 该文章中服务器参数配置并没有问题是因为确实硬件无法满足造成,大家可根据该文章判断自己的硬件是否够用

以上

猜你喜欢

转载自blog.csdn.net/wolegequ1993/article/details/85240622