Optimisation des Performances Linux : Guide Complet pour la Production
L'optimisation des performances Linux est un art qui combine compréhension théorique et expérience pratique. Dans cet article, nous explorerons les techniques avancées pour maximiser les performances de vos serveurs en production.
Architecture et Métriques Fondamentales
Comprendre les Goulots d'Étranglement
Les performances d'un système Linux dépendent de quatre ressources principales :
CPU (Processeur)
- Utilisation et saturation
- Context switches
- Interruptions
- Load average
Mémoire (RAM)
- Utilisation physique vs virtuelle
- Cache et buffers
- Swap et paging
- Memory leaks
Stockage (I/O)
- Latence et débit
- Queue depth
- IOPS (Input/Output Operations Per Second)
- Fragmentation
Réseau
- Bande passante
- Latence
- Packet loss
- Buffer overflows
Outils de Monitoring Essentiels
# Monitoring CPU
top -p $(pgrep -d',' java)
htop
sar -u 1 10
# Monitoring Mémoire
free -h
vmstat 1 10
cat /proc/meminfo
# Monitoring I/O
iostat -x 1 10
iotop
lsof +D /var/log
# Monitoring Réseau
iftop
netstat -i
ss -tuln
# Monitoring Global
dstat -cdngy
atop
Optimisation du Kernel Linux
Paramètres Sysctl Critiques
# /etc/sysctl.d/99-performance.conf
# === NETWORK PERFORMANCE ===
# Augmenter les buffers réseau
net.core.rmem_default = 262144
net.core.rmem_max = 16777216
net.core.wmem_default = 262144
net.core.wmem_max = 16777216
# TCP tuning
net.ipv4.tcp_rmem = 4096 65536 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_congestion_control = bbr
net.ipv4.tcp_slow_start_after_idle = 0
# Réduire les timeouts
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_keepalive_probes = 7
net.ipv4.tcp_keepalive_intvl = 30
# === MEMORY MANAGEMENT ===
# Swappiness (0-100, plus bas = moins de swap)
vm.swappiness = 10
# Dirty pages (cache d'écriture)
vm.dirty_background_ratio = 5
vm.dirty_ratio = 10
vm.dirty_expire_centisecs = 12000
vm.dirty_writeback_centisecs = 1200
# === FILE SYSTEM ===
# Augmenter les limites de fichiers
fs.file-max = 2097152
fs.nr_open = 1048576
# === KERNEL ===
# Shared memory
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
# Appliquer les changements
sysctl -p /etc/sysctl.d/99-performance.conf
Optimisation du Scheduler
# Vérifier le scheduler actuel
cat /sys/block/sda/queue/scheduler
# Pour SSD : noop ou deadline
echo noop > /sys/block/sda/queue/scheduler
# Pour HDD : cfq ou deadline
echo deadline > /sys/block/sda/queue/scheduler
# Rendre permanent dans /etc/default/grub
GRUB_CMDLINE_LINUX="elevator=deadline"
Gestion Avancée de la Mémoire
Analyse des Fuites Mémoire
# Script de monitoring mémoire
#!/bin/bash
# memory-monitor.sh
LOG_FILE="/var/log/memory-monitor.log"
THRESHOLD=80 # Seuil d'alerte en %
while true; do
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
# Récupérer les stats mémoire
TOTAL=$(free | grep Mem | awk '{print $2}')
USED=$(free | grep Mem | awk '{print $3}')
AVAILABLE=$(free | grep Mem | awk '{print $7}')
USAGE_PERCENT=$((USED * 100 / TOTAL))
echo "[$TIMESTAMP] Memory: ${USAGE_PERCENT}% used" >> $LOG_FILE
if [ $USAGE_PERCENT -gt $THRESHOLD ]; then
echo "[$TIMESTAMP] ALERT: High memory usage!" >> $LOG_FILE
# Top 10 des processus consommateurs
ps aux --sort=-%mem | head -11 >> $LOG_FILE
# Analyser les caches
echo "Cache analysis:" >> $LOG_FILE
cat /proc/meminfo | grep -E "(Cached|Buffers|Slab)" >> $LOG_FILE
fi
sleep 60
done
Optimisation des Huge Pages
# Vérifier le support des huge pages
grep -i hugepage /proc/meminfo
# Configurer les huge pages
echo 1024 > /proc/sys/vm/nr_hugepages
# Rendre permanent
echo 'vm.nr_hugepages = 1024' >> /etc/sysctl.conf
# Pour les applications Java/Kafka
echo 'vm.hugetlb_shm_group = 1001' >> /etc/sysctl.conf
Optimisation du Système de Fichiers
Choix et Configuration du FS
# Ext4 optimisé pour les performances
mkfs.ext4 -F -O ^has_journal /dev/sdb1
# XFS pour les gros volumes
mkfs.xfs -f -s size=4096 /dev/sdc1
# Options de montage optimisées
# /etc/fstab
/dev/sdb1 /data ext4 noatime,nodiratime,nobarrier,data=writeback 0 0
/dev/sdc1 /logs xfs noatime,nodiratime,nobarrier,logbufs=8,logbsize=256k 0 0
Monitoring I/O Avancé
# Script d'analyse I/O
#!/bin/bash
# io-analysis.sh
echo "=== I/O Performance Analysis ==="
# Latence par device
for device in $(lsblk -d -o NAME | tail -n +2); do
echo "Device: $device"
# Statistiques actuelles
iostat -x 1 3 | grep $device | tail -1
# Queue depth
cat /sys/block/$device/queue/nr_requests
# Scheduler
cat /sys/block/$device/queue/scheduler
echo "---"
done
# Top des processus I/O
echo "Top I/O processes:"
iotop -b -n 1 | head -20
# Analyse des fichiers ouverts
echo "Open files by process:"
lsof | awk '{print $2}' | sort | uniq -c | sort -nr | head -10
Optimisation Réseau
Configuration Avancée TCP
# Script d'optimisation réseau
#!/bin/bash
# network-tuning.sh
echo "=== Network Performance Tuning ==="
# Augmenter les buffers de réception
echo 'net.core.netdev_max_backlog = 5000' >> /etc/sysctl.conf
# Optimiser TCP
cat >> /etc/sysctl.conf << EOF
# TCP Window Scaling
net.ipv4.tcp_window_scaling = 1
# TCP Selective Acknowledgments
net.ipv4.tcp_sack = 1
# TCP Timestamps
net.ipv4.tcp_timestamps = 1
# TCP SYN cookies (protection DDoS)
net.ipv4.tcp_syncookies = 1
# Réduire les retransmissions
net.ipv4.tcp_retries2 = 5
EOF
# Appliquer
sysctl -p
# Monitoring réseau en temps réel
watch -n 1 'cat /proc/net/dev'
Optimisation des Interruptions
# Vérifier la distribution des interruptions
cat /proc/interrupts
# Script d'équilibrage IRQ
#!/bin/bash
# irq-balance.sh
# Désactiver irqbalance pour contrôle manuel
systemctl stop irqbalance
systemctl disable irqbalance
# Identifier les IRQ réseau
NETWORK_IRQS=$(grep eth0 /proc/interrupts | cut -d: -f1 | tr -d ' ')
# Distribuer sur les CPUs
CPU_COUNT=$(nproc)
i=0
for irq in $NETWORK_IRQS; do
cpu=$((i % CPU_COUNT))
echo $((2**cpu)) > /proc/irq/$irq/smp_affinity
echo "IRQ $irq -> CPU $cpu"
((i++))
done
Monitoring et Alerting
Dashboard de Performance
#!/bin/bash
# performance-dashboard.sh
LOGFILE="/var/log/performance.log"
while true; do
clear
echo "=== PERFORMANCE DASHBOARD ==="
echo "Timestamp: $(date)"
echo
# CPU
echo "=== CPU ==="
CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)
LOAD_AVG=$(uptime | awk -F'load average:' '{print $2}')
echo "CPU Usage: ${CPU_USAGE}%"
echo "Load Average:${LOAD_AVG}"
# Memory
echo
echo "=== MEMORY ==="
free -h | grep -E "(Mem|Swap)"
# Disk I/O
echo
echo "=== DISK I/O ==="
iostat -x 1 1 | grep -E "(Device|sd|nvme)" | tail -5
# Network
echo
echo "=== NETWORK ==="
ss -tuln | wc -l | xargs echo "Active connections:"
# Top processes
echo
echo "=== TOP PROCESSES ==="
ps aux --sort=-%cpu | head -6
# Log critical metrics
echo "$(date),$CPU_USAGE,$LOAD_AVG" >> $LOGFILE
sleep 5
done
Alerting Automatisé
#!/bin/bash
# performance-alerts.sh
# Configuration
CPU_THRESHOLD=80
MEMORY_THRESHOLD=85
DISK_THRESHOLD=90
LOAD_THRESHOLD=4.0
# Fonction d'alerte
send_alert() {
local message="$1"
echo "ALERT: $message" | logger -t performance-monitor
# Envoyer par email (optionnel)
# echo "$message" | mail -s "Performance Alert" admin@example.com
# Webhook Slack/Teams (optionnel)
# curl -X POST -H 'Content-type: application/json' \
# --data "{\"text\":\"$message\"}" \
# YOUR_WEBHOOK_URL
}
# Vérifications
check_cpu() {
CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d'%' -f1)
if (( $(echo "$CPU_USAGE > $CPU_THRESHOLD" | bc -l) )); then
send_alert "High CPU usage: ${CPU_USAGE}%"
fi
}
check_memory() {
MEMORY_USAGE=$(free | grep Mem | awk '{printf "%.1f", $3/$2 * 100.0}')
if (( $(echo "$MEMORY_USAGE > $MEMORY_THRESHOLD" | bc -l) )); then
send_alert "High memory usage: ${MEMORY_USAGE}%"
fi
}
check_disk() {
df -h | awk 'NR>1 {print $5 " " $6}' | while read output; do
usage=$(echo $output | awk '{print $1}' | cut -d'%' -f1)
partition=$(echo $output | awk '{print $2}')
if [ $usage -gt $DISK_THRESHOLD ]; then
send_alert "High disk usage: ${usage}% on ${partition}"
fi
done
}
check_load() {
LOAD_1MIN=$(uptime | awk -F'load average:' '{print $2}' | awk '{print $1}' | cut -d',' -f1)
if (( $(echo "$LOAD_1MIN > $LOAD_THRESHOLD" | bc -l) )); then
send_alert "High load average: $LOAD_1MIN"
fi
}
# Exécution des vérifications
check_cpu
check_memory
check_disk
check_load
Cas d'Usage Spécifiques
Optimisation pour Kafka
# Optimisations spécifiques pour Kafka
cat >> /etc/sysctl.conf << EOF
# Kafka optimizations
vm.max_map_count = 262144
vm.dirty_background_ratio = 5
vm.dirty_ratio = 60
vm.dirty_expire_centisecs = 12000
vm.swappiness = 1
# Network for Kafka
net.core.rmem_default = 262144
net.core.rmem_max = 134217728
net.core.wmem_default = 262144
net.core.wmem_max = 134217728
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_max_syn_backlog = 40000
net.core.netdev_max_backlog = 50000
EOF
Optimisation pour Elasticsearch
# Optimisations pour Elasticsearch
echo 'vm.max_map_count = 262144' >> /etc/sysctl.conf
echo '* soft nofile 65536' >> /etc/security/limits.conf
echo '* hard nofile 65536' >> /etc/security/limits.conf
echo 'elasticsearch soft memlock unlimited' >> /etc/security/limits.conf
echo 'elasticsearch hard memlock unlimited' >> /etc/security/limits.conf
Automatisation et Maintenance
Script de Maintenance Automatique
#!/bin/bash
# system-maintenance.sh
LOG_FILE="/var/log/maintenance.log"
log_message() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a $LOG_FILE
}
log_message "Starting system maintenance..."
# Nettoyage des logs
log_message "Cleaning old logs..."
find /var/log -name "*.log" -mtime +30 -delete
journalctl --vacuum-time=30d
# Nettoyage du cache
log_message "Cleaning caches..."
sync && echo 3 > /proc/sys/vm/drop_caches
# Vérification de l'espace disque
log_message "Checking disk space..."
df -h | awk 'NR>1 {if($5+0 > 90) print "WARNING: " $6 " is " $5 " full"}'
# Mise à jour des statistiques
log_message "Updating system statistics..."
updatedb
mandb
# Optimisation des bases de données
log_message "Optimizing databases..."
if systemctl is-active --quiet mysql; then
mysqlcheck --optimize --all-databases
fi
log_message "Maintenance completed."
Conclusion
L'optimisation des performances Linux est un processus continu qui nécessite :
Monitoring Constant
- Mise en place d'alertes proactives
- Analyse des tendances
- Identification des patterns
Approche Méthodique
- Tests de charge réguliers
- Validation des optimisations
- Documentation des changements
Adaptation aux Workloads
- Profiling applicatif
- Optimisations spécifiques
- Équilibrage des ressources
Maintenance Préventive
- Nettoyage automatisé
- Mise à jour sécurisée
- Sauvegarde des configurations
Les techniques présentées dans cet article vous permettront d'optimiser significativement les performances de vos serveurs Linux en production. N'oubliez pas que chaque environnement est unique et nécessite une approche adaptée.
Pour un accompagnement personnalisé dans l'optimisation de vos infrastructures Linux, n'hésitez pas à me contacter pour une consultation.