Follow Us on Twitter

Containers in Oracle Enterprise Linux

Oktober 2013 - Server virtualisatie is tegenwoordig wel het toverwoord. Grote spelers in de markt zoals VMWare, Microsoft, maar ook Oracle hebben producten die kunnen worden ingezet voor server virtualisatie. Deze virtualisatieplatformen werken volgens het Hypervisor principe. Dat wil zeggen dat het bestaat uit software die meerdere virtuele machines of operating systems (OS’en) tegelijkertijd (parallel) kan laten draaien op dezelfde hardware. Een andere virtualisatietechniek is het gebruik van operating system virtualisatie. In deze variant worden binnen het OS van de host machine processen en resources gebundeld en van de overige processen afgeschermd. Hierdoor ontstaat er een soort "OS binnen een OS". Een bekend voorbeeld van deze vorm van virtualisatie is Solaris Containers. De Linux variant, de Linux Container, is tegenwoordig als preview beschikbaar binnen Oracle Enterprise Linux. In dit Whitebook bekijken we in detail het gebruik van Linux Containers en hoe dit zich verhoudt ten opzichte van Oracle’s Hypervisor virtualisatie: Oracle VM Server. Uiteindelijk worden beide methoden vergeleken aan de hand van een kleine performance test.

Hardware virtualisatie

Een Hypervisor is software die direct op de hardware draait en de mogelijkheid biedt om meerdere virtuele machines tegelijkertijd gebruik te laten maken van deze hardware. Deze virtuele machines zijn niet per se op de hoogte van het feit dat ze op virtuele hardware draaien. Ze zijn in principe ook niet van elkaar op de hoogte. Het zijn op zichzelf staande systemen. De Hypervisor zorgt voor een juiste verdeling van de beschikbare hardware resources over deze virtuele machines. Op deze manier kan een flexibele en hoog beschikbare Infrastructure as a Service (IaaS) worden opgebouwd.

Hypervisor
Figuur 1 Hypervisor type 1: meerdere virtuele machines draaien parallel op dezelfde hardware

Oracle heeft in haar productportfolio Oracle VM Server en Oracle VM Manager om een volledig virtualisatieplatform op te zetten. Op een Oracle VM Server kunnen virtuele machines met verschillende operating systems (zoals bijvoorbeeld Windows, Linux en Solaris) parallel draaien op dezelfde hardware. Door meerdere Oracle VM Servers te groeperen in een server pool kan onder beheer van Oracle’s VM Manager een Infrastructure as a Service worden gecreëerd.

Het gaat te ver om in dit Whitebook uitgebreid in te gaan op dit product. Voor meer details over Oracle VM Server verwijs ik naar mijn andere Whitebook dat dieper ingaat op dit onderwerp [1].

Linux Containers

De OS virtualisatiemethodiek werkt door OS processen en hardware resources te groeperen (toe te wijzen) en af te schermen van de rest. Deze processen en resources worden als het ware in groepen geplaatst. Door binnen een groep een eigen bestandssysteem en netwerk te definiëren ontstaat de illusie van een virtuele machine. Deze container heeft dus haar eigen bestandsysteem, netwerkadres, resources en processen. De container draait echter direct binnen het OS van de host. Linux Containers maken dus direct gebruik van de Linux kernel van de host. Er wordt bij wijze van spreken een Kernel geïnstantieerd in haar eigen root-filesystem. Linux containers worden daarom ook wel "chroot on steroids" genoemd.

Bij Container-virtualisatie is er dus geen sprake van een Hypervisor. Dit betekent dat met de container aanpak geen verschillende OS’en zoals Windows en Solaris parallel gedraaid kunnen worden op dezelfde host. Verschillende Linux versies (RedHat, Fedora, Ubuntu, Arch) kunnen wel simultaan in containers op dezelfde host draaien zolang de Linux Kernel van de host maar compatible is met de desbetreffende Linux versie. Een ander groot nadeel hierbij is dat wanneer binnen een Container de Linux Kernel crasht, de host machine zelf, en alle Containers crashen.

