Hace bien poco, buscando por ahí algún enlace para profundizar un poco más en estos temas, me encontré con este artículo de una empresa de hosting donde te proponen un script para ajustar el valor más adecuado a tus necesidades. Había dos cosas que no me gustaban en él script propuesto. Por un lado, tomaban el valor más conservador, es decir, el resultante de dividir la memoria libre entre lo que ocupa el proceso de Apache mayor. En segundo lugar, hacen el cálculo de la memoria libre sin tener en cuenta la que está ocupada por cache o buffers y que podría liberarse en caso de necesidad. Yo le he hecho algunos cambios para salvar ambos puntos y dejarlo un poco más bonito e informativo y me ha salido esto:
#!/bin/bash clear # Primero analizamos los procesos de apache funcionando actualmente LISTA=`ps -aylC apache2 |grep apache2 |awk '{print $8'} |sort -n` echo "Lista ordenada de la memoria, en bytes, ocupada por los procesos de Apache corriendo en este momento:" COUNT=0 SUMA=0 for ITEM in $LISTA do COUNT=`expr $COUNT + 1` SUMA=`expr $SUMA + $ITEM` echo "$COUNT -> $ITEM" if [ $COUNT -eq 1 ] then MENOR=$ITEM fi done MAYOR=$ITEM MEDIA=`expr $SUMA / $COUNT` # Pasamos las cantidades a Kbytes MENOR=`expr $MENOR / 1024` MAYOR=`expr $MAYOR / 1024` MEDIA=`expr $MEDIA / 1024` echo "El proceso de Apache más grande ocupa" $MAYOR "Kbytes y el menor" $MENOR "Kbytes" echo "La media de la memoria ocupada por un proceso es de $MEDIA Kbytes" echo "Detenemos Apache..." apache2ctl graceful-stop > /dev/null # Limpiamos los caches y buffers del servidor sync echo 3 > /proc/sys/vm/drop_caches # Calculamos la memoria libre del sistema FREEMEM=`free -m |head -n 2 |tail -n 1 |awk '{free=($4); print free}'` echo "La memoria libre del servidor, después de liberar cache y buffers, es de $FREEMEM Kbytes" echo "Arrancamos Apache de nuevo..." apache2ctl start > /dev/null echo "MaxClients debería de estar entre" `expr $FREEMEM / $MAYOR` "y" `expr $FREEMEM / $MENOR` echo "Usando el valor medio de la memoria ocupada, un valor recomendable de MaxClients sería de" `expr $FREEMEM / $MEDIA`
El script de aquí arriba imprime una lista de la memoria ocupada por todos procesos de Apache activos en el momento de ejecutarlo. Luego toma el mayor, el menor y la media de todos ellos y calcula la memoria libre del sistema. Para ello, antes detiene Apache (con un graceful-stop para no fastidiar a nadie que esté viendo nuestra web en ese momento) y libera los buffers y caches de memoria. Por último, arranca de nuevo Apache y nos da como salida dos valores: una horquilla entre el valor que debería de tomar MaxClient usando el menor y el mayor valor de los procesos tomados en la instantánea anterior y un valor recomendado que sale de usar el valor medio de todos ellos.
Evidentemente no se trata de algo matemático. Como es lógico, ejecutado en diferentes momentos obtendremos valores distintos ya que ni la RAM que usa nuestro servidor es inmutable ni el tamaño de los procesos de Apache es siempre el mismo ni siguen la misma distribución. Pero para darnos una primera idea del valor con el que tenemos que empezar a jugar creo que es bastante válido. Ya me contáis.