Tests de performances de quelques Systèmes de Fichiers
Introduction
Les comparatifs de performance de Systèmes de Gestion de Fichiers que l'on trouve sur Internet sont peu nombreux, anciens pour la plupart, souvent imprécis sur les conditions des tests et répondent à des problématiques qui ne sont pas les notres.
Nous avons donc mis en place une batterie de tests qui répond à nos besoins, c'est-à-dire :
- Nécessité de la journalisation.
- Stabilité et fiabilité -> FS éprouvés.
- Taille des fichiers très hétérogène.
- Arborescence peu profonde.
Nous avons donc retenu
ext3,
xfs et
reiserfs. Sur lesquels nous avons effectué les tests suivants :
- copie depuis un autre disque,
- copie dans un répertoire différent,
- parcours de l'arborescence,
- suppression des fichiers.
Les jeux de test sont :
- un répertoire contenant 3 fichiers de 4Go,
- un répertoire contenant 48 sous-répertoires ayant chacun 64 fichiers de 4Mo,
- un répertoire contenant 128 sous-répertoires ayant chacun 1024 fichiers de 16Ko.
Les indices de performance retenus pour chaque opération sont :
- le temps total,
- le temps utilisateur et le temps système,
- le taux d'utilisation du processeur.
Nous avons donc écrit trois scripts
bash : un premier pour la génération des jeux de test, un deuxième pour les tests à proprement parler et un dernier pour l'analyse et la synthèse des résultats.
Génération des jeux de test
Le fichier
gen.sh
#!/bin/bash
# Genere les arborescences de test
ROOT=`pwd`
##########
# Test 1 #
############################################################
# 3 fichiers de 4Go. #
############################################################
TEST=$ROOT/test1
mkdir $TEST
for (( i=1 ; i<=3 ; i=$i+1 )) ; do
dd if=/dev/urandom of=$TEST/fichier$i bs=1K count=4M 2> /dev/null
done
##########
# Test 2 #
############################################################
# 48 répertoires de 64 fichiers de 4Mo. #
############################################################
TEST=$ROOT/test2
mkdir $TEST
for (( i=1 ; i<=48 ; i=$i+1 )) ; do
DIR=$TEST/dir$i
echo "mkdir $DIR"
mkdir $DIR
for (( j=1 ; j<=64 ; j=$j+1 )) ; do
dd if=/dev/urandom of=$DIR/fichier$j bs=1K count=4K 2> /dev/null
done
done
##########
# Test 3 #
############################################################
# 128 répertoires de 1024 fichiers de 16Ko. #
############################################################
TEST=$ROOT/test3
mkdir $TEST
for (( i=1 ; i<=128 ; i=$i+1 )) ; do
DIR=$TEST/dir$i
echo "mkdir $DIR"
mkdir $DIR
for (( j=1 ; j<=1024 ; j=$j+1 )) ; do
dd if=/dev/urandom of=$DIR/fichier$j bs=1K count=16 2> /dev/null
done
done
Les tests
Le script suivant effectue une passe de chaque test, il est donc nécessaire de faire tourner ce script autant de fois que l'on souhaite afin d'avoir des résultats exploitables.
Le fichier
test.sh
#!/bin/bash
# Effectue les tests
ROOT=`pwd`
# paramètres
DEV=/dev/sdb3
MNT=/media/test
FS="ext3 xfs reiserfs"
TESTS="test1 test2 test3"
for t in $TESTS ; do
echo "****************"
echo "* TEST : $t *"
echo "****************"
for fs in $FS ; do
echo -e "\n *** $fs ***\n"
echo -ne "[$t] Création du système de fichier $fs..."
if [ "$fs" = "ext3" ] ; then
/usr/bin/time -a -o $ROOT/bench.$fs.txt -f "%C :\t%e real, %U user, %S sys, %P cpu" mkfs.ext3 $DEV > /dev/null
else
/usr/bin/time -a -o $ROOT/bench.$fs.txt -f "%C :\t%e real, %U user, %S sys, %P cpu" mkfs -t $fs -f $DEV > /dev/null
fi
echo -ne "OK\n"
echo -ne "[$t] Montage du système de fichier $fs..."
/usr/bin/time -a -o $ROOT/bench.$fs.txt -f "%C :\t%e real, %U user, %S sys, %P cpu" mount $DEV $MNT -t $fs > /dev/null
echo -ne "OK\n"
echo -ne "[$t] Copie vers $MNT..."
/usr/bin/time -a -o $ROOT/bench.$fs.txt -f "%C :\t%e real, %U user, %S sys, %P cpu" cp -r $ROOT/$t $MNT > /dev/null
echo -ne "OK\n"
mkdir $MNT/new
echo -ne "[$t] Copie de $MNT vers $MNT/new..."
/usr/bin/time -a -o $ROOT/bench.$fs.txt -f "%C :\t%e real, %U user, %S sys, %P cpu" cp -r $MNT/$t $MNT/new/$t > /dev/null
echo -ne "OK"
echo -ne "[$t] Parcours des données..."
/usr/bin/time -a -o $ROOT/bench.$fs.txt -f "%C :\t%e real, %U user, %S sys, %P cpu" du -sh $MNT/* > /dev/null
echo -ne "OK\n"
echo -ne "[$t] Suppression des données..."
/usr/bin/time -a -o $ROOT/bench.$fs.txt -f "%C :\t%e real, %U user, %S sys, %P cpu" rm -rf $MNT/* > /dev/null
echo -ne "OK\n"
echo -ne "[$t] Démontage du système de fichier $fs..."
/usr/bin/time -a -o $ROOT/bench.$fs.txt -f "%C :\t%e real, %U user, %S sys, %P cpu" umount $DEV
echo -ne "OK\n"
done
done
Analyse et synthèse des résultats
![ALERT! ALERT!](/twiki/pub/TWiki/TWikiDocGraphics/warning.gif)
Pour le moment, calcule seulement la moyenne des résultats obtenus pour chaque opération et chaque systême de fichiers.
Le fichier
analyse.sh
#!/bin/bash
# analyse les résultats
ROOT=`pwd`
RES=$(/bin/ls bench.*.txt)
oldIFS=$IFS
IFS=$'\n'
i=1
tot_real=0
tot_user=0
tot_sys=0
tot_cpu=0
for t in $RES ; do
echo -ne "\n=> RES : $t\n"
l1=""
for l in $(cat $t | sort | grep -v non-zero) ; do
if [ ! "$l1" = "$(echo $l | cut -d':' -f1)" ] ; then
if [ -n "$l1" ] ; then
tot_real=$(echo "scale=2;$tot_real/$i" | bc)
tot_user=$(echo "scale=2;$tot_user/$i" | bc)
tot_sys=$(echo "scale=2;$tot_sys/$i" | bc)
tot_cpu=$(echo "scale=2;$tot_cpu/$i" | bc)
echo "==> $tot_real real, $tot_user user, $tot_sys sys, $tot_cpu cpu"
fi
l1=$(echo $l | cut -d':' -f1)
echo $l1
i=1
tot_real=0
tot_user=0
tot_sys=0
tot_cpu=0
else
i=$(( i + 1 ))
fi
tmp_l=$(echo $l | cut -d':' -f2 | tr -d '\t')
tmp=$(echo $tmp_l | cut -d' ' -f1)
tot_real=$(echo "$tot_real + $tmp" | bc)
tmp=$(echo $tmp_l | cut -d' ' -f3)
tot_user=$(echo "$tot_user + $tmp" | bc)
tmp=$(echo $tmp_l | cut -d' ' -f5)
tot_sys=$(echo "$tot_sys + $tmp" | bc)
tmp=$(echo $tmp_l | cut -d' ' -f7 | sed "s/\%//")
tot_cpu=$(echo "$tot_cpu + $tmp" | bc)
done
tot_real=$(echo "scale=2;$tot_real/$i" | bc)
tot_user=$(echo "scale=2;$tot_user/$i" | bc)
tot_sys=$(echo "scale=2;$tot_sys/$i" | bc)
tot_cpu=$(echo "scale=2;$tot_cpu/$i" | bc)
echo "==> $tot_real real, $tot_user user, $tot_sys sys, $tot_cpu cpu"
done
IFS=$oldIFS
Résultats obtenus (synthèse)
Pour voir les résultats en entier, c'est
ici.
=> RES : bench.ext3.txt
cp -r /media/test/test1 /media/test/new/test1
==> 624.69 real, .56 user, 63.54 sys, 9.71 cpu
cp -r /media/test/test2 /media/test/new/test2
==> 662.29 real, .54 user, 62.73 sys, 9.28 cpu
cp -r /media/test/test3 /media/test/new/test3
==> 805.84 real, .81 user, 25.64 sys, 3.00 cpu
cp -r /var/local/test/test1 /media/test
==> 257.25 real, .52 user, 66.24 sys, 25.42 cpu
cp -r /var/local/test/test2 /media/test
==> 331.44 real, .59 user, 60.83 sys, 18.00 cpu
cp -r /var/local/test/test3 /media/test
==> 772.43 real, .83 user, 25.53 sys, 3.00 cpu
du -sh /media/test/lost+found /media/test/new /media/test/test1
==> .06 real, 0 user, 0 sys, 7.28 cpu
du -sh /media/test/lost+found /media/test/new /media/test/test2
==> 2.09 real, 0 user, .07 sys, 3.71 cpu
du -sh /media/test/lost+found /media/test/new /media/test/test3
==> 16.79 real, .19 user, 3.08 sys, 19.57 cpu
mkfs.ext3 /dev/sdb3
==> 63.35 real, .12 user, 11.01 sys, 17.00 cpu
mount /dev/sdb3 /media/test -t ext3
==> .14 real, 0 user, 0 sys, 3.28 cpu
rm -rf /media/test/lost+found /media/test/new /media/test/test1
==> 41.30 real, 0 user, 2.03 sys, 4.57 cpu
rm -rf /media/test/lost+found /media/test/new /media/test/test2
==> 41.89 real, 0 user, 2.33 sys, 5.14 cpu
rm -rf /media/test/lost+found /media/test/new /media/test/test3
==> 7.68 real, .12 user, 6.50 sys, 85.57 cpu
umount /dev/sdb3
==> 1.04 real, 0 user, .03 sys, 3.33 cpu
=> RES : bench.reiserfs.txt
cp -r /media/test/test1 /media/test/new/test1
==> 595.66 real, 1.18 user, 78.78 sys, 13.00 cpu
cp -r /media/test/test2 /media/test/new/test2
==> 728.50 real, 1.19 user, 76.17 sys, 10.00 cpu
cp -r /media/test/test3 /media/test/new/test3
==> 646.94 real, 1.15 user, 33.19 sys, 5.00 cpu
cp -r /var/local/test/test1 /media/test
==> 250.05 real, 1.08 user, 74.47 sys, 29.85 cpu
cp -r /var/local/test/test2 /media/test
==> 334.74 real, 1.16 user, 68.90 sys, 20.28 cpu
cp -r /var/local/test/test3 /media/test
==> 782.04 real, 1.12 user, 33.23 sys, 4.00 cpu
du -sh /media/test/new /media/test/test1
==> .03 real, 0 user, 0 sys, 4.71 cpu
du -sh /media/test/new /media/test/test2
==> 3.18 real, 0 user, .08 sys, 2.14 cpu
du -sh /media/test/new /media/test/test3
==> 7.02 real, .24 user, 3.03 sys, 46.28 cpu
mkfs -t reiserfs -f /dev/sdb3
==> 11.03 real, .03 user, .27 sys, 2.19 cpu
mount /dev/sdb3 /media/test -t reiserfs
==> .63 real, 0 user, .04 sys, 6.14 cpu
rm -rf /media/test/new /media/test/test1
==> 12.23 real, 0 user, 9.03 sys, 73.42 cpu
rm -rf /media/test/new /media/test/test2
==> 12.83 real, 0 user, 9.51 sys, 73.85 cpu
rm -rf /media/test/new /media/test/test3
==> 22.37 real, .16 user, 19.72 sys, 88.42 cpu
umount /dev/sdb3
==> .56 real, 0 user, .03 sys, 11.90 cpu
=> RES : bench.xfs.txt
cp -r /media/test/test1 /media/test/new/test1
==> 492.04 real, .51 user, 40.57 sys, 7.85 cpu
cp -r /media/test/test2 /media/test/new/test2
==> 605.28 real, .61 user, 40.40 sys, 6.00 cpu
cp -r /media/test/test3 /media/test/new/test3
==> 1426.44 real, 1.27 user, 30.76 sys, 2.00 cpu
cp -r /var/local/test/test1 /media/test
==> 247.76 real, .53 user, 39.22 sys, 15.42 cpu
cp -r /var/local/test/test2 /media/test
==> 331.53 real, .56 user, 37.92 sys, 11.00 cpu
cp -r /var/local/test/test3 /media/test
==> 942.50 real, 1.30 user, 31.02 sys, 3.00 cpu
du -sh /media/test/new /media/test/test1
==> .03 real, 0 user, 0 sys, 18.85 cpu
du -sh /media/test/new /media/test/test2
==> 2.16 real, 0 user, .09 sys, 4.00 cpu
du -sh /media/test/new /media/test/test3
==> 12.66 real, .33 user, 4.89 sys, 40.85 cpu
mkfs -t xfs -f /dev/sdb3
==> 2.79 real, 0 user, .06 sys, 2.04 cpu
mount /dev/sdb3 /media/test -t xfs
==> .93 real, 0 user, 0 sys, .33 cpu
rm -rf /media/test/new /media/test/test1
==> .22 real, 0 user, .16 sys, 71.14 cpu
rm -rf /media/test/new /media/test/test2
==> 8.76 real, .01 user, .51 sys, 5.42 cpu
rm -rf /media/test/new /media/test/test3
==> 872.82 real, .22 user, 19.23 sys, 2.00 cpu
umount /dev/sdb3
==> 9.36 real, 0 user, .02 sys, 1.23 cpu
TODO : Interprétation des résultats