PHP プロセスが多すぎる場合の解決策: 1. 「ps -ef | wc -l」コマンドを使用して現在のシステムのプロセスを確認します; 2. 次に、関連コマンドを使用して、最も多く使用されているプロセスを確認しますメモリ量; 3. クエリ php -fpm process; 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 -----------------
Mem 行の最初の部分:
total 内存总数: 1002M used 已经使用的内存数: 769M free 空闲的内存数: 232M shared 当前已经废弃不用,总是0 buffers Buffer 缓存内存数: 62M cached Page 缓存内存数:421M
関係: 合計(1002M) = 使用済み(769M) 空き(232M)
パート 2 (-/バッファ/キャッシュ):
(-buffers/cache) used内存数:286M (指的第一部分Mem行中的used - buffers - cached) (+buffers/cache) free内存数: 715M (指的第一部分Mem行中的free + buffers + cached)
-buffers/cache は、プログラムによって実際に消費されるメモリを反映していることがわかります。Buffers/cache は、割り当て可能なメモリの総量を反映しています。
3 番目の部分は、スワップ パーティションについて言及しています。説明しなくても、誰もが理解していると思います。
読んだ後も、誰もがまだ混乱していると思います。上記の理由。最初の部分 (Mem) と 2 番目の部分 (-/buffers/cache) の used と free に関する結果が非常に奇妙なのはなぜですか。
実際、これは 2 つの側面から説明できます。
オペレーティング システムの場合、Mem のパラメータ .buffers/cached がすべて使用されるため、free は 232 だけであると考えられます。
アプリケーションの場合、それは (-/buffers/cach).buffers です。 /cached.buffer/cached はプログラム実行のパフォーマンスを向上させるためのものなので、同様に利用可能です。プログラムがメモリを使用する場合、buffer/cached はすぐに使用されます。
それでは、主に無料のアプリケーションと使用される (-/buffers/cache) のアプリケーションを見てみましょう。 Linux ディスクとメモリへのアクセスの効率を向上させるために、Linux は多くの精緻な設計を行っており、キャッシュ dentry (ファイル パス名から i ノードへの変換を高速化するために VFS で使用される) に加えて、2 つの主要な機能も採用しています。キャッシュ方法: バッファ キャッシュとページ キャッシュ。前者はディスク ブロックの読み取りと書き込みに使用され、後者はファイル i ノードの読み取りと書き込みに使用されます。これらのキャッシュは、I/O システム コール (読み取り、書き込み、getdents など) の時間を効果的に短縮できます。
メモリは使用するためのものであり、読み取るためのものではないことに注意してください。Windows とは異なり、実際の物理メモリがどれほど多くても、読み取りにはハード ディスクのスワップ ファイルを使用する必要があります。これが理由です。 Windows では、仮想領域が不足しているというメッセージが頻繁に表示されます。考えてみてください。ハードディスクにはまだ大部分のメモリがあるのに、その一部をメモリとして使用するのは退屈です。どうしてハードディスクがメモリよりも高速になるのでしょうか。 Linux を見てみましょう。スワップ領域を使用しない限り、メモリが少なすぎることを心配する必要はありません。頻繁にスワップを使用する場合は、物理メモリの追加を検討する必要があるかもしれません。これも同様です。メモリが十分であるかどうかを確認するための Linux の標準。
-------------------------------- ------------------ -------------------------------- - - - - - - - - - - - - - - - - - - - - -######次のステップ#
##サーバーのメモリが 1.9G しかないことが判明した場合は、top コマンドを使用してください。チェックアウトしてください。1 行目の先頭現在時刻、システムが稼働している日数、ユーザー数、平均システム負荷、および以下の 3 つの値は、1 分前、5 分前、15 分前の平均プロセス数です。この値は CPU の数を超えており、負荷が高すぎることを示しています。2 行目のタスクは、プロセスの総数、実行中のプロセスの数、スリープ中のプロセスの数、停止したプロセスの数、およびプロセスの数です。復元されたプロセスの数 CPU の 3 行目は次のとおりです: us: ユーザー ユーザー空間によって占有されている CPU の割合
sy:system カーネル空間によって占有されている CPU の割合
ni:niced 優先順位が変更されたプロセスによって占有されている CPU の割合 アイドル状態の CPU の割合
wa:IO wait IO 待機によって占有されている CPU の割合
hi: ハードウェア IRQ の割合ハード割り込みによって占有されている CPU
si:software ソフトウェア割り込みによって占有されている CPU の割合
st: ハイパーバイザーによって盗まれた時間
Mem の 4 行目は、合計メモリ、使用済みメモリ、空きメモリです。 ;バッファメモリは使用中です
第五行(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 中国語 Web サイトの他の関連記事を参照してください。