Proxmox VE: ZFS primarycache=all ou metadata

Il y a quelque temps, nous avons évalué notre infrastructure Proxmox de différentes manières, principalement pour expérimenter et tirer le maximum du matériel dont nous disposions. Nous avons écrit deux articles sur le sujet pour partager nos résultats et nos conclusions, mais nous n'avons pas pris le temps de partager tous nos résultats. Dans une initiative pour continuer la série, cet article partagera notre découverte concernant un paramètre de réglage de ZFS qui a un assez bon impact sur votre infrastructure Proxmox. Le paramètre en question est l'option primarycache. Il n'est pas disponible dans l'interface graphique de Proxmox. Vous devez utiliser le CLI pour changer la valeur et vous pouvez la configurer par volume ZFS.

Voici ce que le manuel ZFS a à dire sur cette option :

primarycache=all | none | metadata
Controls what is cached in the primary cache (ARC). If this property is set
to all, then both user data and metadata is cached. If this property is set
to none, then neither user data nor  metadata is cached. If this property is
set to metadata, then only metadata is cached. The default value is all.

À la lecture de cette description, on pourrait penser que la mise en cache est meilleure et qu'il faut l'activer. C'est faux. Dans une machine virtuelle, si vous lui donnez suffisamment de mémoire, l'OS invité met déjà en cache les données du système de fichiers. L'OS invité peut également prendre de meilleures décisions concernant ce qui doit être mis en cache puisqu'il est plus proche de l'application. En fait, l'activation du cache primaire ZFS pour la machine virtuelle n'est pas utile car elle crée deux caches, un dans le système d'exploitation invité et un autre dans le système d'exploitation hôte. Avec cette solution, il est fort possible que les mêmes données soient stockées deux fois en mémoire. Les gens peuvent dire que l'ARC (adaptive replacement cache) est un meilleur algorithme de mise en cache, mais c'est un gaspillage, car l'OS invité n'a pas d'accès direct à l'ARC.

Quant à LXC, c'est un peu différent. LXC a un accès direct à l'ARC. L'augmentation des performances fournie par le primarycache dépend fortement de votre charge de travail. On pourrait penser que primarycache=all pour LXC devrait être bénéfique. Avec notre benchmark, nous observons des résultats différents. Pour vérifier si primarycache=all est bénéfique pour votre charge de travail, le mieux est de le tester et d'utiliser diverses statistiques ARC pour vérifier si l'ARC est effectivement utilisé ou non. Jetez un coup d'oeil à : /usr/sbin/arcstat.py et /usr/sbin/arc_summary.py.

Pour modifier cette option, vous devez identifier le bon zvol à mettre à jour.

$ sudo zfs list
NAME                           USED  AVAIL  REFER  MOUNTPOINT
rpool                          111G   369G   140K  /rpool
rpool/ROOT                    30.9G   369G   140K  /rpool/ROOT
rpool/ROOT/pve-1              30.9G   369G  30.9G  /
rpool/data                    70.4G   369G  6.98G  /rpool/data
rpool/data/subvol-116-disk-1  2.14G  5.86G  2.14G  /rpool/data/subvol-116-disk-1
rpool/data/subvol-117-disk-1  2.15G  5.85G  2.15G  /rpool/data/subvol-117-disk-1
rpool/data/subvol-120-disk-1  2.14G  5.86G  2.14G  /rpool/data/subvol-120-disk-1
rpool/data/subvol-125-disk-1  3.37G  28.6G  3.37G  /rpool/data/subvol-125-disk-1
rpool/data/vm-112-disk-1      21.5G   369G  21.0G  -
rpool/data/vm-114-disk-1      8.02G   369G  8.02G  -
rpool/data/vm-119-disk-1      16.9G   369G  16.4G  -
rpool/data/vm-121-disk-1      1.96G   369G  1.96G  -
rpool/data/vm-121-disk-2      5.57M   369G  5.57M  -
rpool/data/vm-122-disk-1      1.45G   369G  1.45G  -
rpool/data/vm-123-disk-1      1.46G   369G  1.46G  -
rpool/data/vm-124-disk-1      1.46G   369G  1.46G  -
rpool/subvol-108-disk-1       1.03G  7.13G   893M  /rpool/subvol-108-disk-1
rpool/swap                    8.50G   375G  2.77G  -

