Acelerando pequeñas bases de datos en Linux

ArticleCategory: [Choose a category for your article]

Applications

AuthorImage:[Here we need a little image form you]

[Foto del autor]

TranslationInfo:[Author and translation history]

original in en Mark Nielsen 

en to es:David Abilleira Freijeiro

AboutTheAuthor:[A small biography about the author]

El autor trabaja en The Computer Underground, Inc. como experto en Linux y se divierte haciendo tonterias y proyectos tontos, porque, ¡vaya!, los ordenadores SE SUPONE que son divertidos. Mark también trabaja en ZING, www.genericbooks.com como voluntario para ayudar y promover el software y las publicaciones libres y abiertas.

Abstract:[Here you write a little summary]

Este artículo muestra como acelerar un servidor de bases de datos PostgreSQL usando un disco ram (RAMDISK).

ArticleIllustration:[This is the title picture for your article]

[Ilustración]

ArticleBody:[The article body]

Introducción

Ok, ¿qué es un disco ram y como lo podemos usar para acelerar un servidor de bases de datos como PostgreSQL?

Un ramdisk es básicamente memoria que pretendes usar como si fuera una unidad de disco duro. En cualquier momento que usas un ramdisk, básicamente estás usando tu memoria y no tu disco duro. Hay ventajas y desventajas de esta aproximación. Fundamentalmente, la gran ventaja es que dado que estás usando memoria, cualquier cosa que estés haciendo será mucho más rápida dado que el disco duro es más lento que la memoria. La gran desventaja es que si haces cambios en el servidor de bases de datos y reinicias el ordenador, perderás todos los cambios.

En el caso del servidor de bases de datos PostgreSQL, podrás aumentar la velocidad si colocas todas las bases de datos en memoria.

Preparando un ramdisk para /Test

Para preparar uno de tus ramdisks por defecto en el directorio /Test, haz lo siguiente:

mkdir -p /Test
mkfs -t ext2 /dev/ram0
mount /dev/ram0 /Test
Para cambiar el tamaño del ramdisk a 50MB, haz lo siguiente:
  1. Decide como de grande quieres que sea el disco ram, en este caso usaremos 50MB
  2. Ahora, edita el fichero /etc/lilo.conf y ejecuta el comando "lilo". Lilo es un programa que le dice al ordenador como debe arrancar cuando lo enciendes y además modifica algunos parámetros del arranque de Linux. Añade "ramdisk=50000" como yo hice en este fichero:
    boot=/dev/hda
    map=/boot/map
    install=/boot/boot.b
    prompt
    timeout=50
    image=/boot/vmlinuz-2.2.5-15
            label=linux
            root=/dev/hda2
            read-only
            ramdisk=50000		
    		
  3. Ahora ejecuta el comando "lilo" y reinicia el ordenador Después de reiniciar el ordenador ejecuta los 3 comandos siguientes:
    mkdir -p /Test
    mkfs -t ext2 /dev/ram0
    mount /dev/ram0 /Test
    

    Si hubieses añadido esas 3 lineas al fichero /etc/rc.d/rc.local, se ejecutarían cada vez que arrancases el ordenador.

Configurando un ramdisk para PostgreSQL

Idealmente, tendrías dos servidores de bases de datos. Uno al cual le podrías hacer cambios, y otro que es una copia que existe en tu ramdisk. Para hacerlo, usarías comandos como "pg_dump" o "pg_dumpall".

NOTE: Aquí asumiremos que tu has fijado la opción "ramdisk" en el lilo.conf a un tamaño mallor del que tiene tu servidor de bases de datos. Si necesitas averiguar el tamaño aproximado, ejecuta este comando "cd /var/lib/pgsql; du ".

De todas maneras, para coger tu servidor postgresql instalado en "/var/lib/pgsql" y ponerlo en memoria, haz lo siguiente:

        ### Detener el servidor postgres real
/etc/rc.d/init.d/postgres stop
        ### Renombrar el directorio real
mv /var/lib/pgsql /var/lib/pgsql_main
        #### Crear un directorio para tener ahí nuestro disco ram
mkdir -p /var/lib/pgsql_memory
 	#### Cambiar el propietario del nuevo directorio a posgres o cualquiera
	#### que sea el dueño real. 
chown postgres /var/lib/pgsql_memory
	#### Crear un alias o un enlace al nombre original, /var/lib/pgsql
ln -s /var/lib/pgsql_memory /var/lib/pgsql

	#### Formatea el ramdisk
mkfs -t ext2 /dev/ram0
	#### Monta el ramdisk en el directorio postgresql
mount /dev/ram0 /var/lib/pgsql_memory

	#### Copia todo del directorio principal al ramdisk
tar -C /var/lib/pgsql_main -cp . | tar -C /var/lib/pgsql_memory -xp
        ### Arranca el servidor postgresql actual
/etc/rc.d/init.d/postgres start


Comentarios acerca de la velocidad

He estado probando para comprobar la velocidad de ejecución con y sin poner postgresql en un ramdisk. Algunas veces la velocidad de ejecución se incrementó un 50% al estar postgresql en un ramdisk, y otras veces no lo hizo.

Lo que se puede notar es que cuando los datos son "cacheados" por el sistema, la ganancia en velocidad no es muy elevada, cerca del 10% o el 20%. Cuando se introducen muchos datos unicos dentro de la base de datos, la velocidad crece drasticamente.

La mayor ventaja del truco del ramdisk es que obligas a la base de datos a permanecer en memoria y evitas usar el disco duro. Si no usas un ramdisk, tu base de datos probablemente a la larga sea "swapeada" fuera de la cache, y entonces cuando vuelva a ser usada, tendrá que ser recargada desde el disco duro.

Comentarios

  1. En el caso del sistema operativo Linux, aparentemente una vez un fichero se lee, se conserva en memoria hasta que ese espacio de memoria tiene que ser usado para alguna otra cosa. Dicho de otra forma, lo cachea. Bien, esta puede ser una solución, excepto por la experiencia práctica, cuando mi servidor de bases de datos recibe un acceso, yo siempre oigo moverse el disco duro. Usar un disco ram fuerza al servidor de bases de datos a residir en memoria, haciendolo de manera que no sea "swapeado" fuera de ella. Si usas mucho tu servidor de bases de datos, yo lo forzaría a permanecer en memoria.
  2. La ventaja de usar un disco ram para tu base de datos es velocidad, llana y claramente. Para bases de datos de solo lectura, esto es fantástico de verdad.
  3. La desventaja es que tienes que saber como mantenerlo y que si haces cambios, harías bien en asegurarte de salvaguardar los cambios hechos.

Referencias

  1. Como usar un Ramdisk en Linux por Mark Nielsen
  2. Homepage de PostgreSQL