>백엔드 개발 >PHP 튜토리얼 >Linux_php 예제에서 너무 많은 php-fpm 프로세스로 인해 발생하는 메모리 고갈 문제 해결

Linux_php 예제에서 너무 많은 php-fpm 프로세스로 인해 발생하는 메모리 고갈 문제 해결

韦小宝
韦小宝원래의
2017-12-04 13:10:021923검색

이 글에서는 Linux에서 너무 많은 php-fpm 프로세스로 인해 발생하는 메모리 고갈 문제를 해결하는 방법을 주로 소개합니다. php-fpm에 대해 더 알고 싶다면 이 글을 참조하여 해결 방법을 알아보세요. php-fpm프로세스 오버플로 문제 메모리 소모에는 여러 가지 이유가 있습니다.

최근에 내 개인 블로그의 Linux 서버와 데이터베이스 서비스가 종종 중단되어 정상적으로 액세스하기 전에 다시 시작해야 하는 것을 발견했습니다. 매우 역겨워서 문제 해결을 시작하고 시간과 에너지를 확보하기로 결정했습니다. 문제가 자주 발생하고 수동으로 다시 시작하는 것은 힘들고 시간이 많이 소요되는 것을 원하지 않습니다.

문제 분석

문제 발견 후 먼저 free -m 명령을 사용하여 현재 서버 실행 상태를 확인하세요. free -m 指令查看当前服务器执行状况:

可以看到我的服务器内存是2G的,但是目前可用内存只剩下70M,内存使用率高达92%,很有可能是内存使用率过高导致数据库服务挂断。

继续看详细情况,使用 top 指令:

然后再看指令输出结果中详细列出的进程情况,重点关注第10列内存使用占比:

发现CPU使用率不算高,也排除了CPU的问题,另外可以看到数据库服务占用15.2%的内存,内存使用过高时将会挤掉数据库进程(占用内存最高的进程),导致服务挂断,所以我们需要查看详细内存使用情况,是哪些进程耗费了这么多的内存呢?

使用指令:


ps auxw|head -1;ps auxw|sort -rn -k4|head -40


查看消耗内存最多的前40个进程:

查看第四列内存使用占比,发现除了mysql数据库服务之外,php-fpm服务池开启了太多子进程,占用超过大半内存,问题找到了,我们开始解决问题:设置控制php-fpm进程池进程数量。

解决问题

通过各种搜索手段,发现可以通过配置 pm.max_children 属性,控制php-fpm子进程数量,首先,打开php-fpm配置文件,执行指令:


vi /etc/php-fpm.d/www.conf


找到 pm.max_children 字段,发现其值过大:

如图, pm.max_children 值为50,每一个进程占用1%-2.5%的内存,加起来就耗费大半内存了,所以我们需要将其值调小,博主这里将其设置为25,同时,检查以下两个属性:

pm.max_spare_servers : 该值表示保证空闲进程数最大值,如果空闲进程大于此值,此进行清理 pm.min_spare_servers : 保证空闲进程数最小值,如果空闲进程小于此值,则创建新的子进程;

这两个值均不能不能大于 pm.max_children 值,通常设置 pm.max_spare_servers 值为 pm.max_children

내 서버 메모리는 2G인데 현재 사용 가능한 메모리가 70M밖에 남지 않은 것을 볼 수 있는데, 그리고 메모리 사용량이 92%까지 높으니, 높은 메모리 사용량으로 인해 데이터베이스 서비스가 중단될 가능성이 매우 높습니다.


계속해서 세부정보를 보려면 top 명령을 사용하세요.


그런 다음 명령 출력에 나열된 프로세스 세부 정보를 살펴보고 열 10의 메모리 사용량 비율에 중점을 둡니다.

CPU 사용량이 높지 않은 것으로 확인되어 CPU 문제는 배제됩니다. 또한 데이터베이스 서비스는 15.2%의 메모리를 차지하는 것으로 나타났는데, 메모리 사용량이 너무 높을 경우 데이터베이스 프로세스(가장 많은 메모리를 차지하는 프로세스)가 밀려 서비스가 중단될 수 있으므로 자세한 내용을 확인해야 합니다. 메모리 사용량 어떤 프로세스가 그렇게 많은 메모리를 소비합니까?

