Nginx + php-fpm-각 php-fpm 프로세스 실행시 70-100 % CPU


8

다음과 같은 상황이 발생했습니다.

  • 우리는 nginx + php-fpm을 사용하여 8 코어, 8GB 램, 2.6GHz의 linode에 있습니다. 우리는 CPU 사용량에 대한 그래프를 매우 많이 얻고 있습니다 (우리는 그렇게 나쁜 VPS 이웃이되고 싶지 않습니다) ...

  • 한 번에 사이트에 약 100 명 미만의 사용자가 있습니다. 따라서 이러한 상황은 매우 당황 스럽습니다. CPU 사용량이 매우 높다는 것입니다.

  • 우리는 캐싱에 대한 문서가 많이 있습니다 (플러그인뿐만 아니라 워드 프레스 또는 드루팔과 같은 잘 알려져 있고 잘 문서화되어 있으며 잘 만들어진 다른 프레임 워크 대신 잘 알려지지 않았을 수도 있고 CPU를 많이 사용하는 PHP 방식의 의심스럽고 끔찍한 프레임 워크를 사용하고 있습니다. nginx + php_fpm 플랫폼에서 php를 캐싱 처리합니다.

  • 따라서 우리는 약 6 개의 오픈 php-fpm 프로세스를 가지고 있는데, RUNNING 할 때 개별적으로 대량 (30 +, 종종 99 % 정도)의 CPU를 소비합니다. 그리고 나는 너무 많은 CPU를 사용하지 못하게하는 방법을 조금도 생각하지 않았습니다. . 나는 항상 어떤 일이 일어나고 있기 때문에 어떤 스파이크가 이러한 스파이크를 일으키는 지 알 수 없습니다 ... 일반적으로 1 또는 2 만 실행 중입니다.

  • 내 pool.d / www.conf 파일의 설정은 다음과 같습니다.

    pm = dynamic
    pm.max_children = 10
    pm.start_servers = 4
    pm.min_spare_servers = 2
    pm.max_spare_servers = 6
    
  • 우리는 이것을 해석하는 방식으로 메모리가 실제로 놀랍고 (472 / 7000 + mb 사용, 스왑 없음 등을 표시하지 않음) 더 많은 프로세스를 처리하고 줄을 세분화 할 수 있기 때문에이 설정을 수행했습니다. 처리됨-그러나 불행히도 각 프로세스가 실행될 때 CPU에서 너무 강렬하므로 지붕을 통해 CPU를 구동하므로 충분한 프로세스를 처리 할 수 ​​없습니다.

  • 문제 -php-fpm에 대한 해당 풀 conf 파일의 설정을 증가시킬 수 있도록 프로세스 php-fpm CPU 사용량줄이기 위해 지구상에서 무엇 을 할 수 있습니까 ? 그리고 /var/log/php5-fpm.log 자녀를 늘리고 최소 / 최대 / 시작 서버를 조정 / 증가 시키려고 소리를 지르고 있습니다. 그러나 그렇게하면 앞에서 언급 한 것처럼 우리의 평균 부하가 미치게됩니다. 캐시를 사용하지 않고 어떻게 할 수 있습니까? 아니면 옵션은 무엇입니까?

  • 내 생각? 프로세스가 할당 된 양보다 많은 CPU를 사용하지 않도록 cpulimit 사용에 대한 내용을 읽었지만 그 속도가 느려서 사용할 수 없게됩니까? 또는 그 과정에서 몇 가지 이상의 프로세스를 실행할 수있는 능력을 향상시킬 수 있습니다. 또한 두 개의 풀을 실행하는 것도 생각했습니다. 하나는 전방 웹 사이트 (고객이 경험하는 것)와 다른 하나는 백엔드 (시간이되면 전방 사이트에 영향을 미침)를위한 것입니다. 소비 보고서가 실행되고 있습니다).

  • 나는이 주제에 대해 연구, 인터넷 검색 등을 며칠 동안 보냈습니다. 모든 사람의 상황이 자신의 시스템에 매우 독특하기 때문에 어렵습니다. 문제는 특정 전례가 없거나 잘못 작성된 프레임 워크에 있습니다. 해결책을 찾기가 어렵습니다. 우리는이 프레임 워크를 아직 긁을 수는 없습니다. 나는 일종의 해결책을 찾아야합니다.


