>  기사  >  백엔드 개발  >  Nginx에서 사용하는 php-fpm 프로세스 관리 방법 및 최적화

Nginx에서 사용하는 php-fpm 프로세스 관리 방법 및 최적화

coldplay.xixi
coldplay.xixi앞으로
2020-08-08 16:51:432285검색

Nginx에서 사용하는 php-fpm 프로세스 관리 방법 및 최적화

PS: 얼마 전 php-fpm을 구성할 때 우연히 두 가지 프로세스 관리 방법이 있다는 것을 발견했습니다. Apache와 마찬가지로 프로세스 수도 설정에 따라 동적 프로세스와 정적 프로세스로 나눌 수 있습니다.

php-fpm에는 현재 php-5.2.x 버전과 php-5.3.x 버전에 해당하는 두 개의 주요 분기가 있습니다. 5.2.x 버전에서는 php-fpm.conf가 xml 형식을 사용하지만 새로운 5.3.x 버전에서는 php.ini와 동일한 구성 스타일을 갖습니다.
버전 5.2.x에서 php-fpm.conf는 프로세스 관리에 대해 두 가지 스타일이 있다고 주장합니다. 하나는 정적 스타일이고 다른 하나는 아파치 스타일(아파치와 유사)입니다. php-fpm.conf中对于进程管理号称是有两种风格,一种是静态(static)的,一种是类似于apache风格(apache-like)的。

相关学习推荐:php编程(视频)

代码如下:

Process manager settings
<value name=”pm”>
Sets style of controling worker process count.
Valid values are &#39;static&#39; and ‘apache-like&#39;
<value name=”style”>static</value>

按照文档的说明,如果pm的style采用apache-like,启动的进程数应该是和StartServers指定的一样。不过经过数次的尝试,会发现,实际上在这里将pm的style配置成apache-like没有起任何作用。也就是说,这里的apache-like并没有被实现。
不过,在最新的5.3.x的配套php-fpm中,apache风格的进程管理已经被实现了。

代码如下:

; Choose how the process manager will control the number of child processes.
; Possible Values:
; static - a fixed number (pm.max_children) of child processes;
; dynamic - the number of child processes are set dynamically based on the
; following directives:
; pm.max_children - the maximum number of children that can
; be alive at the same time.
; pm.start_servers - the number of children created on startup.
; pm.min_spare_servers - the minimum number of children in &#39;idle&#39;
; state (waiting to process). If the number
; of &#39;idle&#39; processes is less than this
; number then some children will be created.
; pm.max_spare_servers - the maximum number of children in &#39;idle&#39;
; state (waiting to process). If the number
; of &#39;idle&#39; processes is greater than this
; number then some children will be killed.
; Note: This value is mandatory.
;pm = dynamic
pm = static

由上面一段文字可知,对于进程的管理存在两种风格——static和dynamic。和之前的版本的进程管理其实还是一样的,只是将apache-like改成了dynamic,这样更容易理解。

如果设置成static,php-fpm进程数自始至终都是pm.max_children指定的数量,不再增加或减少。
如果设置成dynamic,则php-fpm进程数是动态的,最开始是pm.start_servers指定的数量,如果请求较多,则会自动增加,保证空闲的进程数不小于pm.min_spare_servers,如果进程数较多,也会进行相应清理,保证多余的进程数不多于pm.max_spare_servers。

这两种不同的进程管理方式,可以根据服务器的实际需求来进行调整。

这里先说一下涉及到这个的几个参数,他们分别是pmpm.max_childrenpm.start_serverspm.min_spare_serverspm.max_spare_servers
pm表示使用那种方式,有两个值可以选择,就是static(静态)或者dynamic(动态)。在更老一些的版本中,dynamic被称作apache-like。这个要注意看配置文件的说明。

下面4个参数的意思分别为:

代码如下:

pm.max_children:静态方式下开启的php-fpm进程数量。
pm.start_servers:动态方式下的起始php-fpm进程数量。
pm.min_spare_servers:动态方式下的最小php-fpm进程数量。
pm.max_spare_servers:动态方式下的最大php-fpm进程数量。