사용 명령:

systemctl restart php-fpm

가장 많은 메모리를 소비하는 상위 40개 프로세스 보기:


네 번째 열의 메모리 사용량 비율을 보고 Mysql 데이터베이스 서비스에서 php-fpm 서비스 풀은 너무 많은 하위 프로세스를 열어 메모리의 절반 이상을 차지했습니다. 문제가 발견되었고 우리는 문제를 해결하기 시작했습니다. php-fpm 프로세스 풀 프로세스 수를 제어합니다.


문제 해결


다양한 검색을 통해 찾아보실 수 있습니다 pm.max_children 속성을 구성하여 PHP를 제어할 수 있습니다. -fpm 하위 프로세스 수량, 먼저 php-fpm구성 파일을 열고 다음 명령을 실행합니다.


 ps -fe |grep "php-fpm"|grep "pool"|wc -l

pm.max_children 필드를 찾아 해당 값이 너무 큰 것을 발견했습니다:

그림과 같이 pm.max_children 값은 50입니다. 각 프로세스는 1%~2.5를 차지합니다. 메모리의 절반 이상을 추가하는 %이므로 해당 값을 줄여야 합니다. 여기서 블로거는 이를 25로 설정합니다. 동시에 다음 두 가지 속성을 확인합니다.

pm .max_spare_servers: 이 값은 보장된 유휴 프로세스의 최대 수를 나타냅니다. 유휴 프로세스가 이 값보다 크면 정리합니다. pm.min_spare_servers: 유휴 프로세스의 최소 수를 보장합니다. 유휴 프로세스가 이 값보다 작으면 새 하위 프로세스를 만듭니다. 🎜🎜이 두 값 중 어느 것도 사용할 수 없습니다. 일반적으로 pm.max_children 값보다 클 수 없습니다. pm.max_spare_servers 값은 pm.max_children 값의 60%-80%로 설정됩니다. 🎜🎜마지막으로 php-fpm을 다시 시작합니다🎜🎜🎜🎜
 netstat -anp|grep "php-fpm"|grep "tcp"|grep "pool"|wc -l
🎜🎜🎜🎜메모리 사용량을 다시 확인하니 메모리 사용량이 많이 줄었습니다.🎜🎜🎜🎜🎜메모리 사용량을 여러번 관찰한 결과 이렇습니다. 개선을 통해 서버 메모리 리소스 소비가 크게 완화됩니다. 🎜🎜🎜🎜ps: php-fpm에 의해 시작된 프로세스 수와 각 프로세스의 메모리 제한을 확인하세요🎜🎜🎜🎜1. 명령을 사용하여 서버에서 열리는 php-cgi 프로세스 수를 확인하세요🎜🎜🎜🎜rrreee. 🎜🎜🎜🎜 2. tcp 요청을 처리하는 데 사용되는 php-cgi 프로세스 수를 확인하세요🎜🎜🎜🎜🎜rrreee🎜🎜🎜🎜3 linux+nginx+php 환경에서 각 php-fpm 프로세스의 메모리 제한을 설정합니다. 🎜🎜🎜🎜 방법: 🎜🎜🎜🎜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 서비스를 로드해야 합니다.

요약

위 내용은 Linux에서 너무 많은 php-fpm 프로세스로 인해 발생하는 메모리 소모 문제를 해결하기 위해 편집자가 소개한 내용입니다. 모든 분들께 도움이 되기를 바랍니다.

관련 권장 사항:

php-fpm에서 상태 통계를 켜는 방법

php-fpm이 설명하는 샘플 코드 공유

PHP-FPM 메모리 사용량을 줄이는 솔루션 소개

위 내용은 Linux_php 예제에서 너무 많은 php-fpm 프로세스로 인해 발생하는 메모리 고갈 문제 해결의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.