
Mi estado de Apache se ve así;
201 requests/sec - 98.8 kB/second - 504 B/request
85 requests currently being processed, 345 idle workers
_____CCW_C_____C__C__C_R____C_WC_________C__C____CW__C__CCC_____
__C____W______C___C___CW__C_C______C__W_C__C_____CCC____C______R
CC_C_______C___C____C______________C______C__C________________C_
___________________C______________________C_______C___C_____C___
CC____C__C___R_____C_C_CC__________C___C___________R____C_C_C___
______C______W_W__W___C____________________C__WCC__R__R_C_______
R__RC________________________C___R____W__C____..................
....................................................
La carga del servidor es promedio de 2 en una máquina de 4 núcleos.
La utilización de IO es del 10 al 15 % y no tiene muchos saltos por encima del 70 %.
La máquina tiene casi 4 gb libres y usa 0 swap.
El sitio en la máquina es un sitio PHP. Todo el código PHP está optimizado y es rápido principalmente cuando se accede a él, sin embargo, a veces las solicitudes se atascan. Significado atascado; sin respuesta durante al menos 10 segundos. Depuramos el código PHP, pero es bastante óptimo y rápido. Le dedicamos mucho tiempo hasta que decidimos probar la solicitud de:
<html><body>test</body></html>
página prueba.html.
Este recurso estático también se "bloquea" de la misma manera que las páginas PHP se "bloquean".
¿Cómo es eso posible dada la salud del sistema y el hecho de que es un archivo estático?
Probé la red, pero, cuando PHP muestra "lentitud" en el monitoreo del sitio, los archivos de prueba html también tardan (mucho más) que 10 segundos en cargarse;
time lynx -dump http://127.0.0.1/test.html
Estamos un poco desesperados por resolver este problema, pero parece que no podemos abordarlo.
Respuesta1
¿Quizás Apache se quede sin identificadores de archivos? ¿Cuántos identificadores de archivos le ha permitido tener? El valor predeterminado 1024 puede convertirse en un cuello de botella muy pronto. En Linux subes los límites en /etc/security/limits.conf
el archivo.
¿Hay mucha actividad del disco durante las pérdidas? Si tiene el registro de acceso de Apache y otros registros habilitados de manera muy detallada, ¿quizás sea el sistema de archivos el que realice los últimos cambios? Eso no debería afectar a Apache de ninguna manera, pero nunca se sabe.
Y sólo para estar seguro, echa un vistazo a /proc/sys/kernel/random/entropy_avail
los puestos. Puedes verlo con, por ejemplo watch -n1 'cat /proc/sys/kernel/random/entropy_avail'
. Si dice 0
, su kernel se quedó sin entropía y eso bloquea Apache hasta que haya más entropía disponible.
Si ese es el caso, puede instalar rng-tools
y ejecutar el rngd
demonio, que transfiere números semialeatorios de /dev/urandom a /dev/random en situaciones donde la entropía real no está disponible.
Respuesta2
No he profundizado en los aspectos internos, pero según mi experiencia y lo que me han dicho... si PHP se ejecuta en Apache usando el módulo integrado ( libphp5.so
), entonces Apache carga PHP (y opcionalmente, cualquier módulo compartido) en la memoria del cada solicitud, incluso si no se está ejecutando el código PHP.
Considere usarnginxcomo proxy inverso frente a Apache. nginx es increíblemente rápido a la hora de servir recursos estáticos y, si se configura correctamente, realmente puede reducir la carga en un servidor web ocupado. Para obtener puntos de bonificación, configure PHP para que se ejecute a través de FastCGI dentro de nginx. Echa un vistazo aEste artículopara descubrir algunas de las razones. Es una manera realmente genial de hacerlo. Configuré un nuevo servidor web con Ubuntu 10.04, nginx, spawn-fcgi y php-cgi la semana pasada y casi no me tomó tiempo. PHP 5.3 viene incluido con Ubuntu 10.04, para que conste.