Retour : Proxmox VE

Principe

La RAM de l'hôte se partage entre :

Consommateur Remarque
Proxmox lui-même 1 à 2 Go
Cache ZFS (ARC) Si ZFS est utilisé, souvent la plus grosse part (voir plus bas)
VM RAM attribuée à chacune, réservée dès le démarrage (sauf ballooning)
Conteneurs LXC Consomment uniquement ce qu'ils utilisent, dans la limite fixée

⚠️ Contrairement au CPU, la RAM supporte mal la surallocation : si l'hôte manque de mémoire, il utilise son swap (lenteurs) puis le noyau arrête des processus — souvent la VM la plus gourmande (OOM killer). Garder une marge de 10 à 20 % de RAM libre sur l'hôte.


Mémoire d'une VM

Via interface graphique

VM → Hardware → Memory → Edit → cocher Advanced :

Champ Rôle
Memory (MiB) Quantité maximale de RAM vue par la VM
Minimum memory (MiB) Plancher en dessous duquel le ballooning ne descend pas
Ballooning Device Active le pilote de ballooning
Shares Priorité relative lors de la récupération de mémoire
En ligne de commande
# 8 Go fixes, ballooning désactivé
qm set 100 --memory 8192 --balloon 0

# 8 Go maximum, peut redescendre à 4 Go si l'hôte manque de mémoire
qm set 100 --memory 8192 --balloon 4096

qm config 100 | grep -E 'memory|balloon'

Le ballooning

Le pilote VirtIO balloon, installé dans l'invité, « gonfle » pour rendre de la mémoire à l'hôte quand celui-ci dépasse 80 % d'utilisation, puis la restitue à la VM quand elle se libère.

✅ À utiliser ❌ À éviter
VM peu chargées, serveurs de services légers Bases de données, VM avec des pics de mémoire
Hôte dont la RAM est un peu juste VM avec passthrough PCI (GPU, carte réseau) : la RAM doit être fixe

Pour voir ce que la VM utilise réellement, l'agent QEMU doit être actif (sinon Proxmox affiche la mémoire allouée, pas la mémoire utilisée) :

qm set 100 --agent enabled=1

KSM (déduplication de la mémoire)

KSM (Kernel Samepage Merging) fusionne les pages mémoire identiques entre VM (par exemple plusieurs VM Windows identiques). Il est géré par le service ksmtuned, qui ne l'active que lorsque l'hôte dépasse 80 % de RAM utilisée.

# Mémoire économisée par KSM (en pages de 4 Ko)
cat /sys/kernel/mm/ksm/pages_sharing

systemctl status ksmtuned

⚠️ KSM consomme du CPU et, en théorie, ouvre des attaques par canal auxiliaire entre VM. Sur un hôte qui héberge des VM de confiance différente, le désactiver : systemctl disable --now ksmtuned.


Cache ZFS (ARC)

ZFS utilise la RAM libre comme cache de lecture (ARC). Depuis Proxmox VE 8.1, l'installeur limite l'ARC à 10 % de la RAM (16 Go au maximum) sur une nouvelle installation ; sur une installation plus ancienne, il peut occuper jusqu'à la moitié de la RAM.

# Taille actuelle et maximale de l'ARC
arc_summary | grep -A3 "ARC size"
cat /sys/module/zfs/parameters/zfs_arc_max

Fixer la taille maximale (ici 8 Go = 8 × 1024³ octets) :

echo "options zfs zfs_arc_max=8589934592" > /etc/modprobe.d/zfs.conf

# Appliquer immédiatement
echo 8589934592 > /sys/module/zfs/parameters/zfs_arc_max

# Conserver le réglage au démarrage (racine sur ZFS)
update-initramfs -u -k all
RAM de l'hôte ARC maximal conseillé
16 Go 2 à 4 Go
32 Go 4 à 8 Go
64 Go et plus 8 à 16 Go

💡 Un ARC trop petit ralentit les lectures disque ; un ARC trop grand prive les VM de mémoire. Ajuster selon le taux de succès du cache (arc_summary, ligne Hit ratio).


Mémoire des conteneurs LXC

Un conteneur n'a pas de RAM réservée : il consomme ce dont ses processus ont besoin, dans la limite fixée.

# 2 Go de RAM, 512 Mo de swap
pct set 200 --memory 2048 --swap 512

pct config 200 | grep -E 'memory|swap'

La limite se modifie à chaud, sans redémarrer le conteneur.


Swap de l'hôte

Le swap sert de dernier recours ; une utilisation régulière signale un manque de RAM.

free -h
swapon --show

# Ne swapper qu'en dernier recours
sysctl vm.swappiness=10
echo "vm.swappiness=10" > /etc/sysctl.d/99-swappiness.conf

💡 Une installation ZFS ne crée pas de swap par défaut : un swap sur un volume ZFS est déconseillé.


Surveiller la consommation

free -h

# VM et leur mémoire configurée
qm list

# Processus QEMU les plus gourmands
ps -eo pid,rss,cmd --sort=-rss | grep -m5 '[k]vm'

Bonnes pratiques