![Apache 2.2 finalmente usa toda la memoria (mpm trabajador)](https://rvso.com/image/632747/Apache%202.2%20finalmente%20usa%20toda%20la%20memoria%20(mpm%20trabajador).png)
Estoy ajustando un servidor Apache 2.2 (se comparte con MySQL + Courier + Mongo + Postgre). El servidor es bare metal (sin virtualización) con 2 Xeon de cuatro núcleos (16 núcleos en total) y 12 GB de RAM ECC (actualizándose a 24 GB en los próximos días). MySql tiene innodb_buffer configurado en 2G y está funcionando bien. Mongo y Postgre apenas se tocan, sólo por motivos de desarrollo.
El problema es que Apache está consumiendo toda la memoria disponible y eventualmente usa todo el intercambio (y por lo tanto falla MySql porque usa más memoria). Tenemos Apache 2.2 con trabajador MPM y mod_security. Cada vez que lo reiniciamos, tenemos aproximadamente 8G de RAM libre.
Estoy tratando de entender algunas cosas:
- ¿Cuál es la relación entre los procesos que se muestran
top
con los servidores trabajadores? Esperaba ver como máximo 10 procesos (como ServerLimit en la configuración del trabajador, sin tener en cuenta el proceso principal). - ¿La cantidad de memoria RES se utiliza para cada HILO o para cada PROCESO?
- En el resultado de mod_status a continuación, hay muchas solicitudes de LECTURA que permanecen allí durante mucho tiempo. Intenté habilitar ExtendedStatus para descubrir qué clientes hay, pero no pude encontrar ninguna información útil. ¿Alguna sugerencia?
- Con el uso real de la memoria, ¿qué cantidad de RAM necesitaría para atender 400 conexiones simultáneas? (como muestra el estado del mod, 250 ya están agotados)
- ¿Qué pasa con el aumento de ThreadsPerChild en lugar de aumentar MaxClients/ServerLimit?
<IfModule trabajador.c> InicioServidores 2 MaxClientes 250 MinSpareThreads 25 MaxSpareThreads 75 Hilos por niño 25 Solicitudes máximas por niño 0 Límite de servidor 10 </IfModule>
Programas TOP (sólo para Apache):
arriba - 16:30:21 hasta 46 días, 23:12, 2 usuarios, carga promedio: 0,94, 0,97, 1,31 Tareas: 460 en total, 1 en ejecución, 459 durmiendo, 0 detenido, 0 zombie CPU(s): 2.8%us, 0.5%sy, 0.0%ni, 96.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Memoria: 12187448k en total, 10686748k usados, 1500700k libres, 67104k buffers Intercambio: 1048568k en total, 275904k usados, 772664k gratis, 2371208k en caché PID USUARIO PR NI VIRT RES SHR S %CPU %MEM TIME+ COMANDO 24252 wwwrun 20 0 2216m 161m 7484 S 20.2 1.4 0:09.25 httpd 24750 wwwrun 20 0 1264m 51m 6196 S 9.9 0.4 0:00.93 httpd 23996 wwwrun 20 0 2136m 279m 7292 S 6.0 2.4 0:16.76 httpd 23326 wwwrun 20 0 2216m 276m 7376 S 2.7 2.3 0:16.81 httpd 23582 wwwrun 20 0 2208m 293m 7132 S 2.3 2.5 0:27.30 httpd 23688 wwwrun 20 0 1904m 208m 7304 S 1,0 1,8 0:13,62 httpd 19507 wwwrun 20 0 2182m 229m 8096 S 0,7 1,9 0:18,65 httpd 23616 wwwrun 20 0 1908m 239m 7092 S 0,7 2,0 0:18,48 httpd 18304 wwwrun 20 0 2160m 334m 11m S 0,3 2,8 0:47,38 httpd 23637 wwwrun 20 0 1830m 231m 7556 S 0,3 1,9 0:20,56 httpd 24457 wwwrun 20 0 2196m 174m 6568 S 0.3 1.5 0:04.11 httpd 15694 wwwrun 20 0 2199m 295m 7504 S 0,0 2,5 0:20,54 httpd 15783 wwwrun 20 0 2172m 244m 10m S 0,0 2,1 0:17,45 httpd 16577 wwwrun 20 0 2128m 354m 7436 S 0.0 3.0 0:28.21 httpd 18290 wwwrun 20 0 277m 9880 964 S 0.0 0.1 0:00.05 httpd 18379 wwwrun 20 0 2208m 211m 6864 S 0,0 1,8 0:08,57 httpd 18480 wwwrun 20 0 2096m 305m 7540 S 0,0 2,6 0:17,72 httpd 18791 wwwrun 20 0 1920m 251m 7244 S 0,0 2,1 0:20,24 httpd 19348 wwwrun 20 0 2060m 310m 7388 S 0,0 2,6 0:22,07 httpd 19619 wwwrun 20 0 2206m 235m 7340 S 0,0 2,0 0:15,30 httpd 19999 wwwrun 20 0 2178m 144m 7132 S 0,0 1,2 0:05,50 httpd 20697 wwwrun 20 0 2002m 193m 7276 S 0.0 1.6 0:08.12 httpd 20838 wwwrun 20 0 1890m 127m 7260 S 0,0 1,1 0:07,44 httpd 21407 wwwrun 20 0 1988m 290m 7708 S 0,0 2,4 0:39,33 httpd 22252 wwwrun 20 0 2216m 295m 7732 S 0,0 2,5 0:27,04 httpd 22723 wwwrun 20 0 2020m 187m 7444 S 0.0 1.6 0:39.80 httpd 22753 wwwrun 20 0 1850m 206m 7448 S 0,0 1,7 0:10,62 httpd 23174 wwwrun 20 0 1990m 229m 7332 S 0.0 1.9 0:07.71 httpd 23383 wwwrun 20 0 1504m 76m 6372 S 0.0 0.6 0:01.25 httpd 23720 wwwrun 20 0 1906m 225m 7080 S 0,0 1,9 0:20,12 httpd 24778 wwwrun 20 0 970m 30m 5604 S 0.0 0.3 0:00.80 httpd
Finalmente, salida mod_status:
Versión del servidor: Apache/2.2.23 (Unix) mod_ssl/2.2.23 OpenSSL/1.0.0-fips Servidor de dominio PHP/5.3.24 con Suhosin-Patch mod_perl/2.0.5 Perl/v5.10.1 Servidor construido: 15 de mayo de 2013 10:17:30 ______________________________________________________________________________________________________________________________ Hora actual: lunes 12 de mayo de 2014 16:41:08 BRT Hora de reinicio: lunes 12 de mayo de 2014 15:36:37 BRT Generación de servidor principal: 1 Tiempo de actividad del servidor: 1 hora 4 minutos 31 segundos Accesos totales: 36446 - Tráfico total: 1,6 GB Uso de CPU: u213.3 s13.65 cu0 cs0 - 5,86% de carga de CPU 9,42 solicitudes/seg - 442,8 kB/segundo - 47,0 kB/solicitud 249 solicitudes actualmente en proceso, 0 trabajadores inactivos WWRRKRKRRRKRRRRWRRWWWRWCRR.................................. RWWWRRWRRRRKKRKRWRRRRRWWR...................................... WRWRCRRWRRWWRKRRWWRRWRWWW...................................... WRWKKWWWRWKRRWRCRRRWWRWWW.................................. WRWRWCRKCWWWRWWRRWWCRWRWW.................................... WRWKRWRRKKRKRRRRCWWKWWWRW................................. RWWKWRRWKRRRWRRWWCRRRRRRW................................. WWWRRWRKWWWKRWWWWRWWWKRRW.................................. RRRRRRRK.WKRRWRWWKRRWRRKR....................................... KCRRRRWRWWKRWWWRRKKWRWRWRK.................................
Actualización 1:
Intenté deshabilitar mod_security2, jugueteé con la configuración del trabajador, pero eventualmente Apache consumiría casi 20G de RAM (agregué un archivo de intercambio de 13G para evitar que el servidor fallara).
Finalmente, desactivé KeepAlive y mantuve MaxRequestsPerChild en 100; ahora Apache está usando 2-3G y las solicitudes se están limpiando, como se muestra a continuación:
Hora actual: martes 13 de mayo de 2014 17:07:48 BRT Hora de reinicio: martes 13 de mayo de 2014 16:49:14 BRT Generación del servidor principal: 0 Tiempo de actividad del servidor: 18 minutos 33 segundos Accesos totales: 6637 - Tráfico total: 133,2 MB Uso de CPU: u34.43 s3.05 cu0 cs0 - 3,37% de carga de CPU 5,96 solicitudes/seg - 122,5 kB/segundo - 20,5 kB/solicitud 14 solicitudes actualmente en trámite, 86 trabajadores inactivos ..................R................................. .............. ________________RR__R_R__RC_RWC_________________________ R_WC__R___R_______________________________________.............. ................................................. .............. ................................................. .............. ................................................. .............. ................................................. .............. ................................................. .............. ................................................. .............. ................................................. ..............
Respuesta1
KeepaliveTimeout
ayudaría a reducir el número de trabajadores "leídos" colgados.
MPM utiliza múltiples procesos con múltiples subprocesos para manejar el tráfico entrante, por lo que lo que está viendo es el funcionamiento normal de Apache.
Este ajuste predeterminado puede funcionar mejor para sus necesidades:
ServerLimit 12
StartServers 2
MaxClients 500
MinSpareThreads 25
MaxSpareThreads 50
ThreadsPerChild 50
Esto provocaría que se generaran un total de 10 procesos ( MaxClients
/ ThreadsPerChild
), lo que reduciría significativamente la huella de memoria de su servidor. Puede permitirse más subprocesos en menos procesos debido a la disponibilidad de la CPU.
Tenga en cuenta que para cambiar estas variables es necesario detener completamente Apache y luego reiniciarlo.
Respuesta2
¿Cuál es la relación entre los procesos que se muestran en la parte superior con los servidores de los trabajadores? Esperaba ver como máximo 10 procesos (como ServerLimit en la configuración del trabajador, sin tener en cuenta el proceso principal).
Eso no se parece a top
un servidor Apache que ejecuta el MPM trabajador. Estoy ejecutando dos servidores, uno con el MPM trabajador y otro con el MPM previo al fork. Con el trabajador, top
enumera los procesos de Apache como httpd.worker
y la cantidad de procesos coincide con la cantidad de servidores activos (líneas de puntos con algunas entradas que no son puntos) visibles a través de mod_status. Con prefork, los procesos se enumeran como httpd
y el número coincide aproximadamente con el número de trabajadores inactivos/activos (cada entrada sin puntos).
Entonces, dada esta salida mod_status:
..................R.............................................
..............._RR__R_R__RC_RWC__...............................
R_WC__R___R_....................................................
................................................................
................................................................
................................................................
................................................................
................................................................
................................................................
................................................................
top
en un servidor que ejecuta prefork debería mostrar aproximadamente 31 httpd
procesos, y top
en un servidor que ejecuta trabajador debería mostrar 3 httpd.worker
procesos.