Optimisation Proxmox
Guide d'Optimisation Proxmox VE 9.0
📝 Par Ayi NEDJIMI
Ce guide complet vous accompagne dans l'optimisation de votre infrastructure Proxmox VE 9.0. De la configuration système aux réglages avancés du cluster, découvrez les meilleures pratiques pour maximiser les performances, la stabilité et l'efficacité de votre environnement de virtualisation.
1. Introduction
L'optimisation d'une infrastructure Proxmox VE 9.0 est essentielle pour garantir des performances optimales, une haute disponibilité et une utilisation efficace des ressources. Ce guide détaille les techniques d'optimisation à tous les niveaux : système hôte, machines virtuelles, conteneurs, stockage et réseau.
⚠️ Avertissement Important
Les optimisations présentées dans ce guide doivent être testées dans un environnement de développement avant d'être appliquées en production. Chaque infrastructure a des besoins spécifiques qui peuvent nécessiter des ajustements personnalisés.
Objectifs de l'Optimisation
- Performance : Maximiser les IOPS, réduire la latence, optimiser l'utilisation CPU/RAM
- Stabilité : Éviter les contentions de ressources et les points de défaillance
- Efficacité : Optimiser la densité de VMs/CTs par nœud
- Scalabilité : Préparer l'infrastructure pour la croissance future
2. Optimisation du Système Hôte (Host)
2.1. Tuning du Noyau Linux
Les paramètres du noyau jouent un rôle crucial dans les performances globales de l'hyperviseur.
Configuration Swappiness
# Réduire l'utilisation du swap (recommandé pour hosts avec beaucoup de RAM)
echo "vm.swappiness=10" >> /etc/sysctl.conf
# Pour environnements critiques avec RAM suffisante
echo "vm.swappiness=1" >> /etc/sysctl.conf
# Appliquer immédiatement
sysctl -p
💡 Explication
vm.swappiness contrôle l'agressivité avec laquelle le noyau swap les pages mémoire. Une valeur de 10 favorise l'utilisation de la RAM physique, réduisant ainsi la latence liée au swap.
Optimisation du Cache et de la Mémoire
# Augmenter le pourcentage de dirty pages avant flush
echo "vm.dirty_ratio=40" >> /etc/sysctl.conf
echo "vm.dirty_background_ratio=10" >> /etc/sysctl.conf
# Optimiser la libération de mémoire
echo "vm.vfs_cache_pressure=50" >> /etc/sysctl.conf
# Appliquer
sysctl -p
Paramètres Réseau pour Host
# Augmenter les buffers réseau
echo "net.core.rmem_max=134217728" >> /etc/sysctl.conf
echo "net.core.wmem_max=134217728" >> /etc/sysctl.conf
echo "net.ipv4.tcp_rmem=4096 87380 67108864" >> /etc/sysctl.conf
echo "net.ipv4.tcp_wmem=4096 65536 67108864" >> /etc/sysctl.conf
# Optimiser la file d'attente
echo "net.core.netdev_max_backlog=30000" >> /etc/sysctl.conf
# Appliquer
sysctl -p
2.2. Configuration BIOS/UEFI
| Paramètre BIOS | Valeur Recommandée | Impact |
|---|---|---|
| Intel VT-x / AMD-V | Activé | Virtualisation matérielle essentielle |
| Intel VT-d / AMD IOMMU | Activé | Passthrough PCIe (GPU, NIC) |
| C-States | Désactivé (prod) | Latence CPU prévisible |
| Turbo Boost | Activé | Performances CPU en burst |
| Hyper-Threading | Selon workload | Densité vs latence prévisible |
| NUMA | Activé | Optimisation mémoire multi-socket |
2.3. Configuration du Scheduler CPU
# Vérifier le scheduler actuel
cat /sys/block/sda/queue/scheduler
# Pour SSD/NVMe, utiliser noop ou deadline
echo "noop" > /sys/block/nvme0n1/queue/scheduler
# Rendre permanent dans /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="quiet elevator=noop"
# Mettre à jour GRUB
update-grub
3. Optimisation CPU et Mémoire pour VM/CT
3.1. CPU Pinning (Épinglage CPU)
Le CPU pinning permet d'assigner des cœurs physiques spécifiques à des VMs critiques, réduisant la latence et améliorant la prévisibilité des performances.
Identifier la Topologie CPU
# Afficher la topologie complète
lscpu -e
# Ou avec numactl
numactl --hardware
Configuration du CPU Pinning
# Éditer la configuration de la VM
nano /etc/pve/qemu-server/100.conf
# Ajouter les lignes suivantes :
# Assigner les cœurs 0,1,2,3 à cette VM
affinity: 0,1,2,3
# Pour un épinglage NUMA-aware (serveurs multi-socket)
# VM sur NUMA node 0 avec cores 0-7
numa: 1
hostpci0: 0000:00:1f.2,numa=0
⚠️ Attention au Surengagement
Évitez de sur-allouer les cœurs physiques. Si vous avez 8 cœurs physiques, n'assignez pas plus de 8 vCPUs au total en épinglage strict. Laissez toujours 1-2 cœurs pour l'hyperviseur.
3.2. Type de CPU et Optimisation
| Type CPU | Usage | Performances |
|---|---|---|
host |
Meilleures performances, pas de migration live | ⭐⭐⭐⭐⭐ |
kvm64 |
Compatible migration, performances moyennes | ⭐⭐⭐ |
x86-64-v2-AES |
Bon équilibre, support AES-NI | ⭐⭐⭐⭐ |
EPYC / Skylake-Server |
Modèles spécifiques, migration dans même génération | ⭐⭐⭐⭐ |
# Configuration dans /etc/pve/qemu-server/100.conf
cpu: host
# Ou pour permettre la migration avec performances optimales
cpu: x86-64-v2-AES,flags=+aes
3.3. Gestion de la Mémoire
Ballooning
Le ballooning permet une allocation dynamique de la RAM entre les VMs.
# Activer le ballooning dans la VM (défaut : activé)
balloon: 2048
# Désactiver pour VMs critiques nécessitant RAM garantie
balloon: 0
💡 Quand Désactiver le Ballooning ?
- Bases de données (PostgreSQL, MySQL, Oracle)
- Serveurs de cache (Redis, Memcached)
- Applications temps-réel
Huge Pages
# Configurer les huge pages sur l'hôte
echo "vm.nr_hugepages=1024" >> /etc/sysctl.conf
sysctl -p
# Dans la configuration VM
hugepages: 1024
KSM (Kernel Same-page Merging)
# Activer KSM pour économiser la RAM (VDI, environnements homogènes)
systemctl enable ksmtuned
systemctl start ksmtuned
# Vérifier l'état de KSM
cat /sys/kernel/mm/ksm/pages_shared
cat /sys/kernel/mm/ksm/pages_sharing
4. Optimisation du Stockage : ZFS et LVM
4.1. Optimisation ZFS
Configuration ARC (Adaptive Replacement Cache)
# Limiter l'ARC à 50% de la RAM disponible (serveur 64 GB = 32 GB ARC)
echo "options zfs zfs_arc_max=34359738368" > /etc/modprobe.d/zfs.conf
# Pour serveurs dédiés au stockage, augmenter à 75%
echo "options zfs zfs_arc_max=51539607552" > /etc/modprobe.d/zfs.conf
# Appliquer (nécessite reboot ou reload du module)
update-initramfs -u -k all
Optimisation des Pools ZFS
# Création d'un pool optimisé pour VMs
zpool create -o ashift=12 \
-O atime=off \
-O compression=lz4 \
-O recordsize=16K \
vmdata raidz2 sdb sdc sdd sde
# Pour bases de données (IOPS élevés)
zfs set recordsize=8K vmdata/postgres
zfs set primarycache=metadata vmdata/postgres
zfs set logbias=throughput vmdata/postgres
# Pour fichiers volumineux (vidéos, backups)
zfs set recordsize=1M vmdata/backups
zfs set compression=gzip-9 vmdata/backups
| Paramètre | Valeur | Usage |
|---|---|---|
| ashift | 12 (4K) / 13 (8K) | Alignement secteurs (4K pour SSD/NVMe) |
| atime | off | Désactiver mise à jour access time |
| compression | lz4 | Compression rapide, peu d'overhead CPU |
| recordsize | 16K (VM) / 8K (DB) | Taille des blocs ZFS |
| sync | standard / disabled | Synchronisation (disabled = risque perte données) |
SLOG et L2ARC
# Ajouter un SLOG (ZIL) sur NVMe pour les écritures synchrones
zpool add vmdata log /dev/nvme0n1p1
# Ajouter un L2ARC pour étendre le cache de lecture
zpool add vmdata cache /dev/nvme0n1p2
4.2. Optimisation LVM
# Création d'un LV thin-provisionné optimisé
lvcreate -L 500G -T vg0/thinpool
# Ajuster le chunk size pour VMs (512K - 1M)
lvconvert --chunksize 1024K vg0/thinpool
# Créer des volumes pour VMs
lvcreate -V 100G -T vg0/thinpool -n vm-100-disk-0
Tuning LVM pour Performances
# Éditer /etc/lvm/lvm.conf
issue_discards = 1 # Pour SSDs (TRIM)
use_lvmetad = 0 # Désactiver pour clusters
# Optimiser le read-ahead
blockdev --setra 8192 /dev/vg0/vm-100-disk-0
5. Optimisation du Stockage Distribué : Ceph
5.1. Configuration OSD
# Optimisation des OSDs dans /etc/ceph/ceph.conf
[osd]
osd_max_backfills = 1
osd_recovery_max_active = 1
osd_recovery_max_single_start = 1
osd_recovery_sleep_hdd = 0.1
osd_recovery_sleep_ssd = 0
osd_recovery_sleep_hybrid = 0.025
# Pour SSD/NVMe
osd_op_threads = 8
osd_disk_threads = 4
osd_journal_size = 10240
5.2. Pool Ceph Optimisé
# Créer un pool avec réplication 3 et PG optimisés
ceph osd pool create vmdata 128 128
# Définir la taille de réplication
ceph osd pool set vmdata size 3
ceph osd pool set vmdata min_size 2
# Activer les règles CRUSH pour distribution optimale
ceph osd pool set vmdata crush_rule replicated_rule
# Pour VMs critiques : configurer QoS
rbd config image set vmdata/vm-100-disk-0 rbd_qos_iops_limit 5000
rbd config image set vmdata/vm-100-disk-0 rbd_qos_bw_limit 500M
5.3. Client RBD
# Configuration client dans /etc/ceph/ceph.conf
[client]
rbd_cache = true
rbd_cache_size = 268435456 # 256 MB
rbd_cache_max_dirty = 201326592 # 192 MB
rbd_cache_target_dirty = 134217728 # 128 MB
rbd_cache_writethrough_until_flush = false
# Pour performances extrêmes (à tester prudemment)
rbd_readahead_trigger_requests = 10
rbd_readahead_max_bytes = 524288
6. Optimisation Réseau et SDN
6.1. Configuration des Bridges
# Éditer /etc/network/interfaces
auto vmbr0
iface vmbr0 inet static
address 192.168.1.10/24
gateway 192.168.1.1
bridge-ports ens18
bridge-stp off
bridge-fd 0
bridge-vlan-aware yes
bridge-vids 2-4094
6.2. Bonding (Agrégation de Liens)
# LACP (802.3ad) pour redondance et performance
auto bond0
iface bond0 inet manual
bond-slaves ens18 ens19
bond-mode 802.3ad
bond-miimon 100
bond-downdelay 200
bond-updelay 200
bond-lacp-rate fast
bond-xmit-hash-policy layer3+4
auto vmbr0
iface vmbr0 inet static
address 192.168.1.10/24
bridge-ports bond0
bridge-stp off
bridge-fd 0
6.3. Optimisation des Cartes Réseau (NIC)
# Activer les offloads matériels
ethtool -K ens18 gso on gro on tso on
# Augmenter la taille du ring buffer
ethtool -G ens18 rx 4096 tx 4096
# Activer le RSS (Receive Side Scaling) pour multi-cœurs
ethtool -L ens18 combined 4
# Configuration permanente dans /etc/network/interfaces
post-up /usr/sbin/ethtool -K ens18 gso on gro on tso on
post-up /usr/sbin/ethtool -G ens18 rx 4096 tx 4096
6.4. SDN Proxmox (Software Defined Networking)
# Créer une zone VXLAN pour isolation réseau
pvesh create /cluster/sdn/zones --zone vxlan-zone --type vxlan --peers 192.168.1.11,192.168.1.12
# Créer un VNet
pvesh create /cluster/sdn/vnets --vnet vnet100 --zone vxlan-zone --tag 100
# Créer un subnet
pvesh create /cluster/sdn/vnets/vnet100/subnets --subnet 10.100.0.0/24 --gateway 10.100.0.1
# Appliquer la configuration SDN
pvesh set /cluster/sdn
7. Optimisation du Cluster et Haute Disponibilité
7.1. Configuration Corosync
# Éditer /etc/pve/corosync.conf
totem {
version: 2
cluster_name: pve-cluster
transport: knet
token: 3000
token_retransmits_before_loss_const: 10
interface {
linknumber: 0
knet_link_priority: 1
}
# Lien redondant (recommandé)
interface {
linknumber: 1
knet_link_priority: 0
}
}
# Appliquer
systemctl restart corosync pve-cluster
7.2. Groupes HA et Priorités
# Créer un groupe HA
ha-manager groupadd production --nodes node1:2,node2:1,node3:1
# Ajouter une VM au groupe avec priorité maximale
ha-manager add vm:100 --group production --max_restart 3 --max_relocate 3
# Configurer l'état désiré
ha-manager set vm:100 --state started
7.3. Fencing et Watchdog
# Activer le watchdog matériel
modprobe softdog
echo "softdog" >> /etc/modules
# Configuration dans /etc/pve/datacenter.cfg
ha: shutdown_policy=conditional
watchdog: action=reboot
8. Monitoring et Ajustement Continu
8.1. Outils de Monitoring
# Installer les outils de diagnostic
apt install -y sysstat iotop htop nmon atop
# Activer la collecte sysstat
systemctl enable sysstat
systemctl start sysstat
# Analyser les performances I/O
iostat -xz 5
# Analyser les performances réseau
sar -n DEV 5
# Analyser les performances mémoire
vmstat 5
8.2. Métriques Clés à Surveiller
| Métrique | Commande | Seuil d'Alerte |
|---|---|---|
| CPU Wait (iowait) | iostat |
> 20% |
| RAM disponible | free -h |
< 10% |
| Latence disque | iostat -x |
> 10ms (SSD), > 50ms (HDD) |
| Network errors | ip -s link |
> 0.1% |
| Corosync status | corosync-cfgtool -s |
Token lost > 0 |
8.3. Intégration avec Prometheus/Grafana
# Installer l'exporteur Proxmox
apt install -y prometheus-pve-exporter
# Configuration dans /etc/prometheus/pve.yml
default:
user: monitoring@pve
password: your_secure_password
verify_ssl: false
# Redémarrer le service
systemctl restart prometheus-pve-exporter
9. Table de Référence des Commandes
| Catégorie | Commande | Description |
|---|---|---|
| CPU | lscpu -e |
Afficher la topologie CPU |
numactl --hardware |
Afficher les nœuds NUMA | |
| Mémoire | free -h |
Afficher l'utilisation mémoire |
cat /sys/kernel/mm/ksm/pages_shared |
Vérifier KSM | |
| Stockage | zpool status |
État des pools ZFS |
pvesm status |
État de tous les stockages | |
ceph -s |
État du cluster Ceph | |
| Réseau | ethtool ens18 |
Info et stats de la NIC |
brctl show |
Afficher les bridges | |
| Cluster | pvecm status |
État du cluster |
ha-manager status |
État HA | |
| Performance | iostat -xz 5 |
Statistiques I/O en temps réel |
sar -n DEV 5 |
Statistiques réseau |
10. Recettes d'Optimisation par Workload
10.1. Base de Données (PostgreSQL, MySQL)
# Configuration VM
cores: 4
memory: 16384
balloon: 0
cpu: host
numa: 1
# Stockage
# LVM-thin ou ZFS avec recordsize=8K
zfs set recordsize=8K vmdata/db-vm
zfs set primarycache=metadata vmdata/db-vm
zfs set logbias=throughput vmdata/db-vm
# Disque dédié pour logs/WAL sur SSD rapide
scsi1: local-lvm:vm-100-disk-1,iothread=1,cache=writeback,discard=on
10.2. VDI (Virtual Desktop Infrastructure)
# Configuration VM type (clonage linked-clone recommandé)
cores: 2
memory: 4096
balloon: 2048 # Ballooning activé pour densité
# Activer KSM sur l'hôte
systemctl enable ksmtuned
# Templates avec OS optimisé
# - Désactiver indexation
# - Désactiver services inutiles
# - Profil "thin" Windows
10.3. Conteneurs LXC (Micro-services)
# Template Debian/Ubuntu optimisé
pct create 200 local:vztmpl/debian-12-standard_12.0-1_amd64.tar.zst \
--cores 2 \
--memory 2048 \
--swap 0 \
--net0 name=eth0,bridge=vmbr0,ip=dhcp \
--storage local-lvm
# Pour applications critiques : désactiver swap
swap: 0
# Unprivileged containers (sécurité)
unprivileged: 1
11. Checklist Complète d'Optimisation
✅ Checklist Système Hôte
✅ Checklist CPU et Mémoire
✅ Checklist Stockage
✅ Checklist Réseau
✅ Checklist Cluster et HA
✅ Checklist Monitoring
12. Ressources et Références
📚 Documentation Officielle
- Proxmox VE Administration Guide : Documentation complète de référence
- Proxmox Wiki : Guides communautaires et cas d'usage
- Ceph Documentation : Configuration avancée du stockage distribué
- ZFS Documentation : Optimisation et tuning des pools
⚠️ Rappels Importants
- Testez toutes les optimisations en environnement de développement avant production
- Documentez chaque modification pour faciliter le troubleshooting
- Surveillez les métriques après chaque changement pendant au moins 7 jours
- Conservez des backups avant toute modification système critique
- Planifiez une fenêtre de maintenance pour les changements majeurs
Conclusion
L'optimisation d'une infrastructure Proxmox VE 9.0 est un processus continu qui nécessite une compréhension approfondie des workloads, une surveillance régulière des métriques et des ajustements progressifs. En suivant ce guide et en adaptant les recommandations à votre contexte spécifique, vous pouvez atteindre des performances optimales tout en maintenant la stabilité et la fiabilité de votre environnement de virtualisation.
Les gains de performance peuvent être significatifs : jusqu'à +30% d'IOPS avec les optimisations ZFS/Ceph, -20% de latence CPU avec le pinning et NUMA, et une densité accrue de 15-25% VMs/nœud avec le tuning mémoire.
🚀 Besoin d'aide pour optimiser votre infrastructure Proxmox ?
Nos experts vous accompagnent dans l'audit, l'optimisation et le tuning de votre environnement Proxmox VE pour des performances maximales.
Articles connexes
Évolutions Proxmox
Découvrez les évolutions majeures de Proxmox VE de la version 7 à la version 9 : nouvelles fonctionnalités, améliorations de performance et innovations...
Calculateur Sizing
Ayi NEDJIMI Expert Cybersécurité & IA ...
NTP Proxmox
Guide complet de la synchronisation temporelle NTP pour Proxmox VE : configuration Chrony, architecture hiérarchique, et bonnes pratiques pour la...