Hay ocasiones en las que necesitamos conocer de forma rápida el rendimiento que puede sacar un directorio importado por NFS o queremos comparar dos servidores NFS.
En este artículo publico un script basado en dd que escribe ficheros de un tamañao aleatorio y guarda los resultados de velocidad en un fichero que mas tarde representaremos mediante gnuplot.
Lo que haremos será generar 10k ficheros con tamaños comprendidos entre 1-4Mb, conociendo los bytes enviados en cierto tiempo podremos calcular la velocidad de transferencia y con los datos obtenidos generar gráficas.
El script en cuestión es el siguiente:
#! /bin/bash
clear
echo -e " "
echo -e "---------------------------------------------------------------"
echo -e "| Script NFS test, generates random sized files between 1-4Mb |"
echo -e "---------------------------------------------------------------"
echo -e " "
echo -e "-- Introduzca la ruta del directorio compartido por NFS:"
read RUTA
echo -e " "
echo -e "-- Introduzca nombre identificativo del servidor NFS:"
read NAME
echo -e " "
echo -e "-- Creando directorio de prueba"
rm -rf $RUTA/nfs_test 2>/dev/null
mkdir $RUTA/nfs_test 2>/dev/null
i=0
> /tmp/nfs_$NAME'.dat'
while [ $i -lt 10000 ]
do
#echo -e "i: $i"
RAND=$[RANDOM%4+1]
echo -e " "
echo -e "++ Generando fichero $i con tamanyo $RAND"
WBYTES_SECONDS=$(dd if=/dev/zero of=$RUTA/nfs_test/$i bs=1M count=$RAND 2>&1|grep bytes|awk -F " " '{print$1":"$6}')
#echo -e "WBYTES_SECONDS: $WBYTES_SECONDS"
WBYTES=$(echo $WBYTES_SECONDS|awk -F ":" '{print$1}')
#echo -e "WBYTES: $WBYTES"
WSEC=$(echo $WBYTES_SECONDS|awk -F ":" '{print$2}')
#echo -e "WSECONDS: $WSEC"
WMBps=$(echo "scale=10;$WBYTES/$WSEC/1024/1024" | bc)
echo -e "++ Leyendo fichero $i"
RBYTES_SECONDS=$(dd if=$RUTA/nfs_test/$i of=/dev/zero 2>&1|grep bytes|awk -F " " '{print$1":"$6}')
#echo -e "RBYTES_SECONDS: $RBYTES_SECONDS"
RBYTES=$(echo $RBYTES_SECONDS|awk -F ":" '{print$1}')
#echo -e "RBYTES: $RBYTES"
RSEC=$(echo $RBYTES_SECONDS|awk -F ":" '{print$2}')
#echo -e "RSECONDS: $RSEC"
RMBps=$(echo "scale=10;$RBYTES/$RSEC/1024/1024" | bc)
echo -e "$RMBps $WMBps" >> /tmp/nfs_$NAME'.dat'
echo -e "-- R-Speed: $RMBps MB/s"
echo -e "-- W-Speed: $WMBps MB/s"
echo -e "++ Borrando fichero"
rm $RUTA/nfs_test/$i
i=$(( $i + 1 ))
done
echo -e "-- Eliminando directorio de prueba"
rm -rf $RUTA/nfs_test 2>/dev/null
Si queremos comparar dos servidores NFS podemos plotear la salida de los ficheros para ver la diferencia de forma gráfica:
sci-visualization/gnuplot X cairo gd qt4 readline wxwidgets -aqua bitmap -doc -examples -ggi -latex -lua plotutils svga -thin-splines
emerge -av sci-visualization/gnuplot
gnuplot
gnuplot> set terminal png
gnuplot> set output “nfs_read.png”
gnuplot> plot “nfs_server1.dat” using 1 w lines title ‘R NFS1 MB/s’, “nfs_server2.dat” using 1 w lines title ‘R NFS2 MB/s’
gnuplot> set terminal png
gnuplot> set output “nfs_write.png”
gnuplot> plot “nfs_server1.dat” using 2 w lines title ‘W NFS1 MB/s’, “nfs_server2.dat” using 2 w lines title ‘W NFS2 MB/s’
gnuplot> set terminal png
gnuplot> set output “nfs1.png”
gnuplot> plot “nfs_server1.dat” using 1 w lines title ‘R NFS1 MB/s’, “nfs_server1.dat” using 2 w lines title ‘W NFS1 MB/s’
gnuplot> set terminal png
gnuplot> set output “nfs2.png”
gnuplot> plot “nfs_server2.dat” using 1 w lines title ‘R NFS2 MB/s’, “nfs_server2.dat” using 2 w lines title ‘W NFS2 MB/s’
Con estas gráficas podremos ver el rendimiento tanto de lectura como escritura para un servidor en concreto y comparar tanto lecturas como escrituras en los dos servidores, algunas de las gráficas generadas son como esta: