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)

相关推荐
BingoGo18 小时前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php
JaguarJack18 小时前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php·服务端
BingoGo2 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php
JaguarJack2 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php·服务端
JaguarJack3 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
后端·php·服务端
BingoGo3 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
php
JaguarJack4 天前
告别 Laravel 缓慢的 Blade!Livewire Blaze 来了,为你的 Laravel 性能提速
后端·php·laravel
郑州光合科技余经理4 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
DianSan_ERP4 天前
电商API接口全链路监控:构建坚不可摧的线上运维防线
大数据·运维·网络·人工智能·git·servlet
feifeigo1234 天前
matlab画图工具
开发语言·matlab