Een voordeel van Linux Containers is dat het vele resources deelt met het host OS. Geladen libraries, de Linux Kernel e.d. hoeven maar één keer in het geheugen worden geladen en worden gedeeld met de verschillende containers. Dit betekent dat in de praktijk iedere volledige Linux container, een "virtuele machine", maar enkele megabytes aan RAM extra hoeft te kosten.

Containers
Figuur 2 Containers: processen en resources worden gegroepeerd en van elkaar afgezonderd.

Linux Containers leunen zwaar op de Control Groups (cgroups) feature uit de Linux Kernel. Met behulp van cgroups kunnen resources (disk i/o, OS processen, geheugen e.d.) van elkaar worden geïsoleerd en gelimiteerd. Cgroups is oorspronkelijk ontwikkeld door Google en is sinds 2007 onderdeel van de Linux Kernel (vanaf versie 2.6.24). Heel kort door de bocht gezegd is een Linux Container een afgezonderd filesysteem waarin een Linux OS wordt geïnstantieerd en beheerd door een cgroup.

Oracle Linux en Linux Containers

In Oracle Enterprise Linux 6 (OEL) is het gebruik van Linux Containers nog een preview feature. Echter, OEL bevat een set handige scripts om containers te maken. Zoals eerder genoemd kan in principe elke Linux distributie in een container draaien, zolang deze maar compatible is met de Kernel van de host (in dit geval de Unbreakable Enterprise Kernel van OEL). (De volgende packages zijn vereist: libcgroup, cgroup-lite, de groupinstall " Virtualization", lxc-devel, lxc).

Opzetten cgroups

Een Linux Container leunt zwaar op de cgroup functionaliteit van de Kernel. Voordat de containers kunnen worden opgezet zal eerst de cgroup moeten worden gemaakt. Cgroups worden in Linux gemount, net als een filesystem. (Een diepgaande beschouwing van het gebruik van cgroups is te vinden op [3]).

mkdir -p /cgroup/cpu-n-ram
mount -t cgroup -o cpu,CPU’set,memory - /cgroup/cpu-n-ram

Met dit commando kunnen individuele CPU’s (cpu) en geheugen worden toegewezen aan cgroup taken, kan het CPU gebruik worden gelimiteerd (CPU’set) en kan het geheugengebruik worden gelimiteerd (memory). De containers gaan hier gebruik van maken.

Netwerk bridge

Omdat een Linux Container haar eigen netwerkconfiguratie krijgt moet de netwerkconfiguratie van de host worden gebridged om zo de container toegang te verlenen tot het netwerk van de host machine. Een bridge "virbr0" kan bijvoorbeeld als volgt worden aangemaakt in /etc/sysconfig/network-scripts/ifcfg-virbr0 :

DEVICE="virbr0"
TYPE="Bridge"
ONBOOT="yes"
DELAY=0
IPADDR=192.168.10.91
NETMASK=255.255.255.0

De standaard containerscripts van Oracle verwachten deze naamgeving. Vervolgens kan de eth0 interface worden aangepast in ifcfg-eth0 :

DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
BRIDGE=virbr0

Het opzetten van een Linux Container

Oracle Enterprise Linux wordt geleverd met een serie templates die een container aan kunnen maken. Na de installatie van de lxc en lxc-devel packages, zijn de scripts te vinden in /usr/share/lxc/templates. Er zijn bijvoorbeeld scripts voor het aanmaken voor een AltLinux, ArchLinux, BusyBox, Debian, Fedora, OpenSUSE, Ubuntu en Oracle Linux container.

Voor het aanmaken van bijvoorbeeld een x86_64 Oracle Enterprise Linux 6.1 container genaamd OL6U1 in /container/OL6U1 is het volgende commando al voldoende:

/usr/share/lxc/templates/lxc-oracle -n OL6U1 -R 6.1 -a x86_64 -p /container/OL6U1

Het script maakt het filesystem aan waarna het automatisch de benodigde OEL 6.1 zal downloaden en installeren via de public YUM repository van Oracle. Het resultaat is een kale Oracle Enterprise Linux 6.1 machine.

