Vagrant und Chef Performanceoptimierung

Schritt 4: DevOps Performanceoptimierung - Vagrant und Chef tunen

Die Dateien zu diesem Schritt im Workshop findest du als git Repository auf github:

https://github.com/timoschmidt/vagrant-chef-workshop/tree/master/step4

Dieses Repository enthält zwei Vagrant setups. Eins für die gecachte Variante und eins für die ungecachte Variante.

 

High Performance DevOps mit Vagrant und Chef

Bislang haben gelernt, wie wir mit dem Apache Kochbuch einen eigenen VirtualHost aufsetzen können. Je mehr Dienste installiert werden, umso länger dauert die Provisionierung und kann relativ lange dauern. Die Einführung von DevOps kann durch lange Wartezeiten schnell an Akzeptanz verlieren und zu Frust führen. Um dies zu vermeiden, sollten wir die Performance vom Begin an im Blick behalten und optimieren.


Eine Massnahme, wenn es sich beim Hostsystem um ein Linux- oder MacSystem handelt ist es, statt dem VirtualBox Filesystem für das shared folder ein NFS zu verwenden.

 

NFS für VirtualBox synced Folder aktivieren

Das VirtualBox Dateisystem is relative langsam. Vagrant bietet die Möglichkeit das shared Folder mittels NFS einzubinden:

config.vm.synced_folder ".", "/vagrant", nfs: true

NFS ist nur möglich auf einem Linux oder Mac Hostsystem. Wenn das VagrantFile auf mehreren Host Systemen verwendet wird, kann wie folgt dynamisch NFS aktiviert werden:

host = RbConfig::CONFIG['host_os']

# Use nfs when running on a unix system
if host =~ /darwin/
 config.vm.synced_folder ".", "/vagrant", nfs: true
elsif host =~ /linux/
 config.vm.synced_folder ".", "/vagrant", nfs: true
else
 config.vm.synced_folder ".", "/vagrant", mount_options: ['dmode=777','fmode=666']
end

Die reine Verwendung von NFS bringt schon einen Geschwindigkeitsvorteil. Dieser kann ausgebaut werden, indem innerhalb der Box NFS caching verwendet wird.

NFS Caching in der Box verwenden

Der erste Schritt is die Anpassung der Syncfolder Optionen zur Verwendung des NFS cachings:

config.vm.synced_folder ".", "/vagrant", nfs: true, mount_options: ['rw', 'vers=3', 'tcp', 'fsc'] 

Ausserdem muss innerhalb der Box der NFS Caching Dienst installiert und aktiviert werden.

package "cachefilesd" do
  action :install
end

file "/etc/default/cachefilesd" do
  content <<-EOS
RUN=yes
  EOS
  action :create
  mode 0755
end

Die Resourcen des Hostsystems werden optimal genutzt wenn Arbeitsspeicher und CPU des Gastsystems so gesetzt werden, dass maximal verfügbare Ressourcen genutzt werden. Um dies automatisch zu tun können diese Werte dynamisch gesetzt werden.

Dynamische Zuweisung von RAM und CPU

Anhängig vom Hostsystem kann mit der Shell ausgelesen werden, wieviel Speicher und CPUs zur Verfügung stehen. Wenn möglich sollten der VM alle CPU Kerne zur Verfügung gestellt werden. Beim Speicher sollte 1/4 oder 1/2 des Speichers verwendet werden.

 

Mit folgender Anpassung können die Ressourcen per Script im VagrantFile zugewiesen werden:

config.vm.provider :virtualbox do |v|
    if host =~ /darwin/
      cpus = `sysctl -n hw.ncpu`.to_i
      ram = `sysctl -n hw.memsize`.to_i / 1024 / 1024 / 4
    elsif host =~ /linux/
      cpus = `nproc`.to_i
      ram = `grep 'MemTotal' /proc/meminfo | sed -e 's/MemTotal://' -e 's/ kB//'`.to_i / 1024 / 4
    else
      cpus = 2
      ram = 4096
    end
    v.customize ["modifyvm", :id, "--cpus", cpus]
    v.customize ["modifyvm", :id, "--memory", ram]
    v.gui = true
end

DevOps hilft am Puls der Zeit zu  bleiben und mit jeder Provisionierung bzw „vagrant up“ die neuste Serversoftware zu installieren. Dazu werden apt Pakete, tar.gz und git Ressourcen aus dem Internet geladen. Die Anschlüsse sind zwar oftmals schnell genug, dennoch lohnt es sich durch caches Bandbreite zu sparen.

 

Vagrant Cachier Plugin verwenden

Das Cachier Plugin klingt sich in Vagrant ein und cached Ressourcen für eine weitere Installation. Hierbei können caches pro VagrantBox oder auch für mehrere Boxen geteilt werden. Dadurch müssen Ressourcen nicht immer wieder aus dem Internet heruntergeladen werden, sondern liegen lokal vor.

Zunächst muss das Cachier Plugin installiert werden:

 

vagrant plugin install vagrant-cachier

Mit dem folgenden Snipped kann das VagrantFile angepasst werden um das Cachier Plugin zu verwenden, falls es installiert ist:

# Enable caching if plugin installed
if Vagrant.has_plugin?("vagrant-cachier")
  config.cache.scope = :box
end

Vagrant & Chef mit und ohne Cache im Vergleich

Um die Laufzeit zu messen habe ich zehn Provisionierung mit und zehn Provisionierungen ohne Cache durchgeführt:

  • Laufzeit ohne Cache: 51,5 Minuten
  • Laufzeit mit Cache: 29,5 Minuten

 

Und hier nochmal visuell die durchschnittliche dauern pro Lauf in Minuten:

Navigation