
이것은 긴급한 질문입니다. 4GB RAM과 2vCPU를 갖춘 AWS 인스턴스가 너무 많은 php-fpm 프로세스로 인해 소모되고 있습니다.
PHP-FPM은 이전에 수행하지 않았던 너무 많은 프로세스를 생성하기 시작합니다. 이로 인해 사이트 로딩 속도가 느려집니다. 왜 이런 일이 발생하는지 알 수 없습니다.
내 php.ini 구성:
html errors = off
precision = 14
output_buffering = 4096
serialize_precision = 17
max_execution_time = 300
max_input_time = 60
max_input_vars = 5000
log_errors_max_len = 1024
post_max_size = 27M
upload_max_filesize = 27M
max_file_uploads = 20
default_socket_timeout = 60
pdo_mysql.cache_size = 2000
memory_limit = 256M
www.conf:
pm = dynamic
pm.max_children = 35
pm.start_servers = 10
pm.min_spare_servers = 10
pm.max_spare_servers = 20
pm.max_requests = 1000
답변1
귀하의 질문에 답변
www.conf에서 이것을 변경합니다(35개 프로세스).
pm.max_children = 35
pm.start_servers = 10
pm.min_spare_servers = 10
pm.max_spare_servers = 20
pm.max_requests = 1000
이것(8개 프로세스) - 또는 원하는 번호로
pm.max_children = 8
pm.start_servers = 4
pm.min_spare_servers = 1
pm.max_spare_servers = 2
pm.max_requests = 1000
이 오타를 수정하고 싶을 수도 있습니다
max_file_uploads = 20 = 20
댓글로 질문에 답하기
배경으로 pm.max_children은 요청을 처리하는 데 사용할 수 있는 PHP 스레드 수입니다. 스레드를 사용할 수 없는 경우 요청은 작업을 사용할 수 있을 때까지 웹 서버 시간 초과까지 대기열에 보관됩니다.
PHP는 메모리 집약적이며 CPU 집약적입니다. RAM이 10개 PHP 스레드로 충분하지만 30개를 할당하면 서버가 교체되고 성능이 끔찍해집니다. CPU를 과도하게 할당하면 속도가 느려지지만 RAM이 부족한 것만큼 나쁘지는 않습니다.
일반적으로 서버 RAM을 소모하지 않고 얼마나 많은 PHP 작업자를 실행할 수 있는지 연구해야 합니다. 서버가 PHP가 꺼진 상태에서 2GB RAM을 사용하고 각 스레드가 100MB RAM을 사용한다고 가정하면 약 20명의 PHP 작업자가 있을 수 있습니다. RAM은 디스크 캐시로 사용되므로 RAM이 포화되지 않도록 주의하고 일부 RAM을 비워 두십시오.
느린 PHP 스레드와 큐 사이의 균형을 찾아야 합니다. 누구도 대신해 줄 수 없습니다. 서버가 완전히 활용되지만 어려움을 겪지 않을 때까지는 실험이 될 것입니다. 하지만 시작하려면 스레드가 최대 10개라고 가정하고 거기서부터 시작하겠습니다. 사용 가능한 메모리를 모니터링하려면 "top"을 사용하세요. 그러나 메모리의 경우 PHP RAM 사용량을 추정하려면 "virt" 대신 "res"(메모리에 상주한다고 가정) 열을 사용해야 할 수도 있습니다.
Opcache
나는 PHP7이 상당히 잘 최적화되어 있고 기본적으로 활성화되어 있기 때문에 opcache를 활성화하라는 조언이 시대에 뒤떨어진 것이라고 생각합니다(그러나 확실하지는 않습니다).
캐싱
PHP의 좋은 성능을 위한 핵심은 캐싱입니다. 사용자 지정되지 않은 페이지를 방문하는 익명의 사용자는 종종 캐시될 수 있으며, 1/5/60초 동안만이라도 로드가 많은 서버에서는 큰 도움이 될 수 있습니다. 캐싱 헤더가 페이지 만료를 올바르게 설명하는지 확인한 다음 웹 서버를 사용하는 경우 적절하게 캐시하도록 Nginx/Apache를 구성하십시오.
CloudFront/CloudFlare와 같은 CDN에서 정적 리소스를 캐시할 수도 있습니다(CloudFlare에는 무료 계층이 있으며 AWS와 잘 작동합니다). CPU나 RAM이 많지는 않지만 대역폭이 절약됩니다. 모든 비트는 로드된 서버에 도움이 됩니다.
답변2
당신이 가지고 있는 CPU가 어떤 종류인지 확인해 보겠습니다. Graviton Cpus를 사용하는 경우 CPU와 스레드는 1:1입니다.
즉. CPU 수는 number 로 가져야 하는 것입니다 pm.max_children
. 메모리 누수가 걱정되거나 문제가 반복되는 경우 언제든지 이 pm.max_requests
기능을 사용하고 적절한 값으로 설정할 수 있습니다.
이 값은 누출이 얼마나 빨리 증가하는지에 따라 다소 달라집니다. 너무 작으면 때때로 잘못된 게이트웨이를 경험할 수 있습니다.