ProxMox-Scripts/disk-test.sh
2024-11-23 19:39:53 +01:00

160 lines
No EOL
5.4 KiB
Bash

#!/bin/bash
# Standaardduur in seconden (bijvoorbeeld 60 seconden)
DEFAULT_DURATION=60
DURATION=$DEFAULT_DURATION
# Aantal runs
DEFAULT_REPEATS=5
REPEATS=$DEFAULT_REPEATS
# Standaard slaaptijd tussen runs
DEFAULT_SLEEPTIME=60
SLEEPTIME=$DEFAULT_SLEEPTIME
# Uitvoer CSV-bestand
CSV_FILE="results.csv"
# Functie voor het verwijderen van het CSV-bestand
delete_csv() {
if [ -f "$CSV_FILE" ]; then
echo "Het CSV-bestand '$CSV_FILE' bestaat al en wordt verwijderd."
rm "$CSV_FILE"
fi
}
# Functie om argumenten te verwerken
while [[ "$#" -gt 0 ]]; do
case "$1" in
-d|--delete)
delete_csv
shift
;;
-t|--duration)
if [[ -n "$2" && "$2" =~ ^[0-9]+$ ]]; then
DURATION=$2
echo "Duur van de test ingesteld op $DURATION seconden."
shift 2
else
echo "Fout: je moet een geldige numerieke waarde voor de duur opgeven."
exit 1
fi
;;
-r|--repeats)
if [[ -n "$2" && "$2" =~ ^[0-9]+$ ]]; then
REPEATS=$2
echo "Aantal runs ingesteld op $REPEATS."
shift 2
else
echo "Fout: je moet een geldige numerieke waarde voor runs opgeven."
exit 1
fi
;;
-s|--sleep)
if [[ -n "$2" && "$2" =~ ^[0-9]+$ ]]; then
SLEEPTIME=$2
echo "slaaptijd ingesteld op $SLEEPTIME seconden."
shift 2
else
echo "Fout: je moet een geldige numerieke waarde voor slaaptijd opgeven."
exit 1
fi
;;
*)
echo "Ongeldig argument: $1"
exit 1
;;
esac
done
# Maak het CSV-bestand aan met headers
echo "run,slaaptijd,timestamp,duration,read_bw_mbps,write_bw_mbps,read_iops,write_iops,avg_latency" > "$CSV_FILE"
# Variabelen voor het berekenen van gemiddelden
total_read_bw=0
total_write_bw=0
total_read_iops=0
total_write_iops=0
total_latency=0
# Loop voor meerdere tests
for ((i=1; i<=REPEATS; i++))
do
echo "Test $i van de $REPEATS runs..."
# FIO uitvoeren
fio_output=$(fio --randrepeat=1 --ioengine=libaio --direct=1 --gtod_reduce=1 --name=test --bs=4k \
--iodepth=64 --readwrite=randrw --rwmixread=75 --size=4G --filename=./fio.file \
--lat_percentiles=1 --output-format=json --time_based --runtime=$DURATION --group_reporting)
# Extract FIO metrics
fio_read_iops=$(echo "$fio_output" | jq -r '.jobs[0].read.iops')
fio_write_iops=$(echo "$fio_output" | jq -r '.jobs[0].write.iops')
fio_read_bw_kbps=$(echo "$fio_output" | jq -r '.jobs[0].read.bw')
fio_write_bw_kbps=$(echo "$fio_output" | jq -r '.jobs[0].write.bw')
fio_read_bw_mbps=$(echo "scale=2; $fio_read_bw_kbps / 1024" | bc)
fio_write_bw_mbps=$(echo "scale=2; $fio_write_bw_kbps / 1024" | bc)
# Ioping uitvoeren
ioping_output=$(ioping -c $DURATION ./)
avg_latency=$(echo "$(echo "$ioping_output" | grep 'min/avg/max/mdev' | awk '{print $6}')")
# Timestamp voor de CSV
timestamp=$(date '+%Y-%m-%d %H:%M:%S')
# Variabelen omzetten naar 2 decimalen
fio_read_iops=$(printf "%.2f" $fio_read_iops)
fio_write_iops=$(printf "%.2f" $fio_write_iops)
# Resultaten exporteren naar CSV
echo "$i / $REPEATS,$SLEEPTIME seconden,$timestamp,$DURATION seconden,$fio_read_bw_mbps,$fio_write_bw_mbps,$fio_read_iops,$fio_write_iops,$avg_latency us" >> "$CSV_FILE"
# Tel de waarden op voor gemiddelde berekening (zorg ervoor dat de waarden decimaal zijn)
total_read_bw=$(echo "$total_read_bw + $fio_read_bw_mbps" | bc)
total_write_bw=$(echo "$total_write_bw + $fio_write_bw_mbps" | bc)
total_read_iops=$(echo "$total_read_iops + $fio_read_iops" | bc)
total_write_iops=$(echo "$total_write_iops + $fio_write_iops" | bc)
total_latency=$(echo "$total_latency + $avg_latency" | bc)
# Opruimen
rm -rf fio.file
# Resultaten tonen
echo "==== Instellingen ===="
echo "Run: $i / $REPEATS"
echo "Slaaptijd: $SLEEPTIME seconden"
echo "Tijd: $DURATION seconden"
echo "======================"
echo "=== FIO Resultaten ==="
echo "Read Bandwidth (MB/s): $fio_read_bw_mbps"
echo "Write Bandwidth (MB/s): $fio_write_bw_mbps"
echo "Read IOPS: $fio_read_iops"
echo "Write IOPS: $fio_write_iops"
echo "======================"
echo "=== Ioping Resultaten ==="
echo "Gemiddelde Latency: $avg_latency us"
echo "========================="
# Wacht 60 seconden voor de volgende test
if [[ $i -lt $REPEATS ]]; then
echo "Wacht $SLEEPTIME seconden voor de volgende test..."
sleep $SLEEPTIME
fi
done
# Alleen de gemiddelden berekenen als er 2 of meer herhalingen zijn
if [[ $REPEATS -ge 2 ]]; then
# Bereken de gemiddelde waarden na alle runs
avg_read_bw=$(echo "scale=2; $total_read_bw / $REPEATS" | bc)
avg_write_bw=$(echo "scale=2; $total_write_bw / $REPEATS" | bc)
avg_read_iops=$(echo "$total_read_iops / $REPEATS" | bc)
avg_write_iops=$(echo "$total_write_iops / $REPEATS" | bc)
avg_latency=$(echo "scale=2; $total_latency / $REPEATS" | bc)
# Voeg de gemiddelde waarden toe aan het CSV-bestand
echo "Gemiddelden,,,,$avg_read_bw,$avg_write_bw,$avg_read_iops,$avg_write_iops,$avg_latency us" >> "$CSV_FILE"
fi
echo "Alle tests zijn voltooid. Resultaten zijn opgeslagen in $CSV_FILE"