Dans notre environnement, rpool/data est notre stockage pour la machine virtuelle Proxmox et LXC. Si vous voulez changer cette option pour tout votre environnement, vous pouvez définir l'option sur celui-ci. Sinon, vous pouvez choisir de changer l'option uniquement sur une VM spécifique en changeant la valeur pour un zvol spécifique.

$ sudo zfs get primarycache 
NAME                            PROPERTY      VALUE         SOURCE
rpool                           primarycache  all           default
rpool/ROOT                      primarycache  all           default
rpool/ROOT/pve-1                primarycache  all           default
rpool/data                      primarycache  metadata      local
rpool/data/subvol-116-disk-1    primarycache  metadata      inherited from rpool/data
rpool/data/subvol-117-disk-1    primarycache  metadata      inherited from rpool/data
rpool/data/subvol-120-disk-1    primarycache  metadata      inherited from rpool/data
rpool/data/subvol-125-disk-1    primarycache  all           local
rpool/data/vm-112-disk-1        primarycache  metadata      inherited from rpool/data
rpool/data/vm-114-disk-1        primarycache  metadata      inherited from rpool/data
rpool/data/vm-119-disk-1        primarycache  metadata      inherited from rpool/data
rpool/data/vm-121-disk-1        primarycache  all           local
rpool/data/vm-121-disk-2        primarycache  metadata      inherited from rpool/data
rpool/data/vm-122-disk-1        primarycache  metadata      inherited from rpool/data
rpool/data/vm-123-disk-1        primarycache  metadata      inherited from rpool/data
rpool/data/vm-124-disk-1        primarycache  metadata      inherited from rpool/data
rpool/subvol-108-disk-1         primarycache  all           default
rpool/swap                      primarycache  metadata      local
sudo zfs set primarycache=metadata rpool/data/vm-112-disk-1

Résultats


Avec ce test, nous ne voyons pas une grande différence entre les deux options. C'est tout de même suffisant pour montrer l'avantage d'utiliser primarycache=metadata pour LXC.

Avec ce test, nous voyons clairement comment LXC peut bénéficier de la définition de primarycache=metadata. Avec KVM à l'autre bout, nous ne voyons que peu ou pas d'avantages.

Le réglage de primarycache=metadata pour LXC offre un meilleur débit car le système d'exploitation n'a pas à perdre de temps pour stocker les données dans le cache. D'autre part, le résultat de KVM est déroutant. Les performances sont meilleures avec primarycache=all.

Ce test n'est pas concluant. La différence entre les résultats n'est pas significative.

Ce test n'est pas concluant. La différence entre les résultats n'est pas significative.

Conclusion

Comme vous pouvez le voir dans les résultats, l'option primarycache a un impact sur les performances mais pas pour toutes les charges de travail. Dans certains tests, nous ne voyons aucune différence ! Alors que dans d'autres tests, elle fournit une augmentation de plus de 200%.

Avec toutes ces informations, vous ne savez peut-être plus s'il est bon ou non d'activer le primarycache et quelle option est la meilleure pour vous. Voici une règle d'or : définissez toutes les VM et LXC sur primarycache=metadata et pour une charge de travail très, très spécifique, définissez-le sur primarycache=all.

Avec ces paramètres, votre système ne gaspille pas de mémoire pour l'ARC et cette mémoire peut être utilisée pour autre chose, comme plus de mémoire pour votre VM.


dans Techies
zfs-format-disk : Remplacer un disque ZFS sur Proxmox VE