업데이트 : PHP 세션을 저장하기 위해 memcache를 구현했습니다. 프레임 워크는 사용자 세션에 크게 의존하고 시스템의 특성은 직원이 한 번에 여러 탭을 자주 사용하기 때문에 각 세션을 다시 확인하여 능력 / 사용자 데이터 등을 확인합니다. ... 그래서 나는 이것에서 약간의 성능 향상을 기대하고 있습니다-원한다면 의견에 오신 것을 환영합니다-우리가 더 많은 양의 피크 시간을 겪을 때 내일 어떻게 진행되는지 볼 것입니다.


Nginx는 CPU 집약적 웹 응용 프로그램에는 그리 좋지 않지만 높은 CPU는 나쁘고 정말 나쁩니다. 우리는 그것을 고치기 위해 노력하고 있습니다. 적절한 수의 클라이언트를 지원할 수 있어야하기 때문에 최대 클라이언트 설정이 충분하지 않지만 프로세스 당 CPU 사용량이 높으면 해당 기능이 왜곡됩니다. 우리는 높은 CPU 사용량으로 조금 더 잘하기 때문에 아파치로 전환했지만 궁극적 으로이 문제는 웹 응용 프로그램 문제를 더 많이 나타내며 해결하는 데 시간이 걸리지 만 현재는 문제를 해결하는 데 시간이 없습니다.
amurrell

당신이 의사에게 갈 때, 그는 당신에게 특정 약을 복용하라고 말합니다-그는 당신이 "음료수를 마시지 말고 패스트 푸드를 먹지 마라"라는 말을 듣지 않을 것을 알고 있기 때문에-이것은 나에게 큰 대답이 없었던 이유입니다-진실은 설정이나 빠른 수정이 실제로 적용되지 않습니다. 웹 앱 자체를 대폭 변경해야한다는 슬픈 사실 만 있습니다.
amurrell

운 좋게도 대중적인 프레임 워크에서이 문제가 발생하면 캐싱과 그에 대한 풍부한 문서를 활용할 수있는 옵션이있을 수 있습니다. 그러나 프레임 워크 자체를 제외하고는 변경할 수없는 불분명 한 임의 항목이 있습니다. 예이!
amurrell

1
그래서 내가 이해 한 바에 따르면, opcache는 PHP 코드를 바이너리로 저장하고 php-fpm에 의해 훨씬 빠르게 소비 될 수 있지만 (캐싱) 객체 캐싱도 활용해야합니다. 예를 들어 전체 페이지 출력을 "객체로 저장하는 것" "memcached와 같은 방식으로. 이것은 실제로 페이지 출력 (또는 PHP 세션과 같은 다른 것들)을 캐시 할 것입니다 ... 다음으로 리버스 프록시 인 니스를 사용할 수도 있습니다. 그러나 기본적으로 요청과 서버 사이의 중간 사람이므로 서버가 요청에 직접 맞지 않고 메모리에서 작동하여 캐시 된 URL을 제공합니다.
amurrell

1
바니시는 서버에서 가져온 것의 캐시 된 사본을 메모리에 저장하므로 바니시는 훌륭합니다. 현재 고용주는 nginx에 있으며 varnish와 memcached를 사용합니다. 다행히 현재 우리가 사용하고있는 프레임 워크에는 페이지 캐시 (출력 된 페이지 데이터)를 결정하는 자체 캐싱 메커니즘이 있습니다. 마지막 직장에서 나는 프레임 워크에 직접 써야했다. 재미 있지 않았지만 효과가 있었다. 아파치-당신이 nginx를 고칠 시간이 없다면 나는 다시 돌아 가지 않을 것이다. 캐싱 메커니즘을 작성하는 동안 프로젝트를 완전히 중단시키지 않는 유일한 솔루션.
amurrell

답변:


6

고려해야 할 몇 가지 사항 (이미 고려한 경우 사전에 사과) : 우선, nginx 구성을 최적화하고 꼭 필요한 경우에만 php-fpm을 호출하십시오. 마지막으로 PHP가 정적 HTML 페이지 (행복하게 할 것)와 같은 것을 처리하게하십시오.

둘째, php-fpm을 사용하고 있기 때문에 php-fpm의 자녀가 얼마나 오래 살 수 있는지에 대해 더 적극적으로 제안합니다. 수명이 짧은 실 / 아이들과 안정성 사이에 적절한 지점을 찾아야합니다. php-fpm 기본값은 모든 생산 시스템, IMHO에 너무 관대합니다. 작업자가 요청을 더 오래 처리할수록 더 불안정합니다. 또한 메모리 누수 위험이 높으며,이 프레임 워크에서 무한 루프와 같은 버그가 발생하여 CPU 부하로 인해 슬픔을 겪을 수 있습니다.

pm.max_requests프로덕션 풀 의 수를 줄 였습니다. 나는 기본값이 200이라고 생각한다. 나는 50부터 시작하여 그것이 어디로 가는지 보겠다.

이것에 실패하거나 보완 적 인 경우 다음과 같은 전역 옵션을 시도 할 수도 있습니다 (AFAIK는 기본적으로 모두 비활성화되어 있습니다).

emergency_restart_threshold 3
emergency_restart_interval 1m
process_control_timeout 5s

이것은 무엇을 의미 하는가? 1 분 내에 3 개의 PHP-FPM 자식 프로세스가 SIGSEGV 또는 SIGBUS (예 : 크래시)로 종료되면 PHP-FPM이 자동으로 다시 시작됩니다. 자식 프로세스는 마스터의 신호에 대한 반응을 5 초 동안 기다립니다.

여기에 언급 한 모든 구성 옵션과 다른 구성 옵션에 대한 좋은 개요가 있습니다 : http://myjeeva.com/php-fpm-configuration-101.html

이 팁이 도움이 되길 바랍니다. 불행히도이 모든 것에 대한 경험의 규칙은없는 것처럼 보이지만, PHP의 행동과 안정성에 영향을 미치는 변수가 너무 많습니다.

마지막으로, 귀하가 문의 한 CPU 제한 기능은 여기 에 문서화 되어 있지만 다른 모든 옵션을 소진 한 경우에만 사용합니다. 이 경로를 선택하면 PHP-FPM 조정과 limits.conf 구성 사이의 가능한 상호 작용에 유의해야합니다. 그 시점에서 etckeeper 는 생명의 은인이 될 수 있습니다! :)

행운을 빕니다!

루벤


내일 max_requests를 제한하려고합니다. 각 프로세스가 CPU를 먹고 싶어하는 것처럼 보이므로 이것이 좋은 생각 일 수 있습니다. 우리는 비상 재시동 임계 값을 사용하고 있지만 내 숫자는 약간 더 높았습니다. 철저한 감사합니다-매우 감사합니다. 캐싱에 대한 당신의 생각을 알고 싶습니까? PHP 캐싱을 사용한다는 것이 프레임 워크가 그것을 처리하도록 조정되어야한다는 것을 궁금합니다. 나는 그 개념에 익숙하지 않다.
amurrell

3

opcode 캐싱을 실행하고 있습니까?

예전에는 APC 였지만 버그가 많았 으며 현재 5.5 이후 PHP의 일부이며 5.3에 대한 PECL의 백 포트가있는 Zend Opcache에 의해 대체되었습니다. 그리고 5.4.


이 Zend OpCache에 관심이 있습니다-5.3에 있습니다-이 답변을 확장 할 수 있다면 정말 감사하겠습니다!
amurrell

우리는 xcache를 가지고 있었지만 이제는 Zend Opcache를 선택했고 그것을 설치하고 phpinfo ()에서 작동하고 있음을 확인했습니다. 결과가 손가락을 가로 지르
amurrell

zend opcache를 지금 비활성화해야했습니다. 동적 PHP 생성 CSS 또는 js 파일을 제외한 모든 것이 작동했습니다. opcache에서 해당 파일을 블랙리스트에 올리려고했지만 블랙리스트가 작동하지 않거나 opcache로 인해 nginx로 인해 해당 파일에 대해서만 502 잘못된 게이트웨이 오류가 발생하는 이유를 알 수 없습니다. 템플릿에 필요한 템플릿은 잘못된 프레임 워크의 일부입니다. nginx 로그에서 수많은 readv 실패-104 피어 연결 오류가 발생했습니다.
amurrell
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.