Benchmarking del Servidor con sysbench
Sysbench es una herramienta de benchmarking modular y multiplataforma que proporciona capacidades exhaustivas de prueba de rendimiento para la infraestructura de servidores modernos. Con pruebas para CPU, memoria, I/O y bases de datos, sysbench permite la planificación de capacidad impulsada por datos y validación de rendimiento. Esta guía cubre el uso de sysbench para benchmarking exhaustivo de servidores e interpretación de resultados para decisiones de infraestructura.
Tabla de Contenidos
- Descripción General e Instalación de Sysbench
- Benchmarking de CPU
- Pruebas de Rendimiento de Memoria
- Benchmarking de I/O de Archivos
- Pruebas de Contención de Hilos
- Benchmarking de Base de Datos
- Interpretación de Resultados
- Comparación de Línea Base de Rendimiento
- Conclusión
Descripción General e Instalación de Sysbench
Requisitos del Sistema
# Verificar especificaciones del sistema para línea base
uname -a
cat /proc/cpuinfo | head -20
free -h
nproc
lscpu
Instalación de Sysbench
# Instalación en Ubuntu/Debian
sudo apt-get update
sudo apt-get install -y sysbench
# Instalación en CentOS/RHEL
sudo yum install -y sysbench
# O compilar desde la fuente para obtener la versión más reciente
git clone https://github.com/akopytov/sysbench.git
cd sysbench
./autogen.sh
./configure
make -j$(nproc)
sudo make install
# Verificar instalación
sysbench --version
# Listar pruebas disponibles
sysbench --help
Benchmarking de CPU
Prueba Básica de CPU
# Ejecutar benchmark de CPU en un solo hilo
sysbench cpu --cpu-max-prime=20000 run
# Parámetros explicados:
# --cpu-max-prime: Número primo más grande a verificar (más alto = prueba más larga)
# run: Ejecutar el benchmark
# Ejemplo de interpretación de salida:
# Total time: ~10 segundos
# Total number of events: Número de cálculos de primos completados
# Approximate throughput: Operaciones por segundo
Pruebas de CPU Multi-hilo
# Prueba con múltiples hilos (coincidir con el número de núcleos de CPU)
sysbench cpu --threads=16 --cpu-max-prime=20000 run
# Recuentos de hilos recomendados:
# - 1: Línea base de un solo hilo
# - Número de núcleos de CPU: Utilización completa
# - 2x núcleos de CPU: Pruebas de contención
# Comparar rendimiento de un solo hilo vs multi-hilo
echo "=== Single Thread ==="
sysbench cpu --threads=1 --cpu-max-prime=20000 run
echo "=== 8 Threads ==="
sysbench cpu --threads=8 --cpu-max-prime=20000 run
echo "=== 16 Threads ==="
sysbench cpu --threads=16 --cpu-max-prime=20000 run
Prueba de Estrés de CPU
# Prueba de estrés extendida (30 segundos)
sysbench cpu --threads=16 --time=30 --cpu-max-prime=50000 run
# Monitorear mientras se ejecuta
# En otra terminal:
top
htop
sar 1
# Verificar limitación térmica
cat /proc/cpuinfo | grep MHz
watch -n 1 'cat /proc/cpuinfo | grep MHz'
# Prueba de estabilidad de larga duración (2 horas)
nohup sysbench cpu --threads=16 --time=7200 --cpu-max-prime=100000 run > cpu-long.log 2>&1 &
tail -f cpu-long.log
Pruebas de Rendimiento de Memoria
Benchmarking de Lectura/Escritura de Memoria
# Probar lectura secuencial de memoria
sysbench memory --memory-total-size=10G run
# Probar con diferentes patrones
# Patrón de acceso secuencial
sysbench memory --memory-total-size=10G --memory-access-mode=seq run
# Patrón de acceso aleatorio
sysbench memory --memory-total-size=10G --memory-access-mode=rnd run
# Tamaño de bloque específico
sysbench memory --memory-total-size=10G --memory-block-size=1K run
sysbench memory --memory-total-size=10G --memory-block-size=1M run
Análisis de Rendimiento de Memoria
# Comparar diferentes tamaños de bloque de memoria
for block_size in 1K 4K 8K 64K 256K 1M; do
echo "=== Block Size: $block_size ==="
sysbench memory --memory-total-size=10G --memory-block-size=$block_size run
done
# Prueba de memoria multi-hilo
sysbench memory --threads=8 --memory-total-size=20G run
# Monitorear memoria durante la prueba
# En terminal paralela:
watch -n 1 free -h
watch -n 1 'cat /proc/meminfo | grep -E "MemTotal|MemAvailable|MemFree"'
Benchmarking de I/O de Archivos
Preparar Archivos de Prueba de I/O
# Crear archivos de prueba (requerido antes de pruebas de I/O)
sysbench fileio --file-total-size=10G prepare
# Parámetros:
# --file-total-size: Total de datos a escribir
# --file-num: Número de archivos de prueba (por defecto 128)
# Verificar archivos creados
ls -lah /tmp/sbtest*/
du -sh /tmp/sbtest*/
# Crear en ubicación de almacenamiento específica
sysbench fileio --file-total-size=100G --file-extra-flags=direct \
--file-test-mode=prepare /mnt/fast-storage/
# Ver configuración de I/O de archivos
sysbench fileio --help | grep file-
Pruebas de I/O Secuencial
# Prueba de lectura secuencial
sysbench fileio --file-total-size=10G --file-test-mode=seqrd --time=300 run
# Prueba de escritura secuencial
sysbench fileio --file-total-size=10G --file-test-mode=seqwr --time=300 run
# Reescritura secuencial (actualizar existente)
sysbench fileio --file-total-size=10G --file-test-mode=seqrewr --time=300 run
# Medir rendimiento sostenido
sysbench fileio --file-total-size=100G --file-test-mode=seqread \
--file-extra-flags=direct --time=600 run
Pruebas de I/O Aleatorio
# Operaciones de lectura aleatoria
sysbench fileio --file-total-size=10G --file-test-mode=rndrd --time=300 run
# Operaciones de escritura aleatoria
sysbench fileio --file-total-size=10G --file-test-mode=rndwr --time=300 run
# Mezcla de lectura-escritura aleatoria
sysbench fileio --file-total-size=10G --file-test-mode=rndrw \
--file-rw-ratio=1:1 --time=300 run
# Prueba de ráfaga corta enfocada en IOPS
sysbench fileio --file-total-size=10G --file-test-mode=rndrd \
--file-io-mode=async --time=60 run
Comparación de Rendimiento de I/O
# I/O directo vs almacenado en búfer
echo "=== Buffered I/O ==="
sysbench fileio --file-total-size=10G --file-test-mode=seqrd --time=60 run
echo "=== Direct I/O (Async) ==="
sysbench fileio --file-total-size=10G --file-test-mode=seqrd \
--file-extra-flags=direct --file-io-mode=async --time=60 run
# Diferentes profundidades de cola
for depth in 1 4 16 64; do
echo "=== Queue Depth: $depth ==="
sysbench fileio --file-total-size=10G --file-test-mode=rndrd \
--file-io-mode=async --threads=$depth --time=60 run
done
Pruebas de Contención de Hilos
Prueba de Contención de Mutex
# Prueba de contención de bloqueo mutex
sysbench mutex --threads=1 --time=10 run
# Contención de bloqueo multi-hilo
sysbench mutex --threads=16 --time=10 run
# Prueba de contención extrema
sysbench mutex --threads=64 --time=10 run
# Monitorear tiempos de espera de bloqueo
# En paralela: watch -n 1 'cat /proc/lock_stat'
Escalabilidad de Rendimiento de Hilos
# Probar escalabilidad de 1 a núcleos máximos
CORES=$(nproc)
for threads in 1 2 4 8 16 32; do
if [ $threads -le $CORES ]; then
echo "=== $threads Threads ==="
sysbench cpu --threads=$threads --time=10 --cpu-max-prime=20000 run
fi
done
# Visualizar resultados
cat > analyze_threads.sh <<'EOF'
#!/bin/bash
for threads in 1 2 4 8 16; do
result=$(sysbench cpu --threads=$threads --time=10 --cpu-max-prime=20000 run 2>&1 | grep "total time:")
echo "Threads: $threads, $result"
done
EOF
chmod +x analyze_threads.sh
./analyze_threads.sh
Benchmarking de Base de Datos
Configuración de Benchmark OLTP
# Preparar datos de prueba OLTP
sysbench oltp_prepare --mysql-db=sbtest --mysql-user=root --mysql-password=password
# O PostgreSQL
sysbench oltp_prepare --pgsql-db=sbtest --pgsql-user=postgres --pgsql-password=password
# Configurar parámetros de benchmark
# --tables: Número de tablas de prueba (por defecto 1)
# --table-size: Filas por tabla (por defecto 10000)
sysbench oltp_prepare --tables=4 --table-size=100000 \
--mysql-db=sbtest --mysql-user=root --mysql-password=password
Ejecutar Pruebas OLTP
# Prueba de rendimiento de transacciones (lectura pesada)
sysbench oltp_read_only --threads=8 --time=300 \
--mysql-db=sbtest --mysql-user=root --mysql-password=password run
# Carga de trabajo mixta de lectura-escritura
sysbench oltp_read_write --threads=8 --time=300 \
--mysql-db=sbtest --mysql-user=root --mysql-password=password run
# Carga de trabajo de escritura pesada
sysbench oltp_write_only --threads=8 --time=300 \
--mysql-db=sbtest --mysql-user=root --mysql-password=password run
# Carga de trabajo pesada en actualización
sysbench oltp_update_index --threads=8 --time=300 \
--mysql-db=sbtest --mysql-user=root --mysql-password=password run
Pruebas de Estrés de Base de Datos
# Prueba de estrés de alta concurrencia
sysbench oltp_read_write --threads=64 --time=600 \
--mysql-db=sbtest --mysql-user=root --mysql-password=password run
# Monitorear base de datos durante la prueba
# En terminal paralela:
mysql -u root -p
# Verificar desde la línea de comandos
mysqladmin -u root -p status
mysqladmin -u root -p processlist
# Ver registros de consultas lentas
tail -f /var/log/mysql/slow.log
Interpretación de Resultados
Métricas de Rendimiento Clave
# Resultados de benchmark de CPU:
# - Total time: Tiempo transcurrido real
# - Total events: Número de cálculos
# - Throughput: Operaciones por segundo (más alto es mejor)
# Resultados de benchmark de memoria:
# - Total operations: Datos movidos
# - Total MiB transferred: Ancho de banda de memoria
# - MiB/sec throughput: Ancho de banda de memoria efectivo
# Resultados de benchmark de I/O:
# - Total time: Duración de la prueba
# - Total number of events: Operaciones de I/O
# - Read MiB/sec: Ancho de banda de lectura secuencial
# - Write MiB/sec: Ancho de banda de escritura secuencial
# - total throughput: Total de I/Os por segundo
Análisis de Salida de Muestra
# Salida típica de benchmark de CPU:
# CPU speed:
# events per second: 1234.56 (5.67x from initial estimate)
# General statistics:
# total time: 10.0123s
# total number of events: 12345
# Latency (ms):
# min: 0.00
# avg: 0.81
# max: 23.45
# 95th percentile: 2.12
# Interpretación:
# Mayor events/sec = mejor rendimiento de CPU
# Menor latencia = rendimiento más consistente
# Verificar percentil 95 para latencia en el peor de los casos
Comparación de Línea Base de Rendimiento
Crear Resultados de Línea Base
# Ejecutar suite de línea base completa
cat > baseline_suite.sh <<'EOF'
#!/bin/bash
DATE=$(date +%Y%m%d_%H%M%S)
RESULTS_DIR="/tmp/sysbench-results-$DATE"
mkdir -p $RESULTS_DIR
# Línea base de CPU
echo "=== CPU Baseline ==="
sysbench cpu --threads=$(nproc) --time=30 --cpu-max-prime=20000 run | tee $RESULTS_DIR/cpu.txt
# Línea base de memoria
echo "=== Memory Baseline ==="
sysbench memory --threads=8 --memory-total-size=20G run | tee $RESULTS_DIR/memory.txt
# Línea base de I/O (preparar primero)
echo "=== I/O Baseline (Preparing) ==="
sysbench fileio --file-total-size=10G prepare
echo "=== I/O Baseline (Running) ==="
sysbench fileio --file-total-size=10G --file-test-mode=rndrw --time=60 run | tee $RESULTS_DIR/io.txt
echo "Results saved to $RESULTS_DIR"
EOF
chmod +x baseline_suite.sh
./baseline_suite.sh
Comparar Resultados
# Extraer métricas clave para comparación
cat > compare_results.sh <<'EOF'
#!/bin/bash
echo "=== Current Results ==="
sysbench cpu --threads=$(nproc) --time=10 --cpu-max-prime=20000 run | grep -E "total time|events per second|throughput"
# Comparar contra línea base (valores almacenados)
BASELINE_THROUGHPUT=5000.00
echo ""
echo "=== vs Baseline ==="
CURRENT=$(sysbench cpu --threads=$(nproc) --time=10 --cpu-max-prime=20000 run 2>&1 | grep "events per second" | awk '{print $NF}')
PERCENT=$(echo "scale=2; ($CURRENT / $BASELINE_THROUGHPUT) * 100" | bc)
echo "Baseline throughput: $BASELINE_THROUGHPUT"
echo "Current throughput: $CURRENT"
echo "Percentage change: $PERCENT%"
EOF
chmod +x compare_results.sh
./compare_results.sh
Conclusión
Sysbench proporciona capacidades esenciales para validación de infraestructura, planificación de capacidad y solución de problemas de rendimiento. Al ejecutar benchmarks exhaustivos en los subsistemas de CPU, memoria e I/O, las organizaciones establecen líneas base de rendimiento que permiten comparación objetiva y optimización. Comprender la interpretación de métricas asegura toma de decisiones impulsada por datos para actualizaciones de infraestructura. El benchmarking regular durante el ciclo de vida de la infraestructura valida afirmaciones de rendimiento y detecta degradación por envejecimiento del hardware o cambios de configuración, haciendo de sysbench una herramienta invaluable para operaciones modernas del centro de datos.


