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:
- 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:
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.
- 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:
- 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.