如果dm设置为static,那么其实只有pm.max_children这个参数生效。系统会开启设置数量的php-fpm进程。
如果dm设置为dynamic,那么pm.max_children参数失效,后面3个参数生效。系统会在php-fpm运行开始的时候启动pm.start_servers个php-fpm进程,然后根据系统的需求动态在pm.min_spare_servers和pm.max_spare_servers之间调整php-fpm进程数。

那么,对于我们的服务器,选择哪种执行方式比较好呢?事实上,跟Apache一样,运行的PHP程序在执行完成后,或多或少会有内存泄露的问题。这也是为什么开始的时候一个php-fpm进程只占用3M左右内存,运行一段时间后就会上升到20-30M的原因了。
对于内存大的服务器(比如8G以上)来说,指定静态的max_children实际上更为妥当,因为这样不需要进行额外的进程数目控制,会提高效率。因为频繁开关php-fpm进程也会有时滞,所以内存够大的情况下开静态效果会更好。

数量也可以根据 内存/30M 得到,比如8GB内存可以设置为100,那么php-fpm耗费的内存就能控制在 2G-3G的样子。如果内存稍微小点,比如1G,那么指定静态的进程数量更加有利于服务器的稳定。这样可以保证php-fpm只获取够用的内存,将不多的内存分配给其他应用去使用,会使系统的运行更加畅通。

对于小内存的服务器来说,比如256M内存的VPS,即使按照一个20M的内存量来算,10个php-cgi进程就将耗掉200M内存,那系统的崩溃就应该很正常了。因此应该尽量地控制php-fpm进程的数量,大体明确其他应用占用的内存后,给它指定一个静态的小数量,会让系统更加平稳一些。

或者使用动态方式,因为动态方式会结束掉多余的进程,可以回收释放一些内存,所以推荐在内存较少的服务器或VPS上使用。具体最大数量根据 内存/20M 得到。比如说512M的VPS,建议pm.max_spare_servers设置为20。至于pm.min_spare_servers

관련 학습 권장사항: php 프로그래밍

(동영상)

