#!/bin/bash set -e # Valeurs par défaut FILESIZE="1G" FILECOUNT=1000 FILEMODE="fixed" LINES=1 function show_help { echo "Usage: $0 [OPTIONS]" echo "" echo "Options disponibles :" echo " --size=SIZE Taille du fichier dd (ex: 1G, 500M). Défaut: 1G" echo " --count=N Nombre de petits fichiers. Défaut: 1000" echo " --mode=MODE Mode de génération : fixed ou random. Défaut: fixed" echo " --lines=N Nombre de lignes pour les fichiers en mode fixed. Défaut: 1" echo " --help Affiche ce message d'aide" echo "" echo "Exemples:" echo "# Benchmark basique" echo "./benchmark_disque.sh" echo "" echo "# Test avec un fichier de 2G et 5000 petits fichiers aléatoires" echo "./benchmark_disque.sh --size=2G --count=5000 --mode=random" echo "" echo "# Test avec fichiers de 10 lignes" echo "./benchmark_disque.sh --mode=fixed --lines=10" exit 0 } # Parsing des arguments for arg in "$@"; do case $arg in --size=*) FILESIZE="${arg#*=}" ;; --count=*) FILECOUNT="${arg#*=}" ;; --mode=*) FILEMODE="${arg#*=}" ;; --lines=*) LINES="${arg#*=}" ;; --help) show_help ;; *) echo "Argument inconnu : $arg" show_help ;; esac done # Répertoires BENCHDIR="./testbench" TESTFILE="$BENCHDIR/dd_testfile" SMALLDIR="$BENCHDIR/smallfiles" mkdir -p "$SMALLDIR" echo "=== Test d'écriture séquentielle avec dd ($FILESIZE, sync forcée) ===" WRITE_TIME_SEC=$( (time dd if=/dev/zero of="$TESTFILE" bs="$FILESIZE" count=1 conv=fdatasync status=none) 2>&1 | grep real | awk '{print $2}' | sed 's/m/:/;s/s//') WRITE_SEC=$(echo "$WRITE_TIME_SEC" | awk -F: '{ print ($1 * 60) + $2 }') echo "Durée : $WRITE_TIME_SEC (~$(awk -v size="$FILESIZE" -v sec="$WRITE_SEC" 'BEGIN { gsub(/[A-Za-z]/, "", size) if (index(tolower(ARGV[1]), "g")) mult=1024; else mult=1; printf "%.2f", (size * mult) / sec }') MB/s)" echo -e "\\n=== Test de lecture séquentielle ===" READ_TIME_SEC=$( (time dd if="$TESTFILE" of=/dev/null bs="$FILESIZE" status=none) 2>&1 | grep real | awk '{print $2}' | sed 's/m/:/;s/s//') READ_SEC=$(echo "$READ_TIME_SEC" | awk -F: '{ print ($1 * 60) + $2 }') echo "Durée : $READ_TIME_SEC (~$(awk -v size="$FILESIZE" -v sec="$READ_SEC" 'BEGIN { gsub(/[A-Za-z]/, "", size) if (index(tolower(ARGV[1]), "g")) mult=1024; else mult=1; printf "%.2f", (size * mult) / sec }') MB/s)" echo -e "\\n=== Test IOPS sur $FILECOUNT fichiers ($FILEMODE) ===" echo -n "Création : " CREATE_TIME_SEC=$( (time for i in $(seq 1 "$FILECOUNT"); do if [[ "$FILEMODE" == "random" ]]; then head -c $((RANDOM % 4096 + 128)) /dev/urandom > "$SMALLDIR/file_$i" else yes "Ligne test $i" | head -n "$LINES" > "$SMALLDIR/file_$i" fi done) 2>&1 | grep real | awk '{print $2}' | sed 's/m/:/;s/s//') CREATE_SEC=$(echo "$CREATE_TIME_SEC" | awk -F: '{ print ($1 * 60) + $2 }') CREATE_IOPS=$(awk -v total="$FILECOUNT" -v sec="$CREATE_SEC" 'BEGIN { printf "%.1f", total / sec }') echo "$CREATE_TIME_SEC (~$CREATE_IOPS IOPS)" echo -n "Lecture : " READ_SMALL_SEC=$( (time for i in $(seq 1 "$FILECOUNT"); do cat "$SMALLDIR/file_$i" > /dev/null done) 2>&1 | grep real | awk '{print $2}' | sed 's/m/:/;s/s//') READ_SMALL_IOPS=$(awk -v total="$FILECOUNT" -v sec="$(echo $READ_SMALL_SEC | awk -F: '{ print ($1 * 60) + $2 }')" 'BEGIN { printf "%.1f", total / sec }') echo "$READ_SMALL_SEC (~$READ_SMALL_IOPS IOPS)" echo -e "\\nNettoyage..." rm -rf "$BENCHDIR" echo -e "\\nBenchmark terminé."