
Esta es una pregunta urgente. Mi instancia de AWS con 4 GB de RAM y 2 vCPU se está agotando por demasiados procesos php-fpm.
PHP-FPM comienza a crear demasiados procesos que no hacía antes. Esto da como resultado una carga lenta del sitio. No puedo entender por qué sucede esto.
Mi configuración de 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
Respuesta1
Respondiendo tu pregunta
En www.conf cambia esto (35 procesos)
pm.max_children = 35
pm.start_servers = 10
pm.min_spare_servers = 10
pm.max_spare_servers = 20
pm.max_requests = 1000
a este (8 procesos) - o el número que quieras
pm.max_children = 8
pm.start_servers = 4
pm.min_spare_servers = 1
pm.max_spare_servers = 2
pm.max_requests = 1000
Quizás también quieras corregir este error tipográfico.
max_file_uploads = 20 = 20
Respondiendo la pregunta en los comentarios.
Como antecedente, pm.max_children es cuántos subprocesos PHP están disponibles para las solicitudes de servicio. Si no hay un hilo disponible, una solicitud se pondrá en cola, hasta que se agote el tiempo de espera del servidor web, hasta que haya un trabajo disponible.
PHP consume mucha memoria y bastante CPU. Si tiene suficiente RAM (digamos) 10 subprocesos PHP, pero asigna 30, su servidor intercambiará y el rendimiento será terrible. Si asigna demasiado CPU, irá más lento, pero no será tan malo como una RAM insuficiente.
En general, debe calcular cuántos trabajadores PHP pueden ejecutar sin agotar la RAM de su servidor. Digamos que su servidor usa 2 GB de RAM con PHP desactivado y cada hilo usa 100 MB de RAM, puede tener alrededor de 20 trabajadores PHP. Debes intentar evitar saturar la RAM, ya que se utiliza como caché de disco, así que deja algo de RAM libre.
Necesita encontrar un equilibrio entre los subprocesos PHP lentos y las colas. Nadie puede hacer eso por usted, será una experimentación hasta que su servidor esté completamente utilizado pero sin problemas. Pero, para empezar, digamos un máximo de 10 subprocesos y partamos de ahí. Use "top" para monitorear la memoria libre, pero para la memoria es posible que necesite usar la columna "res" (residente en la memoria, supongo) en lugar de "virt" para estimar el uso de RAM de PHP.
opcaché
Sospecho (pero no estoy seguro) que el consejo para habilitar el opcache está desactualizado, ya que PHP7 está bastante bien optimizado y probablemente esté habilitado de forma predeterminada.
Almacenamiento en caché
La clave para un buen rendimiento con PHP es el almacenamiento en caché. Los usuarios anónimos que acceden a una página que no está personalizada a menudo pueden almacenarse en caché, incluso si es solo durante 1/5/60 segundos, puede ser de gran ayuda en un servidor muy cargado. Asegúrese de que los encabezados de almacenamiento en caché describan correctamente la caducidad de la página, luego configure Nginx/Apache para almacenar en caché de manera adecuada, si está utilizando un servidor web.
También puede almacenar en caché recursos estáticos en una CDN, como CloudFront/CloudFlare (tenga en cuenta que CloudFlare tiene un nivel gratuito y funciona bien con AWS). No dirá mucha CPU o RAM, pero ahorrará ancho de banda. Todo ayuda en un servidor cargado.
Respuesta2
Verificaría qué tipo de CPU tienes. Si está utilizando Graviton Cpus, son 1 a 1 en CPU frente a subprocesos.
es decir. el recuento de CPU es lo que deberías tener como número pm.max_children
. Si tiene miedo de pérdidas de memoria o de que sea un problema recurrente, siempre puede utilizar la pm.max_requests
función y configurarla en un valor apropiado.
Ese valor se basa en cierta medida en la rapidez con la que crece la fuga. Demasiado pequeño y podrías experimentar malas puertas de enlace de vez en cuando.