Mejora la escritura a disco duro de grabaciones de Asterisk usando un ramdisk

Cuando tenemos alguna instalación de VoIP usando Asterisk donde demande grabar todas las conversaciones, y se cuenta con un gran número de llamadas simultáneas, como en un call center, o algo por el estilo, es muy importante usar algún método de escritura que no afecte TANTO el funcionamiento de disco duro.

Es muy común ver instalaciones, donde se utiliza la aplicación de Monitor() de Asterisk para grabar las llamadas de alguna oficina grande, y todo se realiza al mismo disco duro donde se encuentra instalado Linux, Asterisk y otras aplicaciones, esto compromete en gran el buen funcionamiento del disco duro. Imagínense que, además del uso cotidiano del disco duro, le demandemos que escriba 70 archivos de forma simultánea (70 agentes) durante 12 horas (horario común para call center) constantes cada día, definitivamente es una gran demanda física de escritura para el disco duro. A menos que se cuente con una solución “profesional” para realizar las grabaciones, donde en la mayoría de las instalaciones con Asterisk no es así, lo más recomendable es usar algún esquema alterno, como es el RAMDISK, donde la escritura directa de las grabaciones de Asterisk se haga en memoria RAM, ya que por su naturaleza, la velocidad de escritura es muy más rápido que hacerlo directo al disco duro, además que no se afectan partes móviles. Recuerden que la memoria RAM tiene esa ventaja, la escritura rápida.

A continuación les mostraré la forma de realizar la configuración de una RAMDISK en un servidor con CentOS/Redhat 5.x, así como la instalación de unos scripts que nos permitirán mover la información de la RAMDISK al dico duro:

  1. Establecer el tamaño de la RAMDISK a usar

La distribución de CentOS/Redhat ya tiene creadas por default 16 RAMDISK con tamaño fijo, esto lo podemos comprobar ejecutando el comando:

[root@pbx ~]# dmesg | grep RAMDISK
 
RAMDISK driver initialized: 16 RAM disks of 16384K size 4096 blocksize

La estrategia es tener el suficiente espacio en la RAMDISK para guardar aproximadamente 5 minutos de grabaciones, para después, con un script, mover cada 5 minutos las grabaciones al disco duro, de tal manera que le quitemos mucho trabajo al disco duro para la escritura. El tamaño de la RAMDISK depende mucho de la operación de cada solución Asterisk, por lo que deben hacer dichos cálculos. Para éste ejemplo usaremos una RAMDISK de 10 MB. La forma de establecer el tamaño es configurando el GRUB para que asigne el tamaño cada vez que inicie el servidor. Para realizar esto hay que abrir el archivo /etc/grub.conf y añadir al final de la línea del kernel que usamos por default el texto:

ramdisk_size=10000

El tamaño se establece en bloques de 1 KB, por lo que para decirle que necesitamos 10 MB debemos poner 10,000 KB. Recuerden reiniciar el servidor para ver el tamaño disponible.

  1. Formatear y montar la RAMDISK a nuestro sistema de archivos

Cada que se inicie el servidor debemos de formatear y montar nuestro RAMDISK a alguna carpeta de nuestro sistema de archivos. Para este ejemplo usamos la RAMDISK /dev/ram0 y la montamos en /var/spool/asterisk/grabaciones (por lo que debemos de apuntar nuestro plan de marcado en Asterisk para que escriba las grabaciones en dicha carpeta). Para poder realizar esto y facilitarles un poco el trabajo hemos creado un sencillo scirpt en bash para que se ejecute cada que el servidor inicia, por lo que sólo deben crear un archivo llamado ramdisk dentro de la carpeta /etc/init.d y ponerle el siguiente contenido:

#!/bin/bash
#
# $Id: ramdisk,v 1.00 Leon Ramos/Juan Carlos Huerta $
#
# Script para el control de RAMDISK
#
# chkconfig: 2345 89 61
# description: Script para el control de RAMDISKinitdir=/etc/init.d
 
initdir=/etc/init.d
 
test -e $DAEMON || exit 0
 
if [ -r $initdir/functions ]; then
        . $initdir/functions
fi
 
PATH=/sbin:/usr/sbin:/bin:/usr/bin
export PATH
MONTAJE=/var/spool/asterisk/grabaciones
DEVICE=/dev/ram0
prog=ramdisk
 