코드는 다음과 같습니다. 🎜 🎜rrreee🎜문서에 따르면 pm 스타일이 apache-like를 채택하는 경우 시작된 프로세스 수는 StartServers에 지정된 것과 동일해야 합니다. 그러나 여러 번 시도한 후에 실제로 PM의 스타일을 아파치와 유사한 방식으로 구성해도 아무런 효과가 없다는 것을 알게 될 것입니다. 즉, 여기서는 아파치와 같은 기능이 구현되지 않았습니다. 🎜그러나 php-fpm을 지원하는 최신 5.3.x에서는 Apache 스타일의 프로세스 관리가 구현되었습니다. 🎜🎜코드는 다음과 같습니다.🎜🎜rrreee🎜위 단락에서 볼 수 있듯이 프로세스 관리에는 정적 및 동적의 두 가지 스타일이 있습니다. 프로세스 관리는 Apache와 유사한 방식이 동적으로 변경되어 이해하기 쉽다는 점을 제외하면 실제로 이전 버전과 동일합니다. 🎜🎜정적으로 설정하면 php-fpm 프로세스 수는 항상 pm.max_children에 지정된 수이며 증가하거나 감소하지 않습니다. 🎜동적으로 설정하면 php-fpm 프로세스 수는 pm.start_servers에 지정된 수로 시작됩니다. 요청이 더 많으면 유휴 프로세스 수가 pm.min_spare_servers, 프로세스가 많은 경우 중복 프로세스 수가 pm.max_spare_servers를 넘지 않도록 적절하게 정리됩니다. 🎜🎜이 두 가지 프로세스 관리 방법은 서버의 실제 요구에 따라 조정될 수 있습니다. 🎜🎜이와 관련된 매개변수는 다음과 같습니다: pm, pm.max_children, pm.start_servers, pm.min_spare_serverspm.max_spare_servers. 🎜pm은 사용 방법을 의미하며 정적 또는 동적 중에서 선택할 수 있는 두 가지 값이 있습니다. 이전 버전에서는 동적을 apache와 유사한이라고 불렀습니다. 이에 대한 구성 파일 설명을 주의 깊게 살펴보시기 바랍니다. 🎜🎜다음 네 가지 매개변수의 의미는 다음과 같습니다.🎜🎜코드는 다음과 같습니다.🎜🎜rrreee🎜dm이 static으로 설정된 경우 pm.max_children만 매개변수가 적용됩니다. 시스템은 설정된 수의 php-fpm 프로세스를 시작합니다. 🎜dm이 동적으로 설정된 경우 pm.max_children 매개변수는 유효하지 않으며 다음 세 매개변수가 적용됩니다. php-fpm이 실행되기 시작하면 시스템은 pm.start_servers php-fpm 프로세스를 시작한 다음 필요에 따라 pm.min_spare_servers와 pm.max_spare_servers 사이의 php-fpm 프로세스 수를 동적으로 조정합니다. 체계. 🎜🎜그렇다면 우리 서버에는 어떤 실행 방식이 더 좋은가요? 실제로 Apache와 마찬가지로 실행 중인 PHP 프로그램도 실행 후 메모리 누수가 발생합니다. 이는 php-fpm 프로세스가 처음에는 약 3M의 메모리만 차지하며 일정 기간 실행된 후에는 20-30M로 증가하는 이유이기도 합니다. 🎜대용량 메모리(예: 8G 이상)가 있는 서버의 경우 실제로는 정적 max_children을 지정하는 것이 더 적절합니다. 이렇게 하면 추가 프로세스 번호 제어가 필요하지 않고 효율성이 향상되기 때문입니다. php-fpm 프로세스를 자주 전환하면 지연이 발생하므로 메모리가 충분히 크면 정적 효과가 더 좋습니다. 🎜🎜메모리/30M 기준으로 수량을 구할 수도 있습니다. 예를 들어 8GB 메모리를 100으로 설정하면 php-fpm에서 소비하는 메모리를 2G-3G로 제어할 수 있습니다. 메모리가 1G와 같이 약간 더 작은 경우에는 프로세스 수를 고정적으로 지정하는 것이 서버 안정성에 더 도움이 됩니다. 이렇게 하면 php-fpm이 충분한 메모리만 확보하고 다른 응용 프로그램에 사용할 수 있도록 소량의 메모리를 할당하여 시스템이 보다 원활하게 실행되도록 할 수 있습니다. 🎜🎜256M 메모리를 갖춘 VPS와 같이 메모리가 작은 서버의 경우 20M 메모리를 기준으로 계산하더라도 10개의 php-cgi 프로세스가 200M의 메모리를 소비하므로 시스템 충돌은 정상입니다. 따라서 php-fpm 프로세스 수를 최대한 조절하도록 노력해야 하며, 다른 응용 프로그램이 차지하는 메모리를 대략적으로 파악한 후 고정적으로 작은 숫자를 할당하면 시스템이 더 안정적으로 됩니다. 🎜🎜또는 동적 방법을 사용하세요. 동적 방법은 중복된 프로세스를 종료하고 일부 메모리를 재활용하고 해제할 수 있으므로 메모리가 적은 서버나 VPS에서 사용하는 것이 좋습니다. 구체적인 최대량은 메모리/20M 기준으로 구해집니다. 예를 들어 512M VPS의 경우 pm.max_spare_servers를 20으로 설정하는 것이 좋습니다. pm.min_spare_servers는 서버의 부하에 따라 5~10 사이로 설정하는 것이 더 적합합니다. 🎜🎜🎜관련 추천: 🎜프로그래밍 비디오 강좌🎜🎜🎜

위 내용은 Nginx에서 사용하는 php-fpm 프로세스 관리 방법 및 최적화의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 jb51.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제