viernes 19 de septiembre de 2008

Django performance tips (Traducción)

Tomado del blog de Jacob Kaplan Moss del post “Django performance tips

 

Usa un servidor de medios (imágenes, mp3, etc.) por separado

Django de forma deliberada no sirve media, y esta diseñado de tal manera que debes de realizarlo tu mismo. Si intentas utilizar la misma instancia de apache para servir media y la aplicación de Django, estarás matando el desempeño. Apache reutiliza procesos entre cada petición, así que una vez que un proceso captura todo el código y librerías de Django, estos se quedan en memoria. Si no usas ese proceso para servir una petición de Django, todo el overhead de memoria se esta desperdiciando.

Así que, configura tus archivos de media para ser servidos por un web Server completamente diferente. Idealmente, este se encontraría físicamente en una máquina diferente corriendo un servidor web de alto desempeño como lighttpd o tux. Si no se puede costear una máquina independiente, al menos las peticiones de los archivos de media debe servirse en un proceso diferente en la misma máquina.

Usa un servidor de base de datos independiente

Si puede ser costeado, instala tu servidor de base de datos en una máquina independiente también. Que Apache y PosgreSQL (o MySQL o cualquier otro) compitan por los recursos del sistema de forma frecuente es una mala idea. Un servidor de base de datos aislado — idealmente, uno con una gran cantidad de RAM y discos rápidos (10k o mayor)— mejorará significativamente el numero de visitas que es posible atender.

Usa PostgreSQL

Probablemente esto provoque tumultos en la comunidad MySQL, pero en mi experiencia personal (en este caso de Jacob Kaplan-Moss) PostgreSQL es mucho mas rápido que MySQL en prácticamente cualquier caso.

No existe “demasiada RAM”

Incluso las memorias RAM más costosas rondan sobre los $200  dólares por gigabyte. Lo cual es mucho mas barato que el costo de horas de programación. Adquiere tanta RAM como puedas, y después, compra un poco más.

Procesadores rápidos realmente no mejoran en gran medida el desempeño; la mayoría de los web servers gastan cerca del 90% de su tiempo en IO. Tan pronto como se inicie el swap, el desempeño caerá. Discos más rápidos mejoran ligeramente la situación, pero son mucho más caros que la RAM.

Si tienes múltiples servidores, el primer lugar para colocar la RAM es en el servidor de base de datos. Si puedes costearlo coloca tanta memoria RAM para que pueda colocarse en ella la base de datos completa.

Posteriormente coloca la RAM en tu web server. La situación ideal es aquella donde no sucedan swaps — nunca. Si es posible llegar a este punto, se podrá soportar cargas de tráfico normal sin sobresaltos.

Apaga KeepAlive

No entiendo como trabaja KeepAlive, pero marcado el parametro como off en nuestros servidores Django (nuevamente, son los servidores de Jacob Kaplan-Moss) el desempeño se incrementa en alrededor de 50%. Por supuesto, no hagas esto si el mismo servidor esta proporcionando acceso a los archivos de media … Pero no estas haciendo esto verdad?

·        Agregado del traductor

El parámetro KeepAlive de Apache (todas las versiones) controla el que una conexión siga abierta después de que un cliente termine una petición. Normalmente, Apache viene con los siguientes valores:

KeepAlive On

KeepAliveTimeout 15

MaxKeepAliveRequest 100

El primer valor debe quedar como (si, así es) Off en el servidor Apache que sirve las peticiones de Django

 

Usa memcached

Aunque Django tiene soporte para multiples backends de cache, ninguno se desempeña tan bien como memcached. Ante la necesidad de cache, hazte un favor y no juegues con los otros backends; ve directamente con memcached.

Optimiza, optimiza, optimiza

Es probable que las opciones por defecto para tu servidor web, motor de base de datos, o la máquina no están optimizados tan bien como podrían estar. Esta lista esta distante de ser completa, pero estos son algunos de los recursos que han hecho a mis cosas (si, las cosas de Jacob Kaplan-Moss) gritar:

·                     Performance Tuning PostgreSQL by Frank Wiles

·                     High Performance MySQL

·                     Power PostgreSQL performance tips.

·                     The annotated postgresql.conf.

·                     The postgresql-performance mailing list.

·                     ONLamp’s Introducing LAMP Tuning Techniques.

·                     Fixing an overloaded web server.

·                     The #apache IRC channel.

Nuevamente, sin ser todos, estos recursos ayudaran a  cualquiera con la necesidad de optimizar un sitio desarrollado con Django.