Depuis la création de l’entreprise en 2011, nous utilisons diverses technologies de virtualisation. Les bénéfices de ces technologies sont plutôt indiscutables: réduction des coûts et facilité de gestion (sauvegarde, migration, clonage, etc.) D’ailleurs, la virtualisation est devenue un incontournable dans le domaine des technologies de l’information.

Bien que nous ayons une bonne expérience avec les technologies de virtualisation telles que VirtualBox et VMWare, notre utilisation de KVM et LXC est assez récente. Depuis un moment déjà, nous avons migré l’ensemble de notre infrastructure vers Proxmox, une solution de virtualisation tout-en-un.

Afin de tirer le meilleur partir de cette nouvelle infrastructure, nous désirons vérifier quelles sont les bonnes configurations pour obtenir les meilleures performances possible de nos machines virtuelles.

Pour commencer notre analyse, nous désirons comparer les performances entre les deux technologies de virtualisation disponible avec Proxmox, soit KVM et LXC:

  • KVM (Kernel-based Virtual Machine) est un hyperviseur intégré dans le noyau de Linux. KVM est une technologie de virtualisation similaire à ce qui est offert par VirtualBox ou VMWare. Tout le matériel est émulé par l’hyperviseur. Ainsi, le système d’exploitation croit s’exécuter sur une vraie machine physique. Il est donc possible d’installer un système d’exploitation sans altération.
  • LXC (Linux Containers) est une autre technologie de virtualisation qui est aussi intégrée dans le noyau Linux. Par contre, celle-ci utilise l’isolement pour séparer l’exécution de chaque machine. En comparaison à KVM, le matériel n’est pas émulé, il est partagé par le système hôte. Ainsi, chaque machine virtuelle utilise le même noyau. Il serait donc impossible d’installer MS Windows dans un conteneur LXC. LXC est une technologie de virtualisation similaire à ce qui est offert par OpenVZ et Docker.

Vu la nature de LXC, on s’attend à ce qu’il surpasse KVM. C’est ce que l’on désire vérifier avec nos tests.

Pour effectuer l’ensemble de nos tests de performance de manière fiable et reproductible, nous avons utilisé Phoronix Test Suite.

Voici les spécifications techniques du serveur physique et des deux machines virtuelles.

 Hôte physiqueLXCKVM
CPU2 x Intel Xeon E5620 @ 2.40GHz (16 Cores)2 Cores2 Cores
MotherboardSupermicro X8DTLSupermicro X8DTLQEMU Standard PC (i440FX + PIIX 1996)
ChipsetIntel 5500 I/O + ICH10RN/AIntel 440FX- 82441FX PMC
Mémoire24576MB512MB512MB
Disques4 x 250GB Seagate ST250DM000-1BD148GB subvol (recordsize=128K)8GB zvol (volblocksize=8K)
Carte réseauIntel 82574L Gigabit ConnectionN/ARed Hat Virtio device
Système d’exploitationDebian GNU/Linux 8 (Proxmox VE)Debian 8.7Debian 8.7
Kernel4.4.35-2-pve (x86_64)4.4.35-2-pve (x86_64)3.16.0-4-amd64 (x86_64)
CompilateurGCC 4.9.2GCC 4.9.2GCC 4.9.2
Système de fichierzfsext4ext4

Résultats

Multiple Sequence Alignment

  • Hôte Physique: 6.75 sec
  • LXC: 25.14 sec
  • KVM: 20.7 sec

Dans ce test qui permet de vérifier la puissance du CPU en effectuant des calculs d’alignement d’ADN (pas de multi-thread), on voit que KVM a une avance considérable sur LXC. La grande différence entre l’hôte physique et KVM s’explique par le nombre de CPU alloué : 16 CPU pour l’hôte vs 2 CPU pour KVM.

CAMELLIA256-ECB Cipher

  • Hôte Physique: 3473 ms
  • LXC: 3493 ms
  • KVM: 3540 ms

Ce test permet aussi vérifier la performance d’un seul CPU en effectuant des calcules de cryptographie (pas de multi-thread). Les trois tests donnent des résultats similaires. On note que LXC a une légère avance sur KVM.

AI Chess Performance

  • Hôte Physique: 545872 nodes/sec
  • LXC: 544252 nodes/sec
  • KVM: 559410 nodes/sec

Ce test vérifie la performance d’un seul CPU en simulant une partie d’échecs (pas de multi-thread). Les trois tests donnent des résultats similaires. On note que LXC a une légère avance sur KVM.

Poisson Pressure Solver

  • Hôte Physique: 1109.26 MFLOPS
  • LXC: 1111.99 MFLOPS
  • KVM: 1054.58 MFLOPS

Ce test vérifie aussi la performance d’un seul CPU en résolvant des équations linéaires (pas de multi-thread). Les trois tests donnent des résultats similaires. On note que LXC a une légère avance sur KVM.

7zip Compress Speed Test

  • Hôte Physique: 23825 MIPS
  • LXC: 5034 MIPS
  • KVM: 4271 MIPS

Ce test vérifie essentiellement la performance du CPU en compressant des données (avec multi-thread). L’hôte physique a une grande avance qui s’explique par le nombre de CPU alloué : 16 CPU pour l’hôte vs 2 CPU pour KVM. On note que LXC a une légère avance sur KVM.

C-Ray Total Time

  • Hôte Physique: 19.48 sec
  • LXC: 76.85 sec
  • KVM: 79.2 sec

Ce test vérifie la performance du CPU en calculant des lancers de rayons. Ce test permet de vérifier la performance du CPU dans le calcul des nombres flottants (avec multi-thread). L’hôte physique a une grande avance qui s’explique par le nombre de CPU alloué : 16 CPU pour l’hôte vs 2 CPU pour KVM. On note que LXC a une légère avance sur KVM.

WAV To FLAC

  • Hôte Physique: 13.22 sec
  • LXC: 13.14sec
  • KVM: 14.7 sec

Ce test vérifie la performance d’un seul CPU en convertissant un fichier de musique du format WAV à FLAC (pas de multi-thread). Les trois tests donnent des résultats similaires. On note que LXC a une légère avance sur KVM.

WAV To MP3

  • Hôte Physique: 22.22 sec
  • LXC: 22.18 sec
  • KVM: 22.39 sec

Ce test vérifie la performance d’un seul CPU en convertissant un fichier de musique du format WAV à MP3 (pas de multi-thread). Les trois tests donnent des résultats similaires. On note que LXC a une légère avance sur KVM.

Apache Static Web Page Serving

  • Hôte Physique: 15595.2 request/sec
  • LXC: 7008.57 request/sec
  • KVM: 5381.83 request/sec

Ce test représente une utilisation typique d’un serveur ce qui teste le CPU, les disques et la mémoire. L’hôte physique fournit évidemment de meilleures performances, suivie de LXC et KVM.

Les résultats de ce test confirment bien notre hypothèse initiale: LXC est plus performant que KVM.

Aio Stress Random Write

  • Hôte Physique: 646.06 MB/s
  • LXC: 309.01 MB/s
  • KVM: 314.95 MB/s

Ce test peut s’apparenter à l’utilisation d’une base de données qui fait beaucoup d’écriture sur disque. Étonnamment, KVM a une légère avance sur LXC.

iozone: Size: 4GB - Disk Test: Read Performance

  • Hôte Physique: 1370.47 MB/s
  • LXC: 1319.17 MB/s
  • KVM: 375.62 MB/s

Ce test vérifie la lecture aléatoire sur disque. Les résultats fournis par ce test ne sont pas représentatifs. Les disques présents dans le serveur ne sont pas en mesure de fournir 1300MB/s. Il faut en déduire que la cache du système accroit considérablement les résultats.

Ce qu’il faut en conclure: LXC est en mesure de tirer le maximum de performance de la cache système, alors que KVM n’arrive pas à en tirer parti probablement parce qu’il n’a pas autant de mémoire que l’hôte.

iozone: 4GB - Disk Test: Write Performance

  • Hôte Physique: 334.74 MB/s
  • LXC: 351.66 MB/s
  • KVM: 257.11 MB/s

Ce test vérifie l’écriture aléatoire sur disque. Ici aussi, il faut comprendre que l’on mesure la mise en cache des données. Les résultats fournis par ce test ne sont pas représentatifs.

  • Hôte Physique: 13.63 sec
  • LXC: 38.99 sec
  • KVM: 43.43 sec

Ce test simule une requête dans une base de données. Sans surprise, KVM est toujours le dernier en ligne, mais offre des performances raisonnables.

