Cuantas veces nos ha pasado que configuramos nuestros servidores lo mejor que podemos, pasa un tiempo y cuando tenemos que configurar otro, simplemente copiamos la configuración sin recordar que hace cada parámetro, bueno, este articulo pretende recopilar ajustes específicos a Apache sobre FreeBSD y explicar que hace cada opción de configuración.
Parte 1: Sistema Operativo
La primera fase de la optimización consiste en configurar correctamente el sistema operativo, para ello hay que definir algunos ajustes en diferentes lugares.
/etc/loader.conf
accf_http_load="YES"
accf_data_load="YES"
kern.ipc.somaxconn=1024
Las primeras 2 lineas cargan los módulos accf_http(9) y accf_data(9) en el kernel, al iniciar el sistema.
El módulo accf_http agrega un filtro en el socket que se encarga de pasar la petición desde el kernel a la aplicación, hasta que una petición HTTP/1.0 o HTTP/1.1 HEAD o GET completa es buffereada en el kernel.
Su utilidad es que un servidor no tendra que cambiar de contexto varias veces antes de realizar el análisis inicial de la petición, reduciendo así la cantidad de uso de CPU para manejar peticiones entrantes.
El módulo accf_data es similar a accf_http, sin embargo este previene que la aplicación reciba el descriptor de conexión hasta que datos lleguen a la conexión.
La variable kern.ipc.somaxconn se encarga de limitar el tamaño de la cola de escucha para aceptar nuevas conexiones TCP. Lo ideal para un servidor web es valores de 1024 o mas. También, colas mas largas hacen un mejor trabajo para evitar ataques de DoS.
/etc/sysctl.conf
net.isr.direct=1
Su objetivo es mejorar el desempeño, reducir la latencia y uso de CPU a través de la reducción del número de cambios de contexto.
Parte 2: Servidor Web
La segunda parte de la optimización consiste en instalar y configurar correctamente Apache para que aproveche al máximo las características del sistema.
httpd.conf
EnableMMAP on
EnableSendfile on
KeepAlive Off
EnableMMAP permite al proceso httpd usar mapeado en memoria si necesita leer contenidos de un archivos durante el envío.
EnableSendfile controla el uso de la llamada del sistema "sendfile", la cual es mucho mas eficiente que la operación conjunta de read/send y el uso de buffers de memoria. La implementación de sendfile en freebsd es "zero-copy", significando que esta optimizada para que el copiado de datos de archivo sea evitado.
La directiva KeepAlive tiene como objetivo reutilizar sockets para mejorar la transferencia de múltiples archivo a un solo cliente, sin embargo, cuando se tiene una gran cantidad de conexiones recurrentes, se comienzan a saturar complicando la conexión al servidor. Lo ideal es tener esta directiva en Off.
Además de lo anterior, es recomendable deshabilitar los módulos no utilizados ya que por defecto, todos los módulos están activos. En FreeBSD i386 esto no hace gran diferencia, pero en amd64 cada módulo puede llegar a consumir hasta 3mb de memoria, por proceso.
Datos interesantes
Un dato importante al instalar apache es, asegurarse de habilitar el uso de "kqueue".
La llamada del sistema "kqueue" es el manejador de eventos mas optimizado que existe sobre FreeBSD, es mucho mas eficiente y potente que utilizar select() o poll(); para notificar que una conexión esta lista para enviar o recibir.
En caso de utilizar el port www/apache20, es necesario compilarlo con el flag "-DWITH_KQUEUE_SUPPORT" para activar el soporte de kqueue. El port www/apache22 ya lo trae activado por defecto.
Referencias
http://httpd.apache.org/docs/2.2/mod/core.html#acceptfilter - AcceptFilter
http://redmine.lighttpd.net/projects/lighttpd/wiki/Docs:Performance#Eve… - kqueue
http://lists.freebsd.org/pipermail/freebsd-performance/2005-October/001… - net.isr.direct
http://www.freebsd.org/doc/en/books/handbook/configtuning-kernel-limits… - kern.ipc.somaxconn
http://www.nabble.com/Approaching-the-limit-on-PV-entries-td15985213.ht… - vm.pmap.shpgperproc
Manual
- accf_http (9)
- accf_data (9)
- sendfile (2)
- kqueue (2)
Autor
Angel Gabriel León Rodríguez