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:
- 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.
- 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
- 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.
julio 25th, 2010 at 6:51 am
http://auto-lubiteli.ru/chto-dumaete-avtomobile-vaz-2114-stoit-brat-t8-810.html...
…