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.