线上环境内存持续升高
线上部署的API项目,最近发现内存会出现持续升高的现象。
环境说明:
- 阿里服务器一台4核8G,一台2核4G,均为centos7.4 + nginx1.12+php7.2
- php-fpm配置
pm=dynamic pm.max_children = 50 pm.start_servers = 5 pm.min_spare_servers = 5 pm.max_spare_servers = 35
- 已开启opcache
现象描述:
重启php-fpm内存占用率就会降到5%,但是基本过个一两天内存占用就会上升到50%,如果不重启php-fpm它就会一直上升。
目前自己写了个shell脚本,定时检查服务器内存占用,超过一定额度就去重启php-fpm。但还是想要知道到底是什么原因导致的这种问题。
因为接口内容比较多,不知道该如何定位到问题;加上自己才接触服务器运维没多久,没什么分析的思路。
希望大家能提供给我一个定位问题或者排查问题的思路。
可以看下 fpm 的配置文件,重点关注下 pm、pm.max_requests、pm.max_children 这几个参数的配置
1.php-fpm相关配置:运行模式、max_children、start_servers、min_spare_servers、max_spare_servers 2.是否有装opcache? opcache怎么配置的? 稳定占用50% 其实也还好,具体看你环境是如何配置的
我之前也碰到过这种问题,我那时候是在爬数据,可能是运行久,有些数据没有释放一直累积。
df -h top 看下 ,看看有没有缓存 、日志、矿机等情况
看一下mysql和php慢日志,应该是某个操作时间过长了。
phpfpm不是有一个运行多少次就会重启的配置吗?pm.max_requests = 200 这样子试试
一般在项目中,我们都会用到一些 PHP 的第三方库,这些第三方库经常存在内存泄漏问题,如果不定期重启 PHP-CGI 进程,势必造成内存使用量不断增长。因此 PHP-FPM 作为 PHP-CGI 的管理器,提供了这么一项监控功能,对请求达到指定次数的 PHP-CGI 进程进行重启,保证内存使用量不增长。合理的配置 pm.max_requests 的值即可
php-fpm的work进程处理请求达到pm.max_requests数量时,这个子进程会重启,内存一般来说有有所降低,但是如果在重启期间,处理的请求都需要占用大量内存,php-fpm的内存占用确实会持续升高的,一个请求结束后,虽然内存会被释放掉,但是并不是释放给系统,而是释放给处理这个请求的php-fpm子进程。所以,你代码中很有可能存在部分接口,占用内存量特别大的。得好好检查下