Servir páginas cacheadas de WordPress 30 veces más rápido con TMPFS

Autor: Armonth | El miércoles 31 de marzo del 2010 @ 09:00.

Desde hace medio año o así tengo como tema pendiente de tratar el uso de TMPFS para servir páginas web. Bien, ahora puedo decir me han quitado trabajo de encima ;P

AskApache ha publicado 30x Faster WP-Super Cache and Site Speed with TMPFS una entrada que relata de forma extensa --aunque un poco pesado para mi gusto, todo sea dicho-- el asunto. Por ejemplo la sección "Hosting Company Tricks" es la típica explicación de overselling (aunque me pareció gracioso lo de usar una Xbox como servidor de hosting... y meter 100 clientes ahí xD). Voy a ofrecer un resumen.

Nota: esto lo podéis hacer en un servidor dedicado, particular, virtual o VPS. Muchos servidores compartidos no permiten editar ficheros fuera del $HOME. Asumo unos conocimientos mínimos de GNU/Linux y de Unix en general, cualquier duda preguntar.

¿Qué es TMPFS?

TMPFS es un sistema de ficheros disponible normalmente en sistemas unix-like que se monta en memoria volátil: normalmente RAM. Funciona a modo de "disco RAM". Lo que escribes ahí se escribe en RAM, al desmontar TMPFS los datos se perderán.

TMPFS es un ramdisk que se puede expandir/contraer dinámicamente y que no usará prácticamente memoria si no contiene almacenados ficheros en él.

Todo lo que está almacenado en TMPFS es temporal en el sentido de que los ficheros creados en él no se crearán en el disco duro. Si una instancia de TMPFS es desmontada, todo lo almacenado en ella se perderá.

TMPFS mete todo dentro de las caches internas del kernel, crece o encoge para acomodarse a los ficheros que contiene y es capaz de enviar a la partición SWAP páginas no necesarias. El límite o tamaño máximo permitido se puede ajustar al vuelo mediante mount -o remount.

Si lo comparas con RAMFS (el cual fue usado como plantilla para crear tmpfs) ganas la capacidad de swapping y de comprobar límites. Otra cosa similar es el RAM disk (/dev/ram*) el cual simula un disco duro de tamaño fijo en la RAM física donde debes crear un sistema de ficheros ordinario. Los ramdisks no pueden hacer swap y no tienes la posibilidad de redimensionarlos.

Dado que tmpfs "vive" completamente en las páginas cache y en el swap, todas las páginas tmpfs actualmente en memoria aparecerán como cacheadas. No aparecerán como compartidas (shared) o algo similar. Puedes comprobar el actual uso de RAM+swap de una instancia tmpfs usando df y du.

¿Qué ventaja tiene?

La ventaja del hardware: acceder a un dato en RAM puede ser, perfectamente, 30 veces más rápido que acceder al mismo dato en un disco duro convencional. De ahí que se pueda servir páginas 30 veces más rápido.

Usando TMPFS para cachear

El método a mostrar es el de crear un sistema de ficheros para almacenar en él todas las páginas cacheadas por WordPress (en el artículo original habla de WP-Super Cache, pero funcionaría tranquilamente WP-Cache 2.0 o cualquier página estática que quisieramos servir). Los pasos a seguir son:

  1. Crear un sistema de ficheros TMPFS y montarlo en /wp-content/cache/
  2. Restaurar los ficheros cacheados con los reinicios.
  3. Mantener una copia semi-actual de los ficheros TMPFS en el disco.

Paso 1

Editamos /etc/fstab/ y añadimos el sistema de ficheros:

tmpfs /home/askapache/wp-content/cache tmpfs defaults,size=2g,noexec,nosuid,uid=648,gid=648,mode=1755 0 0

Aseguraos de cambiar /home/askapache/ por la dirección de vuestro blog (ie: /home/tuusuario/tudominio/wp-content/cache o lo que sea).

Paso 2

Añadimos una línea al /etc/rc.local que se ejecutará siempre al iniciar el sistema:

ionice -c3 -n7 nice -n 19 rsync -ahv --stats --delete /_b/tmpfs/cache/ /home/askapache/wp-content/cache/ 1>/dev/null

Paso 3

Añadimos una entrada de trabajo al cronjob (comando: crontab -e):

*/5 * * * * /usr/bin/ionice -c3 -n7 /bin/nice -n 19 /usr/bin/rsync -ah --stats --delete /home/askapache/wp-content/cache/ /_b/tmpfs/cache/ 1>/dev/null

Finalizando

La idea inicial ya se ve, crear un sistema de ficheros para datos "temporales" (caches, etcétera). Recomiendo la lectura del original para una visión más global ya que da ejemplos de otros ficheros que se pueden meter en un TMPFS como /var, /tmp, etcétera y también explicación de los párametros de montaje del tmpfs, bind mounts, etcétera.

Comentarios