php進程太多的解決方法:1、透過「ps -ef | wc -l」指令查看目前系統的進程;2、再使用相關指令查看佔用記憶體最大的進程;3、查詢php -fpm進程;4、殺死進程或限制記憶體大小即可。
本文操作環境:linux5.9.8系統、PHP5.5版、DELL G3電腦
php 流程太多怎麼辦?
linux伺服器php-fpm進程數過多導致記憶體佔滿處理:
早上到單位發現伺服器mysql 伺服器停了然後起來了
查詢日誌顯示記憶體滿了把mysql服務給殺了linux 伺服器如果記憶體滿了會自動清理進程防止伺服器掛掉選擇的話誰佔的的記憶體大就先殺誰我的伺服器裡面mysql服務佔的記憶體是最大的所以就把mysql就給殺了
然後重啟mysql 查詢記憶體
##在這裡說一下怎麼看linux的記憶體舉例如下顯示free是顯示的目前記憶體的使用,-m的意思是M位元組來顯示內容.我們來一起看看.$ free -m total used free shared buffers cached Mem: 1002M 769M 232M 0M 62M 421M -/+ buffers/cache: 286M 715M Swap: 1153M 0M 1153M --------------------------- 真实内存占用 = used-buffers-cached = 286M -----------------
total 内存总数: 1002M used 已经使用的内存数: 769M free 空闲的内存数: 232M shared 当前已经废弃不用,总是0 buffers Buffer 缓存内存数: 62M cached Page 缓存内存数:421M
(-buffers/cache) used内存数:286M (指的第一部分Mem行中的used - buffers - cached) (+buffers/cache) free内存数: 715M (指的第一部分Mem行中的free + buffers + cached)
sy:system 核心空間佔用cpu的百分比
ni:niced 改變優先權的程序佔用cpu的百分比
空閒cpu百分比
wa:IO wait IO等待佔用cpu的百分比
hi: Hardware IRQ 硬中斷佔用cpu的百分比
si:software 軟中斷佔用cpu的百分比
st:被hypervisor偷去的時間
第五行(Swap):类似第四行,但反映着交换分区(Swap)的使用情况。交换分区(Swap)被频繁使用,可以看作物理内存不足而造成的
top 输出界面的顶端,也显示了系统整体的内存使用情况,这些数据跟 free 类似,我就不再重复解释。我们接着看下面的内容,跟内存相关的几列数据,比如 VIRT、RES、SHR 以及 %MEM 等。
这些数据,包含了进程最重要的几个内存使用情况,我们挨个来看。
除了要认识这些基本信息,在查看 top 输出时,你还要注意两点。
第一,虚拟内存通常并不会全部分配物理内存。从上面的输出,你可以发现每个进程的虚拟内存都比常驻内存大得多。
第二,共享内存 SHR 并不一定是共享的,比方说,程序的代码段、非共享的动态链接库,也都算在 SHR 里。当然,SHR 也包括了进程间真正共享的内存。所以在计算多个进程的内存使用时,不要把所有进程的 SHR 直接相加得出结果。
只是这样看 还是不行 感觉内存 不应该 占用很多 然后 使用命令 查看 当前系统有多少进程
ps -ef | wc -l
然后使用命令查看占用内存最大的500个进程:
ps -aux | sort -k4nr | head -n 500
截取部分 PHP的进程 占到了200个 每个都100多兆
解释一下含义
USER: 行程拥有者 PID: pid %CPU: 占用的 CPU 使用率 %MEM: 占用的记忆体使用率 VSZ: 占用的虚拟记忆体大小 RSS: 占用的记忆体大小 TTY: 终端的次要装置号码 (minor device number of tty) STAT: 该行程的状态,linux的进程有5种状态: D 无法中断的休眠状态(通常 IO 的进程); R 正在运行可中在队列中可过行的; S 处于休眠状态; T 停止或被追踪; W 进入内存交换 (从内核2.6开始无效); X 死掉的进程 (基本很少見); Z 僵尸进程; < 优先级高的进程 N 优先级较低的进程 L 有些页被锁进内存; s 进程的领导者(在它之下有子进程); l 多进程的(使用 CLONE_THREAD, 类似 NPTL pthreads); + 位于后台的进程组; 注: 其它状态还包括W(无驻留页), <(高优先级进程), N(低优先级进程), L(内存锁页). START: 行程开始时间 TIME: 执行的时间 COMMAND:所执行的指令
查询PHP-fpm 总进程数
pstree|grep php-fpm
然后 查询 php-fpm 进程
ps -ef|grep php-fpm
发现PHP起了四个主进程 这里截取了三个
然后看的PHP 的配置文件
发现配置的 是 静态 配置的50个进程 四个主进程 每个配50个子进程 就200多个进程 进程太多了 平时的话 一般就六七个进程在处理 修改 进程数量 把50 改成10 这个进程数量 根据自己服务器的内存大小 来设置
查看当前php-fpm进程的内存占用情况及启动时间,命令如下:
ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,user,uid'|grep www|sort -nrk5
查看当前php-fpm进程平均占用内存情况,一般来说一个php-fpm进程占用的内存为30-40MB,命令如下:
ps --no-headers -o "rss,cmd" -C php-fpm | awk '{ sum+=$1 } END { printf ("%d%s\n", sum/NR/1024,"M") }'
然后我重启了PHP 指定配置文件
步骤
先 查找 然后 杀死
ps aux |grep php
kill 21605 (进程pid)
检测
启动
./php-fpm -y /usr/local/php/etc/php-fpm.conf
重启完 内存就降下来了
然后就事查找问题 猜测是内存泄露 但是不确定是哪里 对一些感觉有问题的地方 加上了unset()
然后检测 发现 内存一直都很平稳
如果内存还是一直增加 可以限制内存大小
设置方法:编辑php-fpm.conf配置文件
php_admin_value[memory_limit] = 128M(我服务器上的配置文件在/etc/php5/fpm/pool.d/www.conf 这个文件是被包含在php-fpm.conf里的) 后边的数字可以随便更改:32M,64M,128M,256M,512M,这个设置可根据你的服务器内存大小和你的需求来写,修改后要加载一下php-fpm服务。
这个时候 程序那个步骤出问题了 就说明哪里有内存泄露 但是也不是绝对的 这里还要了解一下 PHP的垃圾回收机制
如果你在一个进程里面 应该也是 累加的 也不是很好判断 就要根据程序 对不用的变量进程销毁 或者 限制 PHP的进程数量
注: 普通用户数据1000条 存在数组里面 大约占2246.2734375kb
普通用戶資料2000條 存在數組裡面 大約佔4472.8671875kb
推薦學習:《PHP影片教學》
以上是php 進程太多怎麼辦的詳細內容。更多資訊請關注PHP中文網其他相關文章!