Tags:
create new tag
, view all tags

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! 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

Topic revision: r4 - 2009-06-22 - VincentMeslard
 
This site is powered by the TWiki collaboration platform Powered by PerlCopyright © 2008-2024 by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki? Send feedback