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

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

  • 우리는 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 구성을 최적화하고 꼭 필요한 경우에만 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 는 생명의 은인이 될 수 있습니다! 🙂

행운을 빕니다!

루벤


답변

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

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


답변