Proxmox VE: Performance de KVM vs. LXC

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:

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 physique LXC KVM
CPU 2 x Intel Xeon E5620 @ 2.40GHz (16 Cores) 2 Cores 2 Cores
Motherboard Supermicro X8DTL Supermicro X8DTL QEMU Standard PC (i440FX + PIIX 1996)
Chipset Intel 5500 I/O + ICH10R N/A Intel 440FX- 82441FX PMC
Mémoire 24576MB 512MB 512MB
Disques 4 x 250GB Seagate ST250DM000-1BD14 8GB subvol (recordsize=128K) 8GB zvol (volblocksize=8K)
Carte réseau Intel 82574L Gigabit Connection N/A Red Hat Virtio device
Système d'exploitation Debian GNU/Linux 8 (Proxmox VE) Debian 8.7 Debian 8.7
Kernel 4.4.35-2-pve (x86_64) 4.4.35-2-pve (x86_64) 3.16.0-4-amd64 (x86_64)
Compilateur GCC 4.9.2 GCC 4.9.2 GCC 4.9.2
Système de fichier zfs ext4 ext4

Résultats

### Multiple Sequence Alignment * Hôte Physique: 6.75 sec * LXC: 25.14 sec * KVM: 20.7 sec {: .barchart} 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 {: .barchart} 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 {: .barchart} 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 {: .barchart} 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 {: .barchart} 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 {: .barchart} 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 {: .barchart} 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 {: .barchart} 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 {: .barchart} 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 {: .barchart} 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 {: .barchart} 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 {: .barchart} 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.
### Pfam Database Search * Hôte Physique: 13.63 sec * LXC: 38.99 sec * KVM: 43.43 sec {: .barchart} 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 {: .barchart} 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 {: .barchart} 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 {: .barchart} 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 Physique LXM KVM
mafft: Multiple Sequence Alignment (seconds) 6.75 25.14 20.71
gcrypt: CAMELLIA256-ECB Cipher (microseconds) 3473 3493 3540
tscp: AI Chess Performance (nodes/sec) 545872 544252 559410
himeno: Poisson Pressure Solver (MFLOPS) 1109.26 1111.99 1054.58
compress-7zip: Compress Speed Test (MIPS) 23825 5034 4271
c-ray: Total Time (sec) 19.48 76.85 79.2
compress-pbzip2: 256MB File Compression (sec) 7.94 208.31
encode-flac: WAV To FLAC (sec) 13.22 13.14 14.7
encode-mp3: WAV To MP3 (sec) 22.22 22.18 22.39
apache: Static Web Page Serving (request/sec) 15595.2 7008.57 5381.83
aio-stress: Random Write (MB/s) 646.06 309.01 314.95
iozone: Size: 4GB - Disk Test: Read Performance (MB/s) 1370.47 1319.17 375.62
iozone: Size: 4GB - Disk Test: Write Performance (MB/s) 334.74 351.66 257.11
hmmer: Pfam Database Search (sec) 13.63 38.99 43.43
compress-lzma: 256MB File Compression (sec) 456.85 455.46 524.6
phpbench: PHP Benchmark Suite (score) 101832 103100 101481
smallpt: Global Illumination Renderer; 100 Samples (sec) 80 409 418

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.