Configuring container for Oracle Linux 6.1
Added container user:oracle password:oracle
Added container user:root password:root
Container : /container/OL6U1/rootfs
Config    : /container/OL6U1/config
Network   : eth0 (veth) on virbr0

Natuurlijk is de standaard template naar eigen smaak aan te passen. De container wordt gestart door lxc-start –n OL6U1 te draaien. Daarna kan er mee worden gewerkt.

Oracle Licenties

Oracle producten worden veelal gelicentieerd op basis van de CPU’s waarop het draait (Named User Plus licenties worden hier even buiten beschouwing gelaten). In het geval van virtuele machines op een Oracle VM Server moet de Oracle software gelicentieerd worden voor alle CPU’s die in de server pool aanwezig zijn. Dit kan natuurlijk in de papieren lopen. Daarom kunnen de virtuele machines ook hard partitioned worden, wat inhoudt dat de virtuele CPU’s van een virtuele machine statisch worden gemapt op een specifieke CPU of specifieke cores. In dit geval hoeven alleen de virtuele CPU’s worden gelicentieerd. Dit betekent wel dat veel high-availability features, zoals live-migration, niet meer werken voor deze virtuele machine in de server pool.

Vaak worden meerdere omgevingen of installaties van een OTA (Ontwikkel, Test en Accepstatie) op dezelfde hardware geïnstalleerd. Zo worden dezelfde CPU’s gebruikt, en scheelt dit licentiekosten. Als Oracle de Linux Containers hetzelfde gaat beschouwen als Solaris Containers (vanaf versie 10 en hoger), dan kan resource limitering in Containers beschouwd worden als hard partitoning. Door dan gebruik te maken van Linux Containers kunnen deze omgevingen dus worden gescheiden, de resources specifiek worden toegewezen, terwijl er geen extra licenties benodigd zijn.

Oracle VM Server versus LXC

Hoe verhoudt een Oracle VM Server virtuele machine zich tot een Linux Container? In dit hoofdstuk bespreken we de resultaten van drie performance–tests. Hierin vergelijken we een Virtuele Oracle Enterprise Linux 5.7 draaiend op Oracle VM Server 3.2.2, met een Oracle Enterprise Linux 5.7 Container draaiend op een Oracle Enterprise Linux 6.4 host.

Hardware

De hardware is identiek. Zowel Oracle VM Server als OEL 6.4 draaien beide op een Dell Precision M4300 laptop. Deze laptops bevatten een Intel Core2Duo CPU van 2.19Ghz. Zowel de Virtuele Machine als de container heeft 2GB RAM toegewezen gekregen. De Oracle VM Server heeft geen netwerk storage, maar local storage. De Virtuele Machine op de Oracle VM Server heeft twee virtuele CPU’s geconfigureerd, elk hard partitioned ("gemapt") op een afzonderlijke CPU core van de host machine. Zowel de container als de virtuele machine zijn gelijkwaardige Linux installaties. Er is wel een verschil in de gebruikte Linux Kernel. De Container gebruikt natuurlijk de Linux Kernel van de host, een "OEL6 kernel", terwijl de virtuele machine een "OEL5" Linux Kernel heeft geoptimaliseerd voor de Hypervisor.

Testsuite

Voor het uitvoeren van de tests is de Phoronix Test Suite gebruikt. De tests zijn uitgevoerd op IO, CPU en memory. De gebruikte tests zijn pts/aio-stress (IO), pts/compress-gzip (CPU) en pts/ramspeed (memory).

Resultaten

De resultaten van de test suite zijn samengevat in de onderstaande tabel. Alle waarden zijn gemiddelden.

Test	                 Virtual Machine      Container
I/O Random Write         8,77MB/s             55,66MB/s
CPU Gzip Compression     115,19 sec           62,32 sec
Memory Integer           1096,44 MB/s         1263,40 MB/s
Memory Floating Point    1215,03 MB/s         1321,73 MB/s

Op alle fronten wint de container t.o.v. de virtuele machine. Dit is eigenlijk niet verwonderlijk, de container draait immers min of meer direct op het host OS. Er zit geen virtualisatielaag tussen de hardware en het OS. De cgroups zorgen voor een sandbox voor de processen van de container en eigenlijk draaien deze processen dus gewoon native op de host. De Virtuele Machine daarentegen heeft wel een virtualisatielaag in de vorm van de Hypervisor.

Disk I/O

De Oracle VM Server heeft een virtuele disk, wat als een diskimage op de harde schijf wordt opgeslagen. Er is dus geen directe toegang tot de schijf van de Oracle VM Server. Dit is uiteraard langzamer dan de Container, die wel direct toegang heeft tot het filesystem van de host machine.

CPU

De verschillen in de CPU benchmark zijn significant. Dit is te verklaren doordat een Container direct toegang heeft tot de Linux Kernel en dus native system calls, context switching, process forks e.d. kan doen. Binnen een virtuele machine moet dit allemaal door de Hypervisor heen voordat het de hardware kan benaderen. Op dit vlak scoort de Container virtualisatie significant beter dan de Hypervisor methodiek. (Zie ook [4]).

Memory

Een virtuele machine denkt haar eigen hardware te managen, waaronder dus geheugen allocatie en management. Echter is het de Hypervisor die dit "virtuele geheugen" uiteindelijk aan de daadwerkelijke hardware toewijst. Vooral als er meerdere virtuele machines op een hypervisor draaien moet hier heel wat resource management plaatsvinden. De Container heeft hier geen last van. Alle resource management wordt gedaan door een enkele entiteit: één en dezelfde Linux Kernel. Dit maakt resource sharing ook eenvoudiger, en daarom sneller.

Conclusie

In dit Whitebook zijn twee virtualisatiemethoden besproken. Oracle VM Server en de Linux Containers. Eigenlijk is dit appels met peren vergelijken. Met Oracle VM Server kan een IaaS worden opgezet met alle prachtige cloud features die we daaraan toekennen, zoals live migration van de virtuele machines naar andere fysieke hardware, high-available virtuele machines e.d. Ook kunnen compleet verschillende OS’en parallel draaien op een Oracle VM Server. Allemaal zaken die in een Linux Container niet mogelijk zijn. Linux Containers kunnen wel worden gebruikt om optimaal gebruik te maken van een enkel stuk hardware, en voor het scheiden van diverse applicaties en servers die op dezelfde host draaien. Het opzetten van een Container is een paar minuten werk, en is dus uitermate geschikt om snel een gescheiden (sandbox) Linux omgeving op te zetten. Qua performance is het niet verwonderlijk dat de Linux Containers sneller zijn dan de Oracle VM Server. De afwezigheid van een virtualisatielaag is merkbaar.

Voor beide methodieken is een toepassing. De hypervisor virtualisatie is perfect voor cloud omgevingen waar een IaaS vereist is. Linux Containers zijn uitermate geschikt om een zware host machine op te delen in meerdere afzonderlijke "machines", bijvoorbeeld voor het hosten van een Ontwikkel-, Test- en Acceptatieserver op één server.

Nu is het wachten hoe de Oracle Licenties gaan werken i.c.m. Linux Containers. Wellicht gaan dezelfde regels gelden als voor Solaris Containers en kan de CPU core factor in de licentiekostenberekening worden beperkt door de Oracle software onder te brengen in een Container die maar een beperkt aantal CPU cores toegewezen krijgt.

Referenties

  1. Mijn cloud Whitebook
  2. Wim Coekaerts blog over Containers on Linux
  3. Ginny Henningsen over cgroups
  4. OpenVZ benchmarks. Voorbeeld van een Xen vs. Container benchmarking.
Waardering:
 

Reacties

Nieuwe reactie inzenden

De inhoud van dit veld is privé en zal niet openbaar worden gemaakt.

Meer informatie over formaatmogelijkheden

CAPTCHA
Deze vraag is om te testen of u een persoon bent en om spam te voorkomen
Image CAPTCHA
Enter the characters shown in the image.