首頁 > 後端開發 > PHP問題 > php 進程太多怎麼辦

php 進程太多怎麼辦

藏色散人
發布: 2023-03-13 21:00:02
原創
3666 人瀏覽過

php進程太多的解決方法:1、透過「ps -ef  | wc -l」指令查看目前系統的進程;2、再使用相關指令查看佔用記憶體最大的進程;3、查詢php -fpm進程;4、殺死進程或限制記憶體大小即可。

php 進程太多怎麼辦

本文操作環境: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
-----------------
登入後複製

 

第一部分Mem行:

total 内存总数: 1002M
used 已经使用的内存数: 769M
free 空闲的内存数: 232M
shared 当前已经废弃不用,总是0
buffers Buffer 缓存内存数: 62M
cached Page 缓存内存数:421M
登入後複製

 

關係:total(1002M) = used(769M) free(232M)

 

第二部分(-/ buffers/cache):

(-buffers/cache) used内存数:286M (指的第一部分Mem行中的used - buffers - cached)
(+buffers/cache) free内存数: 715M (指的第一部分Mem行中的free + buffers + cached)
登入後複製

 

可見-buffers/cache反映的是被程式實在吃掉的內存,而buffers/cache反映的是可以挪用的記憶體總數。

 

第三部分是指交換分區, 我想不講大家都明白.

 

我想大家看了上面,還是很暈.第一部分(Mem)與第二部分(-/ buffers/cache)的結果中有關used和free為什麼這麼奇怪.

其實我們可以從二個方面來解釋.

#對作業系統來講是Mem的參數.buffers/cached 都是屬於被使用,所以它認為free只有232.

對應用程式來講是(-/ buffers/cach).buffers/cached 是等同可用的,因為buffer/cached是為了提高程式執行的效能,當程式使用記憶體時,buffer/cached會很快地被使用。

 

所以,以應用來看看,以(-/ buffers/cache)的free和used為主.所以我們看這個就好了.另外告訴大家一些常識.Linux為了提高磁碟和記憶體存取效率, Linux做了很多精心的設計, 除了對dentry進行快取(用於VFS,加速檔案路徑名到inode的轉換), 還採取了兩種主要Cache方式:Buffer Cache和Page Cache。前者針對磁碟區塊的讀寫,後者針對檔案inode的讀寫。這些Cache能有效縮短了 I/O系統呼叫(例如read,write,getdents)的時間。

 

記住記憶體是拿來用的,不是拿來看的.不像windows, 無論你的真實物理記憶體有多少,他都要拿硬碟交換檔來讀.這也就是為什麼windows常常提示虛擬空間不足的原因.你們想想,多無聊,在記憶體還有大部分的時候,拿出一部分硬碟空間來充當記憶體.硬碟怎麼會快過記憶體.所以我們看linux,只要不用swap的交換空間,就不用擔心自己的內存太少.如果常常swap用很多,可能你就要考慮加物理內存了.這也是linux看內存是否夠用的標準哦.

-------------------------------------------------- -------------------------------------------------- ----------------------

接來下

發現伺服器的記憶體就剩下1.9G了再用top指令看看

 

第一行top分別為:目前時間;系統運作天數;使用者個數;系統負載的平均值,後面的三個值分別為1分鐘前、5分鐘前、15分鐘前進程的平均數,這個數值超過CPU 數目時,說明負載過高

第二行Tasks分別為:進程總數;運行進程數;睡眠行程數;被停止的進程數;被復原的進程數

第三行CPU(s)分別為:

us:user 用戶空間佔用cpu的百分比 

sy:system 核心空間佔用cpu的百分比 
ni:niced 改變優先權的程序佔用cpu的百分比 
空閒cpu百分比 
wa:IO wait IO等待佔用cpu的百分比 
hi: Hardware IRQ 硬中斷佔用cpu的百分比 
si:software 軟中斷佔用cpu的百分比 
st:被hypervisor偷去的時間

第四行Mem分別為:總記憶體;已使用內存;空閒記憶體;緩衝使用中記憶體

第五行(Swap):类似第四行,但反映着交换分区(Swap)的使用情况。交换分区(Swap)被频繁使用,可以看作物理内存不足而造成的

top 输出界面的顶端,也显示了系统整体的内存使用情况,这些数据跟 free 类似,我就不再重复解释。我们接着看下面的内容,跟内存相关的几列数据,比如 VIRT、RES、SHR 以及 %MEM 等。

这些数据,包含了进程最重要的几个内存使用情况,我们挨个来看。

  • VIRT 是进程虚拟内存的大小,只要是进程申请过的内存,即便还没有真正分配物理内存,也会计算在内。
  • RES 是常驻内存的大小,也就是进程实际使用的物理内存大小,但不包括 Swap 和共享内存。
  • 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 &#39;pid,comm,args,pcpu,rsz,vsz,stime,user,uid&#39;|grep www|sort -nrk5
登入後複製

查看当前php-fpm进程平均占用内存情况,一般来说一个php-fpm进程占用的内存为30-40MB,命令如下:

ps --no-headers -o "rss,cmd" -C php-fpm | awk &#39;{ sum+=$1 } END { printf ("%d%s\n", sum/NR/1024,"M") }&#39;
登入後複製

然后我重启了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中文網其他相關文章!

相關標籤:
php
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板