sysbench ist ein modulares Benchmark-Tool für Linux. Es testet CPU, Memory, Disk I/O und Datenbank-Performance mit reproduzierbaren Ergebnissen.

Installation

# Debian/Ubuntu
apt install sysbench

# RHEL/CentOS
dnf install sysbench

# Version prüfen
sysbench --version

CPU-Benchmark

Basis-Test

# CPU-Test (Primzahlen berechnen)
sysbench cpu run

# Ausgabe:
# CPU speed:
#     events per second:  1234.56
#
# Throughput:
#     events/s (eps):     1234.5678
#     time elapsed:       10.0001s
#     total number of events: 12345

Erweiterte Optionen

# Mit mehr Threads
sysbench cpu --threads=4 run

# Längere Laufzeit
sysbench cpu --time=60 run

# Höhere Primzahl-Grenze
sysbench cpu --cpu-max-prime=50000 run

# Vollständiger Test
sysbench cpu --threads=8 --time=60 --cpu-max-prime=20000 run

Multi-Core Skalierung

#!/bin/bash
# cpu-scaling.sh

for threads in 1 2 4 8 16; do
    echo "=== $threads Threads ==="
    sysbench cpu --threads=$threads --time=30 run | grep "events per second"
done

Memory-Benchmark

Basis-Test

# Memory-Test
sysbench memory run

# Ausgabe:
# Total operations: 104857600 (10485760.00 per second)
# 102400.00 MiB transferred (10240.00 MiB/sec)

Optionen

# Block-Größe
sysbench memory --memory-block-size=1M run

# Gesamtgröße
sysbench memory --memory-total-size=10G run

# Zugriffsart
sysbench memory --memory-access-mode=rnd run  # Random
sysbench memory --memory-access-mode=seq run  # Sequential

# Operation
sysbench memory --memory-oper=read run
sysbench memory --memory-oper=write run

# Multi-Thread
sysbench memory --threads=4 --memory-block-size=1K run

Disk I/O-Benchmark

Vorbereitung

# Test-Dateien erstellen
sysbench fileio --file-total-size=10G prepare

# Erzeugt: test_file.0, test_file.1, ...

Tests durchführen

# Sequential Read
sysbench fileio --file-total-size=10G --file-test-mode=seqrd run

# Sequential Write
sysbench fileio --file-total-size=10G --file-test-mode=seqwr run

# Random Read
sysbench fileio --file-total-size=10G --file-test-mode=rndrd run

# Random Write
sysbench fileio --file-total-size=10G --file-test-mode=rndwr run

# Random Read/Write
sysbench fileio --file-total-size=10G --file-test-mode=rndrw run

Erweiterte Optionen

# Mit spezifischen Parametern
sysbench fileio \
    --file-total-size=10G \
    --file-test-mode=rndrw \
    --file-num=16 \
    --file-block-size=16K \
    --file-io-mode=sync \
    --threads=4 \
    --time=60 \
    run

Test-Dateien entfernen

sysbench fileio --file-total-size=10G cleanup

MySQL-Benchmark

Vorbereitung

# Datenbank erstellen
mysql -u root -p -e "CREATE DATABASE sbtest;"

# Test-Daten vorbereiten
sysbench oltp_read_write \
    --mysql-host=localhost \
    --mysql-user=root \
    --mysql-password=secret \
    --mysql-db=sbtest \
    --tables=10 \
    --table-size=100000 \
    prepare

OLTP-Tests

# Read-Only
sysbench oltp_read_only \
    --mysql-host=localhost \
    --mysql-user=root \
    --mysql-password=secret \
    --mysql-db=sbtest \
    --tables=10 \
    --table-size=100000 \
    --threads=16 \
    --time=60 \
    run

# Write-Only
sysbench oltp_write_only \
    --mysql-host=localhost \
    --mysql-user=root \
    --mysql-password=secret \
    --mysql-db=sbtest \
    --tables=10 \
    --threads=16 \
    --time=60 \
    run

# Read/Write
sysbench oltp_read_write \
    --mysql-host=localhost \
    --mysql-user=root \
    --mysql-password=secret \
    --mysql-db=sbtest \
    --tables=10 \
    --threads=16 \
    --time=60 \
    run

Ausgabe verstehen

# SQL statistics:
#     queries performed:
#         read:                            140000
#         write:                           40000
#         other:                           20000
#         total:                           200000
#     transactions:                        10000  (166.67 per sec.)
#     queries:                             200000 (3333.33 per sec.)
#
# Latency (ms):
#          min:                                    1.23
#          avg:                                   95.99
#          max:                                  234.56
#          95th percentile:                      155.80

Test-Daten aufräumen

sysbench oltp_read_write \
    --mysql-host=localhost \
    --mysql-user=root \
    --mysql-password=secret \
    --mysql-db=sbtest \
    --tables=10 \
    cleanup

PostgreSQL-Benchmark

# Vorbereitung
sysbench oltp_read_write \
    --db-driver=pgsql \
    --pgsql-host=localhost \
    --pgsql-user=postgres \
    --pgsql-password=secret \
    --pgsql-db=sbtest \
    --tables=10 \
    --table-size=100000 \
    prepare

# Test
sysbench oltp_read_write \
    --db-driver=pgsql \
    --pgsql-host=localhost \
    --pgsql-user=postgres \
    --pgsql-password=secret \
    --pgsql-db=sbtest \
    --tables=10 \
    --threads=16 \
    --time=60 \
    run

Mutex-Benchmark

# Thread-Synchronisation testen
sysbench mutex --threads=64 run

# Optionen
sysbench mutex \
    --mutex-num=4096 \
    --mutex-locks=50000 \
    --mutex-loops=10000 \
    --threads=64 \
    run

Threads-Benchmark

# Thread-Scheduler testen
sysbench threads --threads=64 run

# Mit mehr Yields
sysbench threads --thread-yields=1000 --thread-locks=8 --threads=64 run

Benchmark-Script

#!/bin/bash
# full-benchmark.sh

RESULTS="benchmark-$(date +%Y%m%d-%H%M%S)"
mkdir -p $RESULTS

echo "=== CPU Benchmark ===" | tee $RESULTS/cpu.txt
sysbench cpu --threads=$(nproc) --time=60 run | tee -a $RESULTS/cpu.txt

echo -e "\n=== Memory Benchmark ===" | tee $RESULTS/memory.txt
sysbench memory --threads=$(nproc) --time=60 run | tee -a $RESULTS/memory.txt

echo -e "\n=== File I/O Benchmark ===" | tee $RESULTS/fileio.txt
sysbench fileio --file-total-size=4G prepare
sysbench fileio --file-total-size=4G --file-test-mode=rndrw --threads=4 --time=60 run | tee -a $RESULTS/fileio.txt
sysbench fileio --file-total-size=4G cleanup

echo "Results saved to $RESULTS/"

Vergleichs-Tests

Vor/Nach Optimierung

#!/bin/bash
# compare-benchmark.sh

LABEL=$1

# CPU
echo "CPU: $(sysbench cpu --time=30 run | grep 'events per second' | awk '{print $4}')" >> benchmark-$LABEL.txt

# Memory
echo "Memory: $(sysbench memory --time=30 run | grep 'MiB/sec' | awk '{print $4}')" >> benchmark-$LABEL.txt

# File I/O
sysbench fileio --file-total-size=1G prepare > /dev/null
echo "FileIO: $(sysbench fileio --file-total-size=1G --file-test-mode=rndrw --time=30 run | grep 'read, MiB/s' | awk '{print $3}')" >> benchmark-$LABEL.txt
sysbench fileio --file-total-size=1G cleanup > /dev/null

Zusammenfassung

| Test | Befehl | |------|--------| | CPU | sysbench cpu run | | Memory | sysbench memory run | | Disk I/O | sysbench fileio run | | MySQL | sysbench oltp_read_write run | | Threads | sysbench threads run | | Mutex | sysbench mutex run |

| Option | Beschreibung | |--------|--------------| | --threads | Anzahl Threads | | --time | Testdauer (Sekunden) | | --events | Anzahl Events | | --report-interval | Intervall-Berichte |

| File I/O Mode | Beschreibung | |---------------|--------------| | seqrd | Sequential Read | | seqwr | Sequential Write | | rndrd | Random Read | | rndwr | Random Write | | rndrw | Random Read/Write |

| MySQL Test | Workload | |------------|----------| | oltp_read_only | Nur SELECT | | oltp_write_only | INSERT/UPDATE/DELETE | | oltp_read_write | Gemischt | | oltp_point_select | Punkt-Abfragen |

Fazit

sysbench ist ideal für reproduzierbare Benchmarks. Die CPU-Tests messen Single- und Multi-Thread-Performance. File I/O-Tests simulieren verschiedene Workloads. MySQL-Benchmarks testen realistische OLTP-Last. Für aussagekräftige Ergebnisse sollten Tests mehrfach durchgeführt werden.