php-fpm运行一段时间,内存不足

目录

一:原因分析

二:解决

三:观察系统情况


php-fpm运行一段时间,内存不足,是什么原因呢。

一:原因分析

1:首先php-fpm的配置

(1)启动的进程数 启动的进程数越多,占用内存越高;

2:其次程序处理逻辑,处理完内存是否释放;

程序处理完,内存为什么不释放呢(我的都是http请求,只要请求不出错,处理完会自动释放);

(1)查看内存占用

ps -A --sort -rss -o comm,pmem,pcpu |uniq -c |head -15 占用内存排序

查看php-fpm cpu占有率排序

ps -A --sort -rss -o comm,pmem,pcpu |grep php-fpm|awk '{print $3}'|sort

查看php-fpm的内存超过1%的pid

ps aux|grep php-fpm|grep -v grep|awk '{if(4\>=0.6)print 2}'

ps -ylC php-fpm --sort:rss php-fpm占用内存情况

(2)查看php-fpm占用的平均内存

ps --no-headers -o "rss,cmd" -C php-fpm | awk '{ sum+=$1 } END { printf ("%d%s\n", sum/NR/1024,"M") }'

发现平均是24M内存,一共100个进程 也就是2个多G

3:我的服务器一直会写日志

导致 系统cache缓存越来越大 所以导致系统内存越来越小

4:查看php-fpm的日志php-fpm.log

从2017-3到2017-8查看日志变化

正常的执行时间超过2s进程过程:

WARNING: [pool www] child 20690, script '/data/wwwroot/sdk.youjoy.tv/index.php' (request: "GET /api/user/info") executing too slow (2.109854 sec), logging

09-Mar-2017 22:04:18\] NOTICE: child 20690 stopped for tracing \[09-Mar-2017 22:04:18\] NOTICE: about to trace 20690 \[09-Mar-2017 22:04:18\] NOTICE: finished trace of 20690 执行超时的日志 20709, script '/data/wwwroot/newddzgzh.youjoy.tv/index.php' (request: "POST /index/getreward") execution timed out (60.143872 sec), terminating \[10-Mar-2017 21:36:37\] WARNING: \[pool www\] child 20704, script '/data/wwwroot/newddzgzh.youjoy.tv/index.php' (request: "POST /index/valid") execution timed out (60.158891 sec), terminating \[10-Mar-2017 21:36:37\] WARNING: \[pool www\] child 20704 exited on signal 15 (SIGTERM) after 357304.947644 seconds from start \[10-Mar-2017 21:36:37\] NOTICE: \[pool www\] child 6897 started \[10-Mar-2017 21:36:37\] WARNING: \[pool www\] child 20709 exited on signal 15 (SIGTERM) after 357304.930312 seconds from start ##### 二:解决 1(优化php-fpm的库) (1)查看库 `pmap $(pgrep php-fpm|``head` `-` 发现内存载入的大文件 /usr/lib/locale/locale-archive 这个文件是关于语言支持的,默认包含各种语言和字符集支持,服务器用的是字符界面,根本不需要那么多,有en_US.UTF-8就差不多了,最多加个中文zh_CN `查看语言支持列表` localedef --list-archive cd /usr/lib/locale/ mv locale-archive locale-archive.old 添加en_US.UTF-8和中文 localedef -i en_US -f UTF-8 en_US.UTF-8 1036 localedef -i zh_CN -f UTF-8 zh_CN.UTF-8 1037 localedef -i zh_CN -f GB2312 zh_CN 1038 localedef -i zh_CN -f GB2312 zh_CN.GB2312 1039 localedef -i zh_CN -f GBK zh_CN.GBK 1040 localedef -f UTF-8 -i zh_HK zh_HK.UTF-8 1041 localedef -f UTF-8 -i zh_TW zh_TW.UTF-8 1042 localedef -f UTF-8 -i zh_SG zh_SG.UTF-8 pmap $(pgrep php-fpm\|head -n 1) 2:查看slow.log 找出执行慢的代码,优化代码,减少执行时间,这样就能更快处理,及时释放内存; 3:通过观察发现php-fpm从重启完 每个进程占用0.4 到后来的0.6% 变化不太大; slabtop 查看slabcache使用 跟踪进程的执行: strace -fp 27868(pid) -e trace=stat strace -fp 27868 -e trace=open,stat,close,unlink 考虑系统cache占用一直增加; 调整系统cache让系统自动回收 (1) 查看 释放内存临界值: grep low /proc/zoneinfo 最低 3个值相加\*4KB 就是内存阈值 为640M grep high /proc/zoneinfo 最高 (2) sysctl -w vm.min_free_kbytes=524200 设置最小的空闲物理内存为512M(这些内存应用程序是不能占用的,是给系统用的) sysctl -w vm.vfs_cache_pressure=130 加快cache的释放 默认100 越大释放越快 /proc/sys/vm/vfs_cache_pressure 该文件表示内核回收用于directory和inode cache内存的倾向;缺省值100表示内核将根据pagecache和swapcache,把directory和inode cache保持在一个合理的百分比;降低该值低于100,将导致内核倾向于保留directory和inode cache;增加该值超过100,将导致内核倾向于回收directory和inode cache。 查看结果 sysctl -a\|grep vm ##### 三:观察系统情况 运行top,查看占用情况 ![](https://file.jishuzhan.net/article/1741120815451082754/3a292691fcf737a37bd4f0c3f7edf89f.webp)

相关推荐
CodeWithMe11 分钟前
【C/C++】EBO空基类优化介绍
开发语言·c++
404.Not Found21 分钟前
Day46 Python打卡训练营
开发语言·python
love530love23 分钟前
【PyCharm必会基础】正确移除解释器及虚拟环境(以 Poetry 为例 )
开发语言·ide·windows·笔记·python·pycharm
凌辰揽月25 分钟前
Web后端基础(基础知识)
java·开发语言·前端·数据库·学习·算法
海奥华228 分钟前
go中的接口返回设计思想
开发语言·后端·golang
lifallen30 分钟前
深入浅出 Arrays.sort(DualPivotQuicksort):如何结合快排、归并、堆排序和插入排序
java·开发语言·数据结构·算法·排序算法
运维开发王义杰30 分钟前
Python: 告别 ModuleNotFoundError, 解决 pipx 环境下 sshuttle 缺少 pydivert 依赖的终极指南
开发语言·python
k要开心32 分钟前
从C到C++语法过度1
开发语言·c++
小吕学编程35 分钟前
策略模式实战:Spring中动态选择商品处理策略的实现
java·开发语言·设计模式
q567315231 小时前
IBM官网新闻爬虫代码示例
开发语言·分布式·爬虫