Mi configuración: tengo 3 máquinas de servidor web casi idénticas que sirven al mismo sitio web dinámico de alta carga con un simple equilibrio de carga sobre dns. El servicio ha estado funcionando durante más de dos años con la misma configuración de apache: apache2, php5, ubuntu 8.04 linux 2.6.24-29-server.
Mi problema: desde hace aproximadamente dos semanas tengo problemas con esta configuración. Casi todos los días tengo un pequeño momento durante unos 5 minutos, en el que no se puede acceder al sitio web. Todavía puedo iniciar sesión en los servidores a través de ssh. Si corro htop
, veo que la máquina simplemente no hace nada. Tengo alrededor de 1000 procesos de apache en ejecución, pero no hay actividad de la CPU.
He usado el mod_status de apache para depurar esta situación. El cuadro de indicadores del proceso se ve así:
_C.___K_______________________R._______.__K_K____K___C_______.__
_______C__________.___________________________________.________C
_.____K__________K___K_WK_____._K_____________________________._
W______K__________K________.____________________._______C_______
_C_.__K__K____.._.._____________________________________C_______
_R___________K___.______C________.C_________.______._____C______
____________KKC____K_____K__WC_________________C_____.__.____.__
_____________________C_________K______.____C______._____________
_.___C____.___.___________________________.K______.____K________
W__.___________________C.__.____K________K_______R_._.__._______
__C__C_.__________C__C_______._____W______________C_.___C_______
____.______C_____________C________.____C____________.________._K
__.__________.K_____________K_________._____C____.K__________KW_
__K.W________R_________._______.___W___________.____.__K_____W__
W___.___..________W____K
Scoreboard Key:
"_" Waiting for Connection, "S" Starting up, "R" Reading Request,
"W" Sending Reply, "K" Keepalive (read), "D" DNS Lookup,
"C" Closing connection, "L" Logging, "G" Gracefully finishing,
"I" Idle cleanup of worker, "." Open slot with no current process
Entonces, la mayoría de los procesos solo están esperando la conexión. después de aproximadamente 5 minutos, la situación volverá a la normalidad: tengo menos procesos en cada máquina, la mayoría de los trabajadores tienen el estado "." (lo que significa que están abiertos para procesar una solicitud) y, por supuesto, ¡se puede acceder al sitio web!
así que estoy tratando de encontrar algo en los registros, pero simplemente no hay nada ... el registro de acceso de apache permanece en silencio durante aproximadamente 4 minutos, lo mismo es para el registro de errores. Tampoco puedo encontrar nada malo en otros registros del sistema.
la situación es la misma en los 3 servidores web (todos tienen este pico de carga y una condición que no responde al mismo tiempo), por lo que no creo que esto esté relacionado con el hardware. pero creo que esto podría estar relacionado con algún problema de red (tcp).
¿algunas ideas?
EDITAR: algo más de información, que acabo de descubrir:
Acaba de suceder nuevamente y pude verificar que tampoco puedo conectarme localmente cuando se produce este problema.
He realizado algunas estadísticas de conexión con el siguiente comando después de que sucedió: netstat -an|awk '/tcp/ {print $6}'|sort|uniq -c
- 109 CLOSE_WAIT
- 2652 ESTABLECIDO
- 2 FIN_WAIT1
- 11 LAST_ACK
- 12 ESCUCHA
- 91 SYN_RECV
- 1 SYN_SENT
- 16 TIME_WAIT
Si ejecuto el mismo comando algún tiempo después, tengo algo como esto:
- 4 CIERRE
- 108 ESTABLECIDO
- 18 FIN_WAIT1
- 182 FIN_WAIT2
- 37 LAST_ACK
- 12 ESCUCHA
- 50 SYN_RECV
- 11276 TIME_WAIT
Entonces, en la situación normal, solo tengo 100-200 conexiones abiertas por parte de clientes que están siendo manejados por apache en este momento. Cuando tengo este "bloqueo", tengo muchas más conexiones. ¿Cuál es la mejor manera de analizar esto?
EDIT2: las líneas importantes en apache2.conf son:
KeepAlive On
MaxKeepAliveRequests 20
KeepAliveTimeout 1
<IfModule mpm_prefork_module>
ServerLimit 920
StartServers 30
MinSpareServers 80
MaxSpareServers 120
MaxClients 920
MaxRequestsPerChild 700
</IfModule>
Es un prefork apache2 con php_mod.
El servidor tiene 8 GB de RAM y una partición de intercambio de 4 gb.
tcpdump
) lo ayudará a llegar a la raíz del problema ... por cierto, ¿cuál es su uso de memoria y políticas de firewall?