>백엔드 개발 >PHP 문제 >PHP FPM 프로세스 수를 수정하는 방법

PHP FPM 프로세스 수를 수정하는 방법

藏色散人
藏色散人원래의
2021-09-19 11:01:384128검색

php fpm 프로세스 수를 수정하는 방법: 1. php 로그 파일 "/usr/local/php/var/log"를 봅니다. 2. "php-fpm.conf" 파일을 엽니다. 3. "pm"을 추가합니다. .max_spare_servers" 등 php-fpm 프로세스의 최대 수를 설정하는 매개변수입니다.

PHP FPM 프로세스 수를 수정하는 방법

이 문서의 운영 환경: Windows 7 시스템, PHP5.3, Dell G3 컴퓨터.

php fpm 프로세스 수를 수정하는 방법은 무엇입니까?

PHP-FPM 프로세스 수 설정

최근 서버에 이상이 발생하여 홈페이지 접속이 정상적으로 되지 않습니다. 문제 해결 후 php에 문제가 있었습니다.

php-fpm을 다시 시작하면 정상으로 돌아옵니다. 1분 후에 또 오류가 발생했습니다. PHP 로그 파일 /usr/local/php/var/log를 확인하면

WARNING: [pool www] server reached pm.max_children setting (5), consider raising it

하위 프로세스 수가 설정된 최대값에 도달했습니다.라는 메시지가 표시됩니다.

PHP 프로세스 수를 설정합니다. php-fpm.conf 파일에서 수정해야 합니다.

먼저 /usr/local/php/etc/php-fpm.conf 파일의 구성 분석을 살펴보세요.

pid = run/php-fpm.pid
#pid设置,默认在安装目录中的var/run/php-fpm.pid,建议开启
error_log = log/php-fpm.log
#错误日志,默认在安装目录中的var/log/php-fpm.log
log_level = notice
#错误级别. 可用级别为: alert(必须立即处理), error(错误情况), warning(警告情况), notice(一般重要信息), debug(调试信息). 默认: notice.
emergency_restart_threshold = 60
emergency_restart_interval = 60s
#表示在emergency_restart_interval所设值内出现SIGSEGV或者SIGBUS错误的php-cgi进程数如果超过 emergency_restart_threshold个,php-fpm就会优雅重启。这两个选项一般保持默认值。
process_control_timeout = 0
#设置子进程接受主进程复用信号的超时时间. 可用单位: s(秒), m(分), h(小时), 或者 d(天) 默认单位: s(秒). 默认值: 0.
daemonize = yes
#后台执行fpm,默认值为yes,如果为了调试可以改为no。在FPM中,可以使用不同的设置来运行多个进程池。 这些设置可以针对每个进程池单独设置。
listen = 127.0.0.1:9000
#fpm监听端口,即nginx中php处理的地址,一般默认值即可。可用格式为: ‘ip:port’, ‘port’, ‘/path/to/unix/socket’. 每个进程池都需要设置.
listen.backlog = -1
#backlog数,-1表示无限制,由操作系统决定,此行注释掉就行。backlog含义参考:
http://www.3gyou.cc/?p=41
listen.allowed_clients = 127.0.0.1
#允许访问FastCGI进程的IP,设置any为不限制IP,如果要设置其他主机的nginx也能访问这台FPM进程,listen处要设置成本地可被访问的IP。默认值是any。每个地址是用逗号分隔. 如果没有设置或者为空,则允许任何服务器请求连接
listen.owner = www
listen.group = www
listen.mode = 0666
#unix socket设置选项,如果使用tcp方式访问,这里注释即可。
user = www
group = www
#启动进程的帐户和组
pm = dynamic #对于专用服务器,pm可以设置为static。
#如何控制子进程,选项有static和dynamic。如果选择static,则由pm.max_children指定固定的子进程数。如果选择dynamic,则由下开参数决定:
pm.max_children #,子进程最大数
pm.start_servers #,启动时的进程数
pm.min_spare_servers #,保证空闲进程数最小值,如果空闲进程小于此值,则创建新的子进程
pm.max_spare_servers #,保证空闲进程数最大值,如果空闲进程大于此值,此进行清理
pm.max_requests = 1000
#设置每个子进程重生之前服务的请求数. 对于可能存在内存泄漏的第三方模块来说是非常有用的. 如果设置为 ’0′ 则一直接受请求. 等同于 PHP_FCGI_MAX_REQUESTS 环境变量. 默认值: 0.
pm.status_path = /status
#FPM状态页面的网址. 如果没有设置, 则无法访问状态页面. 默认值: none. munin监控会使用到
ping.path = /ping
#FPM监控页面的ping网址. 如果没有设置, 则无法访问ping页面. 该页面用于外部检测FPM是否存活并且可以响应请求. 请注意必须以斜线开头 (/)。
ping.response = pong
#用于定义ping请求的返回相应. 返回为 HTTP 200 的 text/plain 格式文本. 默认值: pong.
request_terminate_timeout = 0
#设置单个请求的超时中止时间. 该选项可能会对php.ini设置中的’max_execution_time’因为某些特殊原因没有中止运行的脚本有用. 设置为 ’0′ 表示 ‘Off’.当经常出现502错误时可以尝试更改此选项。
request_slowlog_timeout = 10s
#当一个请求该设置的超时时间后,就会将对应的PHP调用堆栈信息完整写入到慢日志中. 设置为 ’0′ 表示 ‘Off’
slowlog = log/$pool.log.slow
#慢请求的记录日志,配合request_slowlog_timeout使用
rlimit_files = 1024
#设置文件打开描述符的rlimit限制. 默认值: 系统定义值默认可打开句柄是1024,可使用 ulimit -n查看,ulimit -n 2048修改。
rlimit_core = 0
#设置核心rlimit最大限制值. 可用值: ‘unlimited’ 、0或者正整数. 默认值: 系统定义值.
chroot =
#启动时的Chroot目录. 所定义的目录需要是绝对路径. 如果没有设置, 则chroot不被使用.
chdir =
#设置启动目录,启动时会自动Chdir到该目录. 所定义的目录需要是绝对路径. 默认值: 当前目录,或者/目录(chroot时)
catch_workers_output = yes
#重定向运行过程中的stdout和stderr到主要的错误日志文件中. 如果没有设置, stdout 和 stderr 将会根据FastCGI的规则被重定向到 /dev/null . 默认值: 空.

위 구성 분석에 따라 php-fpm.conf에 다음 구성을 추가합니다. 파일:

pm.max_children = 100
pm.start_servers = 30
pm.min_spare_servers = 20
pm.max_spare_servers = 100
pm.max_requests = 500

1. php-fpm 최적화 매개변수 소개

그들은 pm, pm.max_children, pm.start_servers, pm.min_spare_servers, pm.max_spare_servers입니다.

pm: 사용할 방법을 나타냅니다. 정적 또는 동적 중에서 선택할 수 있습니다.

이전 버전에서는 동적을 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이 정적으로 설정된 경우 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 프로세스 수를 동적으로 조정합니다

2 .특정 서버 구성

우리 서버에서는 어떤 실행 방법이 더 좋나요? 실제로 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 환경만 배포한다면 5~10 사이가 더 적절한 값입니다.

추천 학습: "

PHP 비디오 튜토리얼

"이 서버 구성

1. 기본 서버 정보:

하드 디스크: 데이터 디스크 30G, 시스템 디스크 20G

메모리: 1.5G

CPU: 듀얼 코어

시스템 : CentOS 6.3 64비트

대역폭: 독점 2M

2. 배포된 애플리케이션

Git、SVN、Apache、Tomcat、PHP、Nginx、Mysql、JDK

3 최적화된 매개변수

pm = dynamic
pm.start_servers = 5
pm.min_spare_servers = 2
pm.max_spare_servers = 8
 
pm.max_requests = 500

각 하위 프로세스가 다시 태어나기 전에 제공되는 요청 수를 설정합니다. 메모리 유출된 타사 모듈에 매우 유용합니다. '0'으로 설정하면 요청이 항상 허용됩니다. PHP_FCGI_MAX_REQUESTS 환경 변수와 동일합니다. 기본값: 0.

이 구성은 PHP-CGI 프로세스가 이후에 처리할 때를 의미합니다. 요청 수가 500개에 도달하면 프로세스가 자동으로 다시 시작됩니다.

그런데 프로세스를 다시 시작하는 이유는 무엇인가요?

일반적으로 프로젝트에서는 일부 타사 라이브러리를 어느 정도 사용합니다. 이러한 타사 라이브러리에는 종종 메모리 누수 문제가 있습니다. PHP-CGI 프로세스를 정기적으로 다시 시작하지 않으면 메모리 사용량이 필연적으로 증가합니다. 따라서 PHP-FPM은 PHP-CGI의 관리자로서 메모리 사용량이 증가하지 않도록 일정 횟수 요청한 PHP-CGI 프로세스를 다시 시작하는 모니터링 기능을 제공합니다.

동시성이 높은 사이트에서 502 오류가 자주 발생하는 것은 바로 이 메커니즘 때문입니다. 그 이유는 PHP-FPM이 NGINX에서 오는 요청 대기열을 잘 처리하지 못하기 때문인 것 같습니다. 하지만 저는 아직 PHP 5.3.2를 사용하고 있습니다. PHP 5.3.3에서도 이 문제가 여전히 발생하는지 모르겠습니다.

현재 솔루션은 이 값을 최대한 크게 설정하여 PHP-CGI가 다시 SPAWN하는 횟수를 최대한 줄이는 동시에 전반적인 성능을 향상시키는 것입니다. 자체 실제 제작 환경에서는 메모리 누수가 명확하지 않은 것으로 확인되어 이 값을 매우 크게(204800) 설정했습니다. 모든 사람은 실제 상황에 따라 이 값을 설정해야 하며 맹목적으로 늘릴 수는 없습니다.

위 내용은 PHP FPM 프로세스 수를 수정하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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