Skip to content

Instantly share code, notes, and snippets.

@tdebatty
Last active April 17, 2025 11:40
Show Gist options
  • Save tdebatty/0358da0a2068eca1bf4583a06aa0acf2 to your computer and use it in GitHub Desktop.
Save tdebatty/0358da0a2068eca1bf4583a06aa0acf2 to your computer and use it in GitHub Desktop.
sysbench wrapper
#!/bin/bash
#
# bench.sh
# https://gist.github.com/tdebatty/0358da0a2068eca1bf4583a06aa0acf2
#
# https://cylab.be/blog/351/performance-of-virtual-storage-part-2-qemu
#
# a wrapper for sysbench
# quick run:
# bash <(curl -Ls https://gist.githubusercontent.com/tdebatty/0358da0a2068eca1bf4583a06aa0acf2/raw/bench.sh)
#
# run multiple iterations:
# curl https://gist.githubusercontent.com/tdebatty/0358da0a2068eca1bf4583a06aa0acf2/raw/bench.sh -O bench.sh
# chmod +x bench.sh
# ./bench.sh 10
#
# Changelog
# ---------
# 20250206 : storage: compute IOPS and use 10G
# 20250318 : nicer printing + compute random access 1 MiB block
# 20250417 : possibility to run multiple iterations
echo "
███████╗██╗ ██╗███████╗██████╗ ███████╗███╗ ██╗ ██████╗██╗ ██╗
██╔════╝╚██╗ ██╔╝██╔════╝██╔══██╗██╔════╝████╗ ██║██╔════╝██║ ██║
███████╗ ╚████╔╝ ███████╗██████╔╝█████╗ ██╔██╗ ██║██║ ███████║
╚════██║ ╚██╔╝ ╚════██║██╔══██╗██╔══╝ ██║╚██╗██║██║ ██╔══██║
███████║ ██║ ███████║██████╔╝███████╗██║ ╚████║╚██████╗██║ ██║
╚══════╝ ╚═╝ ╚══════╝╚═════╝ ╚══════╝╚═╝ ╚═══╝ ╚═════╝╚═╝ ╚═╝
v.20250417
https://gist.github.com/tdebatty/0358da0a2068eca1bf4583a06aa0acf2
"
printf "check if sysbench is installed ... "
command -v sysbench >/dev/null 2>&1
if [[ $? -ne 0 ]]; then
printf "\nsysbench not found, installing ... "
sudo apt update -qq
sudo apt install -y -qq sysbench
fi
printf "ok\n"
ITERATIONS=1
if [ -n "$1" ]; then
ITERATIONS="$1"
fi
echo "will perform $ITERATIONS iteration(s) ..."
for i in $(seq 1 $ITERATIONS);
do
echo "STARTING $i ..."
printf "\nCPU : single core\n"
printf "=================\n"
sysbench cpu run | grep -oP 'events per second:\s+(\d+)'
printf "\nCPU : multi core\n"
printf "================\n"
CORES=$(grep -c processor /proc/cpuinfo)
echo "$CORES cores"
sysbench cpu run --threads="$CORES" | grep -oP 'events per second:\s+(\d+)'
printf "\nMemory\n"
printf "======\n"
sysbench memory run | grep -oP '(\d+\.\d+) MiB\/sec'
printf "\nStorage\n"
printf "=======\n"
printf "prepare data ... "
sysbench fileio --file-total-size=10G --file-num=5 --verbosity=0 prepare
printf "ok\n"
# ---------- RANDOM (4KiB)
printf "\nrandom access (4 KiB block) ...\n"
# read
output=$(sysbench fileio --file-total-size=10G --file-num=5 --file-io-mode=async --file-fsync-freq=0 --file-test-mode=rndrd --file-block-size=4k run)
iops=$(echo "$output" | grep -oP 'reads/s:\s+(\d+\.\d+)' | awk '{print $2}')
throughput=$(echo "$output" | grep -oP 'read, MiB/s:\s+(\d+)' | awk '{print $3}')
printf "read: $throughput MiB/s ($iops IOPS)\n"
# write
output=$(sysbench fileio --file-total-size=10G --file-num=5 --file-io-mode=async --file-fsync-freq=0 --file-test-mode=rndwr --file-block-size=4k run)
iops=$(echo "$output" | grep -oP 'writes/s:\s+(\d+\.\d+)' | awk '{print $2}')
throughput=$(echo "$output" | grep -oP 'written, MiB/s:\s+(\d+)' | awk '{print $3}')
printf "write: $throughput MiB/s ($iops IOPS)\n"
# ---------- RANDOM (1MiB)
printf "\nrandom access (1 MiB block) ...\n"
# read
output=$(sysbench fileio --file-total-size=10G --file-num=5 --file-io-mode=async --file-fsync-freq=0 --file-test-mode=rndrd --file-block-size=1M run)
iops=$(echo "$output" | grep -oP 'reads/s:\s+(\d+\.\d+)' | awk '{print $2}')
throughput=$(echo "$output" | grep -oP 'read, MiB/s:\s+(\d+)' | awk '{print $3}')
printf "read: $throughput MiB/s ($iops IOPS)\n"
# write
output=$(sysbench fileio --file-total-size=10G --file-num=5 --file-io-mode=async --file-fsync-freq=0 --file-test-mode=rndwr --file-block-size=1M run)
iops=$(echo "$output" | grep -oP 'writes/s:\s+(\d+\.\d+)' | awk '{print $2}')
throughput=$(echo "$output" | grep -oP 'written, MiB/s:\s+(\d+)' | awk '{print $3}')
printf "write: $throughput MiB/s ($iops IOPS)\n"
# ---------- SEQUENTIAL (1MiB)
printf "\nsequential access (1 MiB block) ...\n"
# read
output=$(sysbench fileio --file-total-size=10G --file-num=5 --file-io-mode=async --file-fsync-freq=0 --file-test-mode=seqrd --file-block-size=1M run)
iops=$(echo "$output" | grep -oP 'reads/s:\s+(\d+\.\d+)' | awk '{print $2}')
throughput=$(echo "$output" | grep -oP 'read, MiB/s:\s+(\d+)' | awk '{print $3}')
printf "read: $throughput MiB/s ($iops IOPS)\n"
# write
output=$(sysbench fileio --file-total-size=10G --file-num=5 --file-io-mode=async --file-fsync-freq=0 --file-test-mode=seqwr --file-block-size=1M run)
iops=$(echo "$output" | grep -oP 'writes/s:\s+(\d+\.\d+)' | awk '{print $2}')
throughput=$(echo "$output" | grep -oP 'written, MiB/s:\s+(\d+)' | awk '{print $3}')
printf "write: $throughput MiB/s ($iops IOPS)\n"
printf "\ncleanup ... "
rm test_file.*
printf "ok\n"
echo "---------------------------------------------------------------"
done
@tdebatty
Copy link
Author

tdebatty commented Jul 6, 2024

A simple wrapper for sysbench. I use it to quickly benchmark Linux computers and servers.

bash <(curl -Ls https://gist.githubusercontent.com/tdebatty/0358da0a2068eca1bf4583a06aa0acf2/raw/bench.sh)

scaleway-block

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment