> 백엔드 개발 > PHP 문제 > PHP 프로세스가 너무 많으면 어떻게 해야 할까요?

PHP 프로세스가 너무 많으면 어떻게 해야 할까요?

藏色散人
풀어 주다: 2023-03-13 21:00:02
원래의
3668명이 탐색했습니다.

너무 많은 PHP 프로세스에 대한 해결 방법: 1. "ps -ef | wc -l" 명령을 사용하여 현재 시스템의 프로세스를 확인합니다. 2. 그런 다음 관련 명령을 사용하여 가장 많은 양의 메모리를 차지하는 프로세스를 확인합니다. 3. php-fpm 프로세스를 쿼리합니다. 4. 프로세스를 종료하거나 메모리 크기를 제한합니다.

PHP 프로세스가 너무 많으면 어떻게 해야 할까요?

이 글의 운영 환경: linux5.9.8 시스템, PHP5.5 버전, DELL G3 컴퓨터

php 프로세스가 너무 많으면 어떻게 해야 하나요?

Linux 서버에 너무 많은 php-fpm 프로세스로 인해 메모리가 가득 찼습니다.

오늘 아침에 출근했는데 mysql 서버가 중지되었다가 다시 시작되었습니다.

쿼리 로그에 메모리가 Linux 서버에서 mysql 서비스가 종료되었습니다. 메모리가 가득 차면 서버가 정지되는 것을 방지하기 위해 프로세스가 자동으로 정리됩니다. 선택하면 가장 많은 메모리를 차지하는 사람이 먼저 종료됩니다. 내 서버가 가장 큰 메모리를 차지하므로 mysql을 종료하겠습니다

그런 다음 mysql을 다시 시작하여 메모리를 쿼리합니다

Linux의 메모리를 확인하는 방법에 대해 이야기해 보겠습니다

예를 들어

아래와 같이 무료 쇼가 표시됩니다. 현재 메모리 사용량, 그리고 -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 line:

total 内存总数: 1002M
used 已经使用的内存数: 769M
free 空闲的内存数: 232M
shared 当前已经废弃不用,总是0
buffers Buffer 缓存内存数: 62M
cached Page 缓存内存数:421M
로그인 후 복사

Relationship: total(1002M) = Used(769M) ) + free(232M)

두 번째 부분(-/+ 버퍼/캐시) :

(-buffers/cache) used内存数:286M (指的第一部分Mem行中的used - buffers - cached)
(+buffers/cache) free内存数: 715M (指的第一部分Mem行中的free + buffers + cached)
로그인 후 복사

-buffers/cache는 프로그램이 실제로 먹은 메모리를 반영하는 반면 +buffers/cache는 알 수 있습니다. 할당할 수 있는 총 메모리 양을 반영합니다.

세 번째 부분은 스왑 파티션에 관한 내용인데, 설명하지 않아도 다들 이해하실 것 같아요.

위의 첫 번째 부분(Mem)과 두 번째 부분(-/)을 읽어도 여전히 헷갈리는 것 같아요. + 버퍼/ 캐시) 결과가 왜 이렇게 이상한가요?

사실 두 가지 측면에서 설명할 수 있습니다.

운영 체제에서는 버퍼/캐시가 모두 사용됩니다. , 따라서 무료로 간주됩니다. 232.

애플리케이션의 경우 (-/+ 버퍼/캐시). 버퍼/캐시가 동일하게 사용 가능합니다. 버퍼/캐시가 프로그램 실행 성능을 향상시키기 때문입니다. 캐시된 내용은 빠르게 사용됩니다.

그래서, 애플리케이션을 보면 free와 Used of (-/+ buffers/cache)가 주요이므로 이것만 좀 더 개선해 보도록 하겠습니다. 디스크 및 메모리 액세스, Linux 효율성을 위해 Linux는 캐싱 dentry(파일 경로 이름을 inode로 변환하는 속도를 높이기 위해 VFS에서 사용됨) 외에도 두 가지 주요 캐시 방법, 즉 버퍼 캐시 및 메모리 액세스를 채택했습니다. 페이지 캐시. 전자는 디스크 블록을 읽고 쓰기 위한 것이고, 후자는 파일 inode를 읽고 쓰기 위한 것입니다. 이러한 캐시는 I/O 시스템 호출(예: 읽기, 쓰기, getdents) 시간을 효과적으로 단축할 수 있습니다.

메모리는 보기 위한 것이 아니라 사용하기 위한 것임을 기억하세요. Windows와 달리 실제 물리적 메모리가 아무리 많아도 읽을 파일을 교환하려면 하드 디스크를 사용해야 합니다. 이것이 Windows에서 종종 가상 메시지를 표시하는 이유입니다. 공간이 부족하기 때문에 메모리가 아직 남아 있는데 하드 디스크 공간의 일부를 메모리로 사용하는 것이 얼마나 지루한지 생각해보세요. 그러면 하드 디스크가 메모리보다 빠를 수 있습니까? 스왑 공간을 사용하지 않는 한 메모리가 너무 적다고 걱정하지 마십시오. 스왑을 자주 사용하는 경우 물리적 메모리 추가를 고려해야 할 수도 있습니다. 메모리는 충분합니다

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

다음 단계

서버의 메모리가 1.9G에 불과한 것을 발견한 후 top 명령을 사용합니다. 확인해 보세요

현재 시간, 시스템 실행 일수, 다음 세 값은 1분 전의 평균 프로세스 수입니다. 5분 전, 15분 전 이 값이 CPU 수를 초과하면 부하가 너무 높다는 의미입니다.

두 번째 줄의 작업은 실행 중인 프로세스 수입니다. 중지된 프로세스 수, 복원된 프로세스 수 CPU의 세 번째 줄은 다음과 같습니다.

us: 사용자 사용자 공간이 CPU를 차지함

sy:system 커널 공간이 차지하는 CPU 비율

ni:niced 우선순위가 변경된 프로세스가 차지하는 CPU 비율
유휴 CPU 비율
wa:IO wait IO 대기가 차지하는 CPU 비율
hi:Hardware IRQ 하드 인터럽트가 차지하는 CPU 비율
si:software 소프트웨어 인터럽트 비율 CPU 점유 비율
st: 하이퍼바이저가 훔친 시간

네 번째 줄 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으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