LZMA 256MB File Compression

  • Hôte Physique: 456.85 sec
  • LXC: 455.46 sec
  • KVM: 524.6 sec

Ce test vérifie essentiellement la performance d’un seul CPU en compressant des données avec l’algorithme LZMA. Je n’arrive pas à expliquer l’avance de KVM dans ce test.

PHP Benchmark Suite

  • Hôte Physique: 101832 score
  • LXC: 103100 score
  • KVM: 101481 score

Ce test vérifie essentiellement la performance d’un seul CPU en exécutant des scripts PHP. Les trois tests donnent des résultats très similaires. LXC a toujours une petite avance sur KVM.

Illumination Renderer 100 Samples

  • Hôte Physique: 80 sec
  • LXC: 409 sec
  • KVM: 418 sec

Ce test vérifie la performance du CPU en calculant des trajectoires de lumière pour générer une image. L’hôte physique a une grande avance qui s’explique par le nombre de CPU alloué : 16 CPU pour l’hôte vs 2 CPU pour KVM. On note que LXC a une légère avance sur KVM.

Tableaux des Résultats

 Hôte PhysiqueLXMKVM
mafft: Multiple Sequence Alignment (seconds)6.7525.1420.71
gcrypt: CAMELLIA256-ECB Cipher (microseconds)347334933540
tscp: AI Chess Performance (nodes/sec)545872544252559410
himeno: Poisson Pressure Solver (MFLOPS)1109.261111.991054.58
compress-7zip: Compress Speed Test (MIPS)2382550344271
c-ray: Total Time (sec)19.4876.8579.2
compress-pbzip2: 256MB File Compression (sec)7.94208.31 
encode-flac: WAV To FLAC (sec)13.2213.1414.7
encode-mp3: WAV To MP3 (sec)22.2222.1822.39
apache: Static Web Page Serving (request/sec)15595.27008.575381.83
aio-stress: Random Write (MB/s)646.06309.01314.95
iozone: Size: 4GB - Disk Test: Read Performance (MB/s)1370.471319.17375.62
iozone: Size: 4GB - Disk Test: Write Performance (MB/s)334.74351.66257.11
hmmer: Pfam Database Search (sec)13.6338.9943.43
compress-lzma: 256MB File Compression (sec)456.85455.46524.6
phpbench: PHP Benchmark Suite (score)101832103100101481
smallpt: Global Illumination Renderer; 100 Samples (sec)80409418

Analyse des résultats

Avec ces résultats, on observe que les tests liés au CPU fournissent des résultats comparables dans LXC et KVM si le nombre de CPU alloué aux machines virtuelles est le même. On observe aussi que la performance de l’hôte physique, de LXC et KVM sont très similaire quand le test vérifie la performance d’une seul CPU. Il faut toutefois noter que LXC revient gagnant avec une petite avance dans la majorité des tests.

Pour ce qui est des tests reliés aux disques, on note une différence notable entre LXC et KVM. KVM étant plus lent que LXC dans tous les tests d’écriture ou lecture sur disque.

On peut en conclure que KVM et LXC fournissent des performances similaires si votre application est strictement liée au CPU. LXC et KVM profite au maximum des CPU qui leur sont alloué. En fait, il y a quasiment aucune perte de performance en comparaison avec l’hôte physique.

Par contre, quand l’écriture ou la lecture sur disque est impliqué, KVM et LXC performe moins bien que l’hôte physique. La lecture et l’écriture sur disque est donc le talon d’achile de la virtualisation. C’est donc dans cette direction qu’il faut travailler si l’on veut améliorer la performance de nos machines virtuelles.

De façons générale, LXC fournit manifestement de meilleures performances que KVM. Cela dit, KVM n’est pas très loin derrière.

Suivant ces résultats, devriez-vous convertir tout votre environnement vers LXC ? Peut-être pas. L’effort requis pour convertir plusieurs machines virtuelles en comparaison au petit gain de performance n’en veut probablement pas la peine. De plus, la performance n’est que l’un des facteurs parmi plusieurs autres dans votre prise de décision entre KVM et LXC. De plus, dans les prochains articles, on va determine quel sont les meilleurs paramètres de configuration pour améliorer les performances en écriture et lecture sur disque de KVM et LXC.