MaxClients en apache. ¿Cómo saber el tamaño de mi proceso?

9

De http://httpd.apache.org/docs/2.2/misc/perf-tuning.html

El mayor problema de hardware que afecta el rendimiento del servidor web es la RAM. Un servidor web nunca debería tener que intercambiar, ya que el intercambio aumenta la latencia de cada solicitud más allá de un punto que los usuarios consideran "lo suficientemente rápido". Esto hace que los usuarios presionen detener y recargar, aumentando aún más la carga. Puede y debe controlar la configuración de MaxClients para que su servidor no genere tantos hijos que comience a intercambiarse. Este procedimiento para hacer esto es simple: determine el tamaño de su proceso Apache promedio, mirando su lista de procesos a través de una herramienta como top, y divídalo en su memoria total disponible, dejando espacio para otros procesos.

El problema principal es que no puedo entender cómo saber el tamaño, porque, bueno, tengo el tamaño de httpd en no más de 3888

Pero, si necesitamos determinar el número de MaxClients, y tengo 4GB de RAM, entonces obtengo: 972, ¿entonces debería usar como 900 en los MaxClients?

Larry
fuente
44
"Tengo el tamaño de httpd en no más de 3888" - Creo que hablo por todos cuando digo "¿HUH?"
womble

Respuestas:

9

Primero, determine el PID de uno de sus procesos de Apache.

Entonces puedes hacer algo como esto:

cat /proc/PIDHERE/status | grep VmRSS

Esto producirá el tamaño de conjunto residente (actual) de ese proceso en particular, similar a:

VmRSS: 304456 kB

Este valor es como suena, es el tamaño del proceso residente en la RAM.

Luego normalice su unidad de medida ( 4GB * 1024 * 1024 = 4,194,304 KB). Dividir:

4194304 KB / 304456 KB = 13.77 processes

Tenga en cuenta que es probable que tenga otros procesos ejecutándose en su sistema que también consuman memoria, e idealmente desea minimizar el intercambio, por lo tanto, es probable que no desee configurar 13 Clientes Apache Max (usando mis números), desea una cantidad menor (a su discreción )

Esta es una estimación cruda; El tamaño de sus procesos de Apache puede crecer con el tiempo dependiendo de la carga.

loopforever
fuente
1
Si bien RSS no incluye páginas compartidas, sí incluye páginas marcadas como copia en escritura, es decir, hay espacio en una máquina para más procesos que (suma de rss) / (memoria física). Vea también mi respuesta en otra parte: el espacio libre es esencial para un buen rendimiento.
symcbean
4

Predecir los maxClients a partir de escenarios de prueba es un punto de partida, pero para resolver el problema correctamente, debe comenzar a medir cómo se comporta su aplicación con el tráfico real.

Suponiendo que su apache se esté ejecutando antes de la bifurcación ...

Configure un trabajo cron para contar el número de procesos httpd y la salida de 'libre'. Tenga en cuenta que si su servidor web está sirviendo contenido de archivos locales (y en muchos casos, incluso cuando no lo está), la cantidad de memoria disponible para caché / búferes tendrá un gran impacto en el rendimiento. es decir, si llega al punto de cambiar, ¡su rendimiento web probablemente sea horrible!

Una vez que tenga algunos datos, grábelos en un gráfico y haga una regresión de mínimos cuadrados en él, extrapole para encontrar el número de clientes en los que alcanza su límite objetivo para el uso de memoria httpd. Un punto de partida para el objetivo de memoria sería la menor cantidad del 80% de la memoria física / 80% del tamaño del contenido.

(tenga en cuenta que si tiene MinSpareServers configurado en un valor muy alto, los resultados pueden no ser precisos)

#!/bin/bash

LOGFILE='/var/log/httpd/memusage'
PIDS = `ps -ef | grep httpd | grep -v grep | wc -l`
MEM = `free | grep 'buffers/cache'`
DAY = `date '%Y-%m-%d %H:%M:%S'`
echo ${DAY} ${PIDS} ${MEM} >>LOGFILE

En un mundo ideal, también medirías el tiempo de respuesta de la URL en el mismo archivo de registro, pero eso se está volviendo mucho más complejo.

symcbean
fuente
Para mí, los buffers / cache cambian muy poco si se ejecutan 11 clientes o cuando el servidor ha alcanzado 86 o 151 clientes (y el servidor se ha bloqueado). ¿Qué esperas ver en tu variable MEM? Recibo dos números, por lo que me pregunto si Ubuntu 12.04 está dando algo diferente a lo que esperaba.
PeterB
Intente ejecutar 'gratis' y verá lo que espero (2 números). Si es cierto que hay poca variación en estos números con diferentes números de procesos, entonces está ejecutando el servidor basado en eventos o la configuración de maxspareservers es una tontería. Si hubiera publicado una muestra de la salida y las partes relevantes de su httpd.conf, ¿tal vez tendríamos una mejor imagen?
symcbean
.... y "crash"? Que accidente
symcbean
Lo sentimos, consulte pastebin.com/aHZCagVn para conocer la configuración de httpd.conf y la salida de muestra. Por "bloqueo" me refiero a demasiados clientes, el servidor se queda sin memoria y se bloquea. Consulte pastebin.com/fnXzBfQL para obtener más información.
PeterB
1
@PeterB parece más probable que MySQLd esté causando este problema. Cuando el asesino OOM del kernel entra en acción, mata a los peores delincuentes primero según el valor de / proc / PID / oom_score_adj. Como se evidencia en su salida, mysqld fue primero. Es posible que deba ajustar la configuración en my.cnf de manera más adecuada para ajustarse a las restricciones de su VM. Como / temporal / solución alternativa, solo para ver si puede evitar las patadas al asesino OOM, intente agregar un archivo de intercambio para memoria virtual adicional; luego elimínelo una vez que haya identificado su problema real.
loopforever