¿Por qué hay toneladas de procesos PHP abiertos en mi servidor?

¿Por qué hay toneladas de procesos PHP abiertos en mi servidor?

Hoy vi que uno de mis sitios web no funciona, así que entré al servidor y ejecuté ps -eF. Veo alrededor de 200 procesos PHP que se ejecutan durante 4 horas.

Apache está construido con el evento mpm y mod fcgid.

Eliminé todos los procesos PHP y ahora funciona bien, ¿por qué sucede esto? ¿Es este el comportamiento esperado?

Realmente no entiendo cómo procesa Apache la cantidad de procesos PHP y sus ID de proceso, por lo que sería bueno si alguien también pudiera darme alguna referencia cuando pueda leer sobre esto.

Además, utilicé el comando "ab" (Apache Benchmark) para ver si esto sucede todo el tiempo, así que lo ejecuté unas 4 o 5 veces seguidas con 30 solicitudes simultáneas y nuevamente hay como 150 procesos PHP ejecutándose, cuando siga ejecutando "ab" ahora no genera más procesos y el sitio web sigue funcionando. Para que quede claro, las 4 o 5 veces que ejecuté "ab" no fueron al mismo tiempo, tan pronto como finalizó un proceso "ab", ejecuté otro, pero cada vez que ejecuté "ab" hice 30 solicitudes simultáneas.

¡Por favor, arroja algo de luz sobre esto! Gracias :)

Respuesta1

Sí, este es el comportamiento esperado. Parecería que tenías 5 copias de ab ejecutándose al mismo tiempo. Esto dio como resultado que sus 150 procesos PHP manejen las 30 solicitudes para cada uno de sus 5 procesos ab.

Apache funciona mejor cuando todos sus subprocesos pueden ejecutarse en la memoria. Habrá una carga en la que será necesario intercambiar los subprocesos al disco. El tiempo de respuesta se degradará rápidamente cuando esto ocurra. Eliminar procesos como lo hizo mejorará el rendimiento. En este caso, el rendimiento del servidor puede empeorar. Si el número máximo de subprocesos está configurado demasiado alto, es relativamente fácil realizar un DOS (Denegación de servicio) utilizando este comportamiento.

Otra razón por la que puedes terminar con problemas es si dos procesos se bloquean en dos recursos. Si los otros procesos necesitan cualquiera de estos recursos, es posible que no respondan. Apache limitará la cantidad de procesos creados en este caso. Eliminar cualquiera de los procesos estancados debería solucionar el problema. Dependiendo del orden de bloqueo normal, es posible que sea necesario finalizar un proceso específico para evitar otro punto muerto. Esto tendrá poco o ningún impacto en el rendimiento del servidor.

Los errores de programación también pueden provocar que los subprocesos se cuelguen. Esto puede provocar que las cabezas se peguen como viste. Encontrar lo que sucedió es difícil después del hecho, pero el contenido de los registros de su servidor Apache puede ayudar. Consulte el registro de errores para ver si hay problemas. El registro de acceso puede tener entradas para las solicitudes que estuvieron pendientes en el momento en que finalizó los procesos.

Apache debería finalizar algunos de los procesos si no se utilizan durante un período de tiempo. Esto está controlado por el MaxSpareThreadsparámetro. Verifique su archivo de control, que debería tener algunos comentarios sobre los parámetros para subprocesos, servidores y clientes. Los valores predeterminados suelen ser buenos.

Si hay problemas con el código, MaxRequestsPerChildsuele ser útil establecer un valor entre 5000 y 100. Cuanto menor sea el número, más a menudo será necesario crear nuevos subprocesos y más duro deberá trabajar el servidor Apache.

EDITAR: Apache abrirá varios subprocesos al inicio. Esto depende de la interacción de varios parámetros. Ver elDocumentación de configuración de MPMpara obtener detalles sobre los parámetros. Esto es independiente de cualquier carga del servidor y normalmente es el número mínimo de subprocesos que un servidor en ejecución seguirá ejecutando.

información relacionada