Apache 2.2 finalmente usa toda la memoria (mpm trabajador)

Apache 2.2 finalmente usa toda la memoria (mpm trabajador)

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 topcon 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

KeepaliveTimeoutayudarí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 topun 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, topenumera los procesos de Apache como httpd.workery 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 httpdy 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_....................................................
................................................................
................................................................
................................................................
................................................................
................................................................
................................................................
................................................................

topen un servidor que ejecuta prefork debería mostrar aproximadamente 31 httpdprocesos, y topen un servidor que ejecuta trabajador debería mostrar 3 httpd.workerprocesos.

información relacionada