내 PHP-FPM 구성에 어떤 문제가 있습니까?


8

64 비트 서버가 있지만 256MB의 RAM 만 있습니다. 그래서 fast-cgi를 사용하여 nginx 서버로 이동하여 PHP에 연결했습니다. PHP 5.3.6을 실행 중입니다.

문제는 PHP 페이지에 액세스하려고 할 때 2 ~ 3 일마다 서버 내부 오류가 발생한다는 것입니다. 유일한 방법은 php-fpm을 수동으로 다시 시작하는 것입니다. 이것은 내가 질식시키는 원인이되는 몇 가지 잘못된 매개 변수를 설정했음을 의미합니다. 아래에는 관련 구성이 나열되어 있습니다.

/etc/php-fpm.conf :-

include=/etc/php-fpm.d/*.conf
log_level = error
;emergency_restart_threshold = 0
;emergency_restart_interval = 0
;process_control_timeout = 0

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

[www]
pm = dynamic
pm.max_children = 10
pm.start_servers = 3
pm.min_spare_servers = 2
pm.max_spare_servers = 5
pm.max_requests = 500

/etc/nginx/php.conf :-

location ~ \.php {
        fastcgi_param  QUERY_STRING       $query_string;
        fastcgi_param  REQUEST_METHOD     $request_method;
        fastcgi_param  CONTENT_TYPE       $content_type;
        fastcgi_param  CONTENT_LENGTH     $content_length;

        fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
        fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
        fastcgi_param  REQUEST_URI        $request_uri;
        fastcgi_param  DOCUMENT_URI       $document_uri;
        fastcgi_param  DOCUMENT_ROOT      $document_root;
        fastcgi_param  SERVER_PROTOCOL    $server_protocol;

        fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
        fastcgi_param  SERVER_SOFTWARE    nginx;

        fastcgi_param  REMOTE_ADDR        $remote_addr;
        fastcgi_param  REMOTE_PORT        $remote_port;
        fastcgi_param  SERVER_ADDR        $server_addr;
        fastcgi_param  SERVER_PORT        $server_port;
        fastcgi_param  SERVER_NAME        $server_name;

        fastcgi_pass unix:---some-location---;
}

업데이트 1

그리고 네 개의 nginx 프로세스가 실행 중입니다. 평균적으로 각 php-fpm 프로세스에는 35MB의 RAM이 필요합니다 (가상 메모리 크기는 각각 320MB). 또한 MySql 프로세스가 실행 중입니다.

업데이트 2

로그를 붙여 넣는 것을 잊었습니다.

PHP-fpm 오류 로그 :-

WARNING: [pool www] seems busy (you may need to increase start_servers, or min/max_spare_servers), spawning 8 children, there are 1 idle, and 7 total children
WARNING: [pool www] server reached max_children setting (10), consider raising it
NOTICE: Terminating ...

php-fpm www.error 로그 :-

PHP Fatal error:  Allowed memory size of 33554432 bytes exhausted (tried to allocate 122880 bytes) in /home/webadmin/blog.applegrew.com/html/wordpress/wp-content/plugins/jetpack/class.jetpack-signature.php on line 137
PHP Fatal error:  Allowed memory size of 33554432 bytes exhausted (tried to allocate 122880 bytes) in /home/webadmin/blog.applegrew.com/html/wordpress/wp-content/plugins/jetpack/class.jetpack-signature.php on line 137
PHP Fatal error:  Allowed memory size of 33554432 bytes exhausted (tried to allocate 122880 bytes) in /home/webadmin/blog.applegrew.com/html/wordpress/wp-content/plugins/jetpack/class.jetpack-signature.php on line 137

답변:


17

권장하지 않는 것은 설정 값을 낮추는 것입니다. 아마도 반으로 줄이십시오.

pm.max_children = 10 35MB / process = 350MB라고 말하면; 256MB 상자에서 많은 스와핑 또는 메모리 부족을 의미합니다.

다른 프로세스의 경우 최소 100MB, 안전을 위해 150MB까지 가져간 다음 max_children을 얻으려면 해당 숫자를 35MB로 나눕니다. 다른 모든 숫자는 줄로 유지하십시오.

pm = dynamic
pm.max_children = 4
pm.start_servers = 1
pm.min_spare_servers = 1
pm.max_spare_servers = 2
pm.max_requests = 500

PHP-FPM을 중지하고 free사용 가능한 메모리에 대한 아이디어를 얻으려면 실행 하십시오-max_children을 얻으려면 35MB로 나눕니다.

MySQL의 메모리 양에 따라 max_children을 3으로 떨어 뜨려야 할 수도 있습니다.

PHP-FPM 프로세스가 많은 메모리를 공유한다는 것을 알았습니다. 실제로 얼마나 많이 사용되는지 결정하기 위해 빠른 실험을하십시오. PHP-FPM을 중지하고를 실행하십시오 free. PHP-FPM을 시작하십시오 (로드 된 페이지에 따라 메모리가 증가하기 때문에 필요한) 몇 가지 공통 페이지를 방문하고 사용 된 총 메모리를 다시 확인하십시오 free-차이를 프로세스 수로 나눕니다. 완벽한 시스템은 아니지만 꽤 정확하다는 것을 알았습니다 (때로는 상단의 데이터 열도 나쁘지 않습니다).


나는 멈추고 free시작한다. 사용 가능한 메모리를 35로 나누면를 얻을 수 있습니다 max_children value. 나는 마지막 파라의 목적을 얻지 못했습니다.
AppleGrew

PHP의 최대 2.3 프로세스 만 지원할 수 있습니다. : P 어쨌든 나는 지금 max_children3에있다
AppleGrew

a) '마지막 파라'의 목적은 PHP 프로세스가 얼마나 소비하는지에 대한보다 정확한 가치를 얻는 것이 었습니다. ps 또는 top의 값이 항상 사용 가능한 메모리 감소와 일치하지는 않습니다. 사용 가능한 메모리를 찾고 몇 개의 PHP 프로세스를 실행 한 다음 사용 가능한 메모리를 다시 측정하면 (프로세스에서 사용하는 메모리를 보는 대신) 각 프로세스에서 사용하는 메모리 양에 대한 '대체'값을 얻을 수 있습니다. b) invarbrass가 제안한 memory_limit 매개 변수도 좋은 제안입니다. c) mysqltuner.pl 스크립트를 살펴보면 DB 구성에 도움이 될 수 있습니다.
cyberx86

@ cyberx86, 어떤 가치 free를 고려합니까? 디스크 캐시에 사용되지만 실제로 앱에는 무료 인 '-/ + buffers / cache'행의 것입니까?
Roman Newaza

@RomanNewaza-예, 응용 프로그램에서 사용 가능한 메모리를 확인하려면 '-/ + buffers / cache'에서 'free'항목을 사용하십시오.
cyberx86

6

php-fpm 설정이 정상인 것 같습니다.

그러나 실행중인 서버는 다소 리소스가 제한적입니다. PHP 프로세스가 사용 가능한 메모리를 소모하고 있다는 것은 로그에서 분명합니다.

cyberx86에서 제공하는 제안에 추가 :

php.ini 파일에서 memory_limit 매개 변수를 편집 해 볼 수 있습니다 ( 여기 참조 ) (잘 모르겠지만)

적은 양의 시스템 메모리가 주어지면 32 비트 OS로 전환하는 것을 진지하게 고려해야한다고 생각합니다. x64 OS를 사용하면 실제로 유익하지 않고 오히려 상처를받습니다.

MySql 데이터베이스에서 InnoDB 스토리지를 사용하지 않는 경우 my.cnf에서 InnoDB를 끄는 것도 고려할 수 있습니다. 그러면 100MB의 RAM이 추가로 절약됩니다.

Lowendbox 에는 적은 메모리 구성을 위해 서버를 최적화하는 방법에 대한 훌륭한 자습서가 있습니다.


글쎄, 내 호스팅 회사와 32 비트 OS를 제공하기 위해 추리하려고 애 쓰고 있었다. 이 회사는 64 비트 만 제공하는 것 같습니다. 32 비트 OS를 제공하는 회사는 하나 뿐이지 만 훨씬 더 비쌉니다.
AppleGrew

3

PHP가 사용하는 메모리를 찾는 매우 편리한 명령 :

ps --no-headers -o "rss,cmd" -C php5-fpm | awk '{ sum+=$1 } END { printf ("%d%s\n", sum/NR/1024,"M") }'

그런 다음 원하는 RAM을 PHP로 나누면 max_children 값이 있습니다!

또한 수동으로 (종료점 php-status를 설정해야 함) 또는 Nagios를 사용하여 모니터링 할 수 있습니다.


awk: fatal: division by zero attempted
samayo

1
php5-fpm 프로세스가 없음을 의미합니다. .... "php5-fpm"프로세스 이름을 자신의 이름에 맞게 변경해야합니다.
Thomas Decaux

이 명령을 사용 ps --no-headers -o "rss,cmd" | grep php5-fpm | awk '{ sum+=$1 } END { printf ("%d%s\n", sum/NR/1024,"M") }'했는데 어떻게 든 -C 옵션이 작동하지 않습니다.
dieend

명령을 따로 실행 해보십시오 (ps --no-headers -o "rss, cmd"를 먼저 의미합니다 ...) 이것은 디버그하기 쉬워야합니다
Thomas Decaux
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.