Estoy buscando entender algunos problemas de rendimiento del servidor que estoy viendo con un servidor web (para nosotros) muy cargado. El entorno es el siguiente:
- Debian Lenny (todos los paquetes estables + parcheados para actualizaciones de seguridad)
- Apache 2.2.9
- PHP 5.2.6
- Gran instancia de Amazon EC2
El comportamiento que estamos viendo es que la web generalmente se siente receptiva, pero con un ligero retraso para comenzar a manejar una solicitud, a veces una fracción de segundo, a veces 2-3 segundos en nuestros tiempos de uso pico. La carga real en el servidor se informa como muy alta, a menudo 10.xx o 20.xx según lo informado por top
. Además, ejecutar otras cosas en el servidor durante estos tiempos (incluso vi
) es muy lento, por lo que la carga definitivamente está allí. Curiosamente, Apache sigue siendo muy receptivo, aparte de ese retraso inicial.
Tenemos Apache configurado de la siguiente manera, usando prefork:
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 0
Y KeepAlive como:
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5
Al mirar la página de estado del servidor, incluso en estos momentos de gran carga, rara vez estamos llegando al límite del cliente, por lo general atendiendo entre 80-100 solicitudes y muchas de las personas en estado de mantenimiento. Eso me dice que descarte la lentitud de la solicitud inicial como "esperar un controlador", pero puedo estar equivocado.
El monitoreo de Amazon CloudWatch me dice que incluso cuando nuestro sistema operativo informa una carga de> 15, nuestra utilización de CPU de instancia es entre 75-80%.
Ejemplo de salida de top
:
top - 15:47:06 up 31 days, 1:38, 8 users, load average: 11.46, 7.10, 6.56
Tasks: 221 total, 28 running, 193 sleeping, 0 stopped, 0 zombie
Cpu(s): 66.9%us, 22.1%sy, 0.0%ni, 2.6%id, 3.1%wa, 0.0%hi, 0.7%si, 4.5%st
Mem: 7871900k total, 7850624k used, 21276k free, 68728k buffers
Swap: 0k total, 0k used, 0k free, 3750664k cached
La mayoría de los procesos se ven así:
24720 www-data 15 0 202m 26m 4412 S 9 0.3 0:02.97 apache2
24530 www-data 15 0 212m 35m 4544 S 7 0.5 0:03.05 apache2
24846 www-data 15 0 209m 33m 4420 S 7 0.4 0:01.03 apache2
24083 www-data 15 0 211m 35m 4484 S 7 0.5 0:07.14 apache2
24615 www-data 15 0 212m 35m 4404 S 7 0.5 0:02.89 apache2
Ejemplo de salida vmstat
al mismo tiempo que el anterior:
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
8 0 0 215084 68908 3774864 0 0 154 228 5 7 32 12 42 9
6 21 0 198948 68936 3775740 0 0 676 2363 4022 1047 56 16 9 15
23 0 0 169460 68936 3776356 0 0 432 1372 3762 835 76 21 0 0
23 1 0 140412 68936 3776648 0 0 280 0 3157 827 70 25 0 0
20 1 0 115892 68936 3776792 0 0 188 8 2802 532 68 24 0 0
6 1 0 133368 68936 3777780 0 0 752 71 3501 878 67 29 0 1
0 1 0 146656 68944 3778064 0 0 308 2052 3312 850 38 17 19 24
2 0 0 202104 68952 3778140 0 0 28 90 2617 700 44 13 33 5
9 0 0 188960 68956 3778200 0 0 8 0 2226 475 59 17 6 2
3 0 0 166364 68956 3778252 0 0 0 21 2288 386 65 19 1 0
Y finalmente, salida de Apache server-status
:
Server uptime: 31 days 2 hours 18 minutes 31 seconds
Total accesses: 60102946 - Total Traffic: 974.5 GB
CPU Usage: u209.62 s75.19 cu0 cs0 - .0106% CPU load
22.4 requests/sec - 380.3 kB/second - 17.0 kB/request
107 requests currently being processed, 6 idle workers
C.KKKW..KWWKKWKW.KKKCKK..KKK.KKKK.KK._WK.K.K.KKKKK.K.R.KK..C.C.K
K.C.K..WK_K..KKW_CK.WK..W.KKKWKCKCKW.W_KKKKK.KKWKKKW._KKK.CKK...
KK_KWKKKWKCKCWKK.KKKCK..........................................
................................................................
De mi experiencia limitada extraigo las siguientes conclusiones / preguntas:
Es posible que estemos permitiendo demasiadas
KeepAlive
solicitudesVeo algo de tiempo esperando a IO en vmstat, aunque no de manera constante y no mucho (¿creo?), Así que no estoy seguro de si esto es una gran preocupación o no, tengo menos experiencia con vmstat
También en vmstat, veo en algunas iteraciones una serie de procesos en espera de ser atendidos, que es a lo que atribuyo el retraso de carga de página inicial en nuestro servidor web, posiblemente erróneamente
Servimos una mezcla de contenido estático (75% o más) y contenido de secuencia de comandos, y el contenido de la secuencia de comandos suele ser bastante intensivo en el procesador, por lo que es importante encontrar el equilibrio adecuado entre los dos; a largo plazo, queremos mover las estadísticas a otro lugar para optimizar ambos servidores, pero nuestro software no está listo para eso hoy
Me complace proporcionar información adicional si alguien tiene alguna idea, la otra nota es que se trata de una instalación de producción de alta disponibilidad, por lo que desconfío de hacer ajustes tras ajustes, y es por eso que no he jugado con cosas como el KeepAlive
valor. todavía.