function start() {
        echo "Starting ramdisk: "
        echo -n $"Formateando ramdisk $DEVICE"
        mkfs.ext2 $DEVICE &> /dev/null
        RETVAL=$?
 
        if [ $RETVAL -eq 0 ] ; then
                success "formateado"
                echo -n $"Montando ramdisk en $MONTAJE"
                mount $DEVICE $MONTAJE &> /dev/null
                RETVAL=$?
                if [ $RETVAL -eq 0 ] ; then
                        success "$prog montada"
                else
                        failure "$prog no montada"
                fi
        else
                failure "$prog no formateada"
        fi
 
        echo
        return $RETVAL
}
 
function stop() {
        echo -n $"Stopping ramdisk: "
        CUENTA=0
        RETVAL=1
        while [ $CUENTA -lt 15 ] ; do
                lsof $DEVICE &> /dev/null
                LIBRE=$?
                if [ $LIBRE -eq 0 ] ; then
                        echo "Intentando $CUENTA de 15..."
                        CUENTA=`expr $CUENTA + 1`
                        sleep 3
                else
                        CUENTA=15
                        RETVAL=0
                fi
        done
 
        if [ $RETVAL -ne 0 ] ; then
                failure "ramdisk shutdown"
                echo "El dispositivo se encuentra ocupado"
        else
                umount $MONTAJE &> /dev/null
                success "ramdisk shutdown"
        fi
        echo
        return $RETVAL
 
}
 
function restart() {
        stop
        start
}
 
function status2() {
        df -h | grep 'ram' &> /dev/null
        RETVAL=$?
        if [ $RETVAL -eq 0 ] ; then
                echo "Filesystem            Size  Used Avail Use% Mounted on"
                df -h | grep 'ram'
        else
                echo "Aparentemente no hay un Ramdisk funcionando"
        fi
        return $RETVAL
}
 
RETVAL=0
 
case "$1" in
        start)
                start
                ;;
        stop)
                stop
                ;;
        status)
                status2
                ;;
        restart)
                restart
                ;;
        *)
                echo $"Usage: $0 {start|stop|status|restart}"
                exit 1;
                ;;
esac
 
exit $?

Ahora tenemos que crear la carpeta donde recidirán al final las grabaciones en nuestro disco duro, para este ejemplo usamos una carpeta llamada almacenGrabaciones:

]# mkdir /var/spool/asterisk/grabaciones

Y finalmente hacemos que nuestro script sea ejecutable cada que arranquemos el servidor:

]# chkconfig ramdisk on
  1. Script de monitoreo de RAMDISK para mover archivos a disco duro

Para éste ejemplo pondremos nuestro script en la carpeta /opt y lo nombraremos ramdisk-watcher.sh:

#!/bin/sh
#
# RAMDISK Watcher
#
# Revisa el contenido del RAMDISK y lo pasa a disco duro
#
# Fecha de creacion: 2009-06-29
# Autores: Leon Ramos y Juan Carlos Huerta
 
## Variables
RMDIR="/var/spool/asterisk/grabaciones"
ALMACEN="/var/spool/asterisk/almacenGrabaciones"
 
for i in $(ls -1a $RMDIR | grep gsm | egrep -v '\-in\.gsm$' | egrep -v '\-out\.gsm$' ) ; do
        lsof $RMDIR/$i &> /dev/null
        valor=$?
        if [ $valor -ne 0 ] ; then
                mv $RMDIR/$i $ALMACEN
        fi
done

En éste caso estamos grabando en formato gsm, y lo que hace el script es mover cada uno de los archivos que ya se encuentren mezclados, con extensión gsm y que no estén abiertos por el sistema, de la carpeta donde tenemos montado nuestra RAMDISK a la carpeta final de nuestro disco duro.

Después hay que darle permiso de ejecución:

]# chmod o+x /opt/ramdisk-watcher.sh

Y posteriormente modificar nuestro crontab para que cada 5 minutos haga la revisión de nuestra RAMDISK:

]# vim /etc/crontab
*/5 * * * * root /opt/ramdisk-watcher.sh > /dev/null 2&>1

Y listo!, configurando nuestro plan de marcado para que deposite las grabaciones en nuestra RAMDISK le quitaremos mucho trabajo a nuestro disco duro y mejoraremos el performance. Es importante monitorear el espacio libre de nuestra RAMDISK al principio por si es necesario ajustar el tamaño.


You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

AddThis Social Bookmark Button

One Response to “Mejora la escritura a disco duro de grabaciones de Asterisk usando un ramdisk”

Leave a Reply

You must be logged in to post a comment.