Rumah >pembangunan bahagian belakang >masalah PHP >Apa yang perlu dilakukan jika terdapat terlalu banyak proses php
Penyelesaian kepada terlalu banyak proses PHP: 1. Gunakan arahan "ps -ef | wc -l" untuk melihat proses sistem semasa 2. Kemudian gunakan arahan yang berkaitan untuk melihat proses yang menggunakan jumlah memori terbesar; 3. Pertanyaan PHP -fpm proses 4. Hanya mematikan proses atau hadkan saiz memori.
Persekitaran pengendalian artikel ini: sistem linux5.9.8, versi PHP5.5, komputer DELL G3
proses php terlalu Apa yang perlu dilakukan jika terdapat terlalu banyak?
Mengendalikan bahawa memori penuh kerana terlalu banyak proses php-fpm pada pelayan Linux:
Saya pergi bekerja pagi ini dan mendapati bahawa pelayan mysql berhenti dan kemudian dimulakan
Log pertanyaan menunjukkan bahawa memori telah penuh. Jika anda memilih, sesiapa yang menduduki paling banyak memori akan dibunuh dahulu Pelayan saya mempunyai perkhidmatan mysql yang terbesar, jadi saya membunuh mysql
dan kemudian memulakan semula mysql. untuk menanyakan memori
Katakan ini di sini Cara menyemak memori Linux
Sebagai contoh
Seperti yang ditunjukkan di bawah, percuma menunjukkan memori semasa penggunaan, dan -m bermaksud M bait untuk memaparkan kandungan Mari kita lihat
$ 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 -----------------
Bahagian 1 Mem baris:
total 内存总数: 1002M used 已经使用的内存数: 769M free 空闲的内存数: 232M shared 当前已经废弃不用,总是0 buffers Buffer 缓存内存数: 62M cached Page 缓存内存数:421M
Perhubungan: jumlah(1002M) = digunakan(769M) percuma(232M)
Bahagian 2 (-/penampan/cache):
(-buffers/cache) used内存数:286M (指的第一部分Mem行中的used - buffers - cached) (+buffers/cache) free内存数: 715M (指的第一部分Mem行中的free + buffers + cached)
Ia boleh dilihat bahawa -buffer/cache mencerminkan kandungan sebenar program Memori yang digunakan, dan buffer/cache mencerminkan jumlah memori yang boleh diperuntukkan.
Bahagian ketiga merujuk kepada partition swap saya rasa semua orang faham tanpa menjelaskannya
Saya rasa semua orang masih keliru selepas membaca. di atas. .Mengapa keputusan tentang terpakai dan percuma di bahagian pertama (Mem) dan bahagian kedua (-/buffers/cache) sangat pelik.
Malah, kita boleh menerangkannya dari dua aspek.
Untuk sistem pengendalian, parameter Mem .buffers/cached semuanya digunakan, jadi ia berpendapat bahawa percuma hanya 232.
Untuk aplikasi, ia adalah (-/ buffers/cach).buffers /cached. Sama-sama tersedia, kerana buffer/cached adalah untuk meningkatkan prestasi pelaksanaan program Apabila program menggunakan memori, penimbal/cached akan digunakan dengan cepat.
Jadi, mari kita lihat aplikasinya, terutamanya yang percuma dan digunakan (-/ buffer/cache). Di samping itu, saya akan memberitahu anda beberapa perkara biasa Linux Untuk meningkatkan kecekapan akses cakera dan memori, Linux telah membuat banyak reka bentuk yang rumit. Kaedah cache: Cache Penampan dan Cache Halaman. Yang pertama adalah untuk membaca dan menulis blok cakera, dan yang kedua adalah untuk membaca dan menulis inod fail. Cache ini boleh memendekkan masa panggilan sistem I/O dengan berkesan (seperti baca, tulis, getdents).
Ingat bahawa memori adalah untuk digunakan, bukan untuk membaca Tidak seperti Windows, tidak kira berapa banyak memori fizikal sebenar yang anda ada, ia perlu menggunakan fail swap cakera keras untuk membaca ini mengapa Windows sering menggesa bahawa ruang maya tidak mencukupi Fikirkan, betapa membosankannya menggunakan sebahagian daripada ruang cakera keras sebagai memori apabila masih terdapat sebahagian besar memori. Jadi mari kita lihat Linux, Selagi anda tidak menggunakan ruang swap, anda tidak perlu bimbang tentang mempunyai terlalu sedikit memori Jika anda sering menggunakan banyak swap, anda mungkin perlu mempertimbangkan untuk menambah memori fizikal juga standard untuk Linux untuk melihat sama ada memori itu cukup
-------------------------------. ------------------- --------------------------------- ------------------- -----------------------
Seterusnya
Saya mendapati pelayan hanya mempunyai 1.9G memori dan kemudian gunakan arahan atas. dalam baris pertama adalah: masa semasa sistem telah berjalan; lalu, dan 15 minit yang lalu Apabila nilai ini melebihi bilangan CPU, ia menunjukkan bahawa beban terlalu tinggi
Tugas dalam baris kedua ialah: jumlah bilangan proses yang sedang berjalan; proses; bilangan proses yang dihentikan; bilangan proses yang dipulihkan
Barisan ketiga CPU ialah: us:user Peratusan CPU yang diduduki oleh ruang penggunasy:system Peratusan CPU yang diduduki oleh ruang kernel
ni:niced Peratusan CPU yang diduduki oleh proses yang telah berubah keutamaanPeratusan CPU melahu
wa:IO tunggu Peratusan CPU yang diduduki oleh IO menungguhi: IRQ Perkakasan Peratusan CPU yang diduduki oleh gangguan keras
si:perisian Peratusan CPU yang diduduki oleh gangguan lembut st: Masa yang dicuri oleh hipervisor
Barisan keempat Mem ialah: jumlah memori; memori terpakai;
第五行(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 keping data pengguna biasa disimpan dalam tatasusunan, menyumbang kira-kira 4472.8671875kb
Pembelajaran yang disyorkan: "Tutorial Video PHP"
Atas ialah kandungan terperinci Apa yang perlu dilakukan jika terdapat terlalu banyak proses php. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!