Ich glaube ich erwähnte es schon: eines meiner Steckenpferde bei der Arbeit ist das Monitoring, also die Überwachung von Rechnern. Bei bestimmten Überwachungen bietet es sich an, den überwachten Rechner seine Messwerte selbst schicken zu lassen. Oft heißt es „es reicht wenn wir den Wert alle fünf Minuten kriegen“, also bietet sich ein Cronjob mit einem geschickt platzierten „*/5“ an.

Nachteil dabei: unter Umständen wird das Monitoring genau alle fünf Minuten zeitgleich mit hunderten Werten von hunderten Rechnern beworfen.

Um das zu entzerren habe ich mir was formschönes ausgedacht:

Diese Zeile bewirkt am Anfang eines Skriptes, dass vor der Ausführung eine variable Zeit gewartet wird. Das charmante daran: die Zeit ist abhängig vom Hostnamen, dem Skriptnamen und den Parametern die dem Skript übergeben werden. Es ist keine wirklich zufällige Zeit, das heißt dass man sich darauf verlassen kann dass das Skript ziemlich genau alle fünf Minuten einen Wert ausgibt.

Oh, falls das cut irritiert: wenn ich die hexadezimale Prüfsumme einfach mit $((0x…)) dezimal mache kommt da unter Umständen ein negativer Wert raus. Meine sleep-Version unterstützt leider keine Zeitreisen… ;-)

Hat jemand einen Vorschlag wie ich das noch eleganter hinkriegen würde?

EDIT: Vielleicht ist diese Variante noch schöner. Man umgeht mit Awk den ‚bashismus‘ mit dem Modulo, dafür spart man sich aber auch den Aufruf von cut.

Ich persönlich mag ja Skriptsprachen. Wenn es irgendwie geht greife ich gerne zu Python, wenn es sein muss skripte ich aber auch in Perl oder PHP. Sprachen mit P halt. :-)

Ein Problem das ‚richtige Programmierer‘ immer wieder mit Skriptsprachen haben ist, dass die in der Regel dynamisch typisiert sind. Man muss halt nicht explizit sagen was in einer Variable stehen darf, man benutzt sie einfach.

Gerade bin ich auf ein erschreckendes Beispiel gestoßen das zeigt dass dynamische Variablen tatsächlich böse schlecht implementiert sein können. Ich war noch nie ein Freund von Javascript, aber…

rschaten% js
js> 5+2
7
js> 5-2
3
js> "5"+2
"52"
js> "5"-2
3

Schaurig, oder? 8-O

Glücklicherweise machen andere Sprachen das besser:

rschaten% python
Python 3.3.2 (default, Sep 6 2013, 09:30:10)
[GCC 4.8.1 20130725 (prerelease)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 5+2
7
>>> 5-2
3
>>> "5"+2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Can't convert 'int' object to str implicitly
>>> "5"-2
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for -: 'str' and 'int'

Dass die Fehlermeldung sich hier zwischen + und – unterscheidet liegt daran dass der Operator + in Python auch für die Konkatenierung von Strings verwendet wird. Mein Vertrauen in Python besteht weiterhin… :-)

Manchmal habe ich das. Heute zum Beispiel.

Ich beschäftige mich eine Weile mit einem Thema. Meistens habe ich vorher schon was davon gehört, oder darüber gelesen. Manchmal habe ich mich auch schon etwas eingelesen, oder etwas rumprobiert. Nach einer Weile des unbeholfenen Rumstocherns werden Beispiele konkret. Ich stelle mir gezielt Aufgaben, und irgendwann sind die Lösungen einfach. Es passt einfach alles, und alles ergibt einen Sinn.

In den letzten Tagen habe ich mich intensiv mit Puppet beschäftigt. In der Theorie weiß ich schon lange was es tut, und die Beschäftigung damit stand genauso lange ganz oben auf der Liste der Sachen die ich mir noch aneignen will.

Zu Recht, wie mir scheint.

Heute hatte ich mehrere ach-so-geht-das-Momente. Zusammen ergeben die dann einen veritablen warum-hab-ich-das-nicht-schon-immer-so-gemacht-Moment. :-)

Ich bin mir absolut darüber im klaren dass es im Puppet-Umfeld jede Menge zu entdecken gibt, und dass das sicher mit einer Menge Arbeit und bisweilen auch mit Frust verbunden ist. Aber dieser warum-hab-ich-das-nicht-schon-immer-so-gemacht-Moment erleichtert die Beschäftigung damit ungemein.

Soviel dazu. Muss weg. Manifeste verfassen… ;-)

Bei der Arbeit mit einem Softwarepaket fiel die Bemerkung dass man den ganzen Mist wegwerfen und neu entwickeln sollte. Mir fiel dazu ein dass es ein Tool gibt mit dem die Entwicklungskosten für Softwareprojekte abgeschätzt werden kann: ohloh.net berücksichtigt dazu im wesentlichen die Anzahl der Quellcodezeilen, das darunterliegende COCOMO-Modell, das zwar nicht völlig aus der Luft gegriffen ist, effektiv aber wohl auch nicht viel mehr bringt als eine Glaskugel.

Trotzdem: die Zahlen die dabei rausfallen sind schon beeindruckend. Selbst wenn man nur die Anzahl der Codezeilen ansieht, nicht die daraus folgenden Kosten (die mit $55k pro Personenjahr angesetzt werden):

Projekt Codebase Size Estimated Effort Estimated Cost
Apache HTTP Server 2.268.153 Zeilen 645 Personenjahre 35.476.462 Dollar
Apache OpenOffice 23.105.092 Zeilen 7361 Personenjahre 404.853.843 Dollar
Gimp 728.523 Zeilen 201 Personenjahre 11.034.951 Dollar
GNU Compiler Collection 6.435.383 Zeilen 1956 Personenjahre 107.585.880 Dollar
Linux Kernel 16.411.777 Zeilen 5321 Personenjahre 292.631.874 Dollar
MySQL 12.566.154 Zeilen 4009 Personenjahre 220.473.614 Dollar
Nagios 240.833 Zeilen 61 Personenjahre 3.334.334 Dollar
Perl 5.422.092 Zeilen 1664 Personenjahre 91.502.061 Dollar
PHP 2.281.573 Zeilen 653 Personenjahre 35.901.501 Dollar
Python Programming Language 908.412 Zeilen 251 Personenjahre 13.822.126 Dollar
Samba 1.554.832 Zeilen 442 Personenjahre 24.330.106 Dollar
Zabbix 279.878 Zeilen 73 Personenjahre 4.036.481 Dollar

Wie gesagt: alles nur Glaskugel, und sicher gibt es tausend Unwägbarkeiten wie autogenerierten Code, oder unterschiedliche Kosten für unterschiedlich qualifizierte Programmierer.

Für 300 Millionen Dollar würde ich persönlich aber durchaus anfangen einen Kernel zu schreiben… selbst wenn ich damit rechne bis zur Rente noch 30 Jahre hacken zu müssen, müsste der rechnerisch bis dahin ja nur 0,56% der Funktionalität bringen ((1 / 5321) * 30 * 100 = approx. 0.5638038)… wenn ich mir die richtigen 0,56% raussuche passt das schon… :-)

Vor einer Weile habe ich auf Twitter einen netten Alias für die Shell gesehen:

alias doch='sudo $(history -p !-1)'

Das Ding geht nicht in der zsh, da das history-Kommando — anders als in der bash — hier kein p-Flag hat. Ist aber auch zweitrangig. Wenn man sein letztes Kommando doch mal mit Nachdruck (und root-Rechten) ausführen möchte geht auch ein beherztes:

sudo !!

An dieser Stelle nochmal ein Zitat zum Thema:

‚Multiple exclamation marks,‘ he went on, shaking his head, ‚are a sure sign of a diseased mind.‘
(Terry Pratchett in „Eric“)

Ich glaube auch Herr Pratchett würde die Anwendung mit sudo als Ausnahme durchgehen lassen, oder? :-)

Der gute alte Firefox ist immer noch der Browser meiner Wahl. Und er wird immer besser. Einziger Haken ist nach wie vor, dass er sich bisweilen doch ziemlich viel Hauptspeicher genehmigt. Man fragt sich was er wohl damit anstellt, und bis jetzt musste zumindest ich an der Stelle mit Vermutungen leben.

Oft ist es nicht der Firefox selbst, der den Speicher auffrisst. Auch Extensions können sich gerne mal ein großes Stück vom Kuchen abzwacken, und man schiebt es dann erstmal auf den Browser.

Gerade habe ich einen Weg kennengelernt, wie man sich seit Version 24 die Interna ansehen kann:

  • In der URL-Leiste about:support eingeben. Hier sind unter anderem alle Erweiterungen aufgelistet.
  • Man merke sich die ID der verdächtigen Extension (rechte Spalte).
  • Wieder per URL-Leiste — idealerweise in einem zweiten Tab — about:memory ansurfen. Hier unter „Show memory reports“ mit „Measure“ eine Messung tätigen.
  • Mit etwas Glück kann man direkt nach der gemerkten ID suchen (Strg-F). Klappt das nicht, sucht man nach „add-ons“ und expandiert hier so lange die Zweige bis man die gesuchte ID findet.

Gleich direkt mal sehen ob ich hier was überdimensional großes finde…

NAS4Free

NAS4Free

Anfang des Jahres habe ich meinen Server hier zu Hause komplett umgebaut, um etwas mehr Flexibilität und Komfort in die Virtualisierung zu kriegen. Nach etwas Suche bin ich auf Proxmox VE gestoßen, das ich dann auch eingesetzt habe. Nach wie vor ist der einzige Punkt mit dem ich da unglücklich bin die Paravirtualisierung mittels OpenVZ — das ist wohl nicht mehr ganz zeitgemäß. Aber wichtig ist: es funktioniert.

Vollvirtualisiert wird mit KVM, das hat es mir ermöglicht ein NAS4Free als Fileserver einzusetzen. Das basiert auf FreeBSD, es hat eine nette Oberfläche und ist alles in allem echt unkompliziert. Ein Killer-Feature ist die native Unterstützung von ZFS. Ausprobieren musste ich das, obwohl mir klar war dass das auf meiner bescheidenen Hardware wenig Spaß machen würde. Und richtig genug: spätestens mit ZFS waren Zugriffe auf Netzlaufwerke unerträglich langsam.

Ich will nichts gegen ZFS sagen. Das ist eine coole Technik, aber definitiv nicht für meine Umgebung gedacht. In einer virtuellen Maschine mit virtuellen Festplatten und nur sehr wenig Hauptspeicher kann es seine Leistung beim besten Willen nicht ausspielen. Schade. Wenn ich mal einen Fileserver auf echter Hardware bauen will komme ich gerne wieder drauf zurück. Und auf NAS4Free.

So musste ich mich erstmal nach einer Alternative umsehen. Dabei bin ich ziemlich schnell wieder auf zwei Projekte gestoßen von denen ich schon öfter gelesen hatte: OpenMediaVault und Openfiler. Bevor ich mich aber dazu entschließe alles umzuwerfen muss erstmal getestet werden ob die in meiner Situation besser performen würden. Also habe ich beide mal testweise installiert und ein paar Versuche unternommen.

Openfiler

Openfiler

Installiert hatte ich von diesen ISOs:

  • NAS4Free-x64-LiveCD-9.1.0.1.573.iso
  • openmediavault_0.5.0.24_amd64.iso
  • openfileresa-2.99.1-x86_64-disc1.iso

Aber erstmal die Rahmenbedingungen: in dem Server steckt ein Intel Core2Duo E6750, 8GB RAM, zwei SATA-Platten im Software-RAID1 und ein 100MBit-Netzwerk. Den virtuellen Maschinen habe ich jeweils 512MB RAM gegeben, das muss für so einen kleinen Einsatz genug sein finde ich. Systemplatten hatte ich jeweils in 1GB vorgesehen, aber an der Stelle hat Openfiler schon nicht mitgespielt: unter 10GB lässt der sich nicht installieren. Ganz schön viel für ein One-Trick-Pony. Belegt waren nach der Installation 1,7GB. OpenMediaVault hat sich 658MB genommen, NAS4Free war sogar mit 274MB zufrieden.

Mein Anspruch ist, dass ich der virtuellen Maschine bei Bedarf Festplatten nachschieben kann, die dann in einen logischen Verbund — LVM oder ZFS — stecke und darauf flexibel Volumes anlegen kann, deren Größe ich dann den Anforderungen anpassen kann. Redundanz brauche ich hier nicht, da die Platten im Hostsystem schon als RAID1 laufen.

OpenMediaVault

OpenMediaVault

Voll und ganz erfüllt den Anspruch ein ZFS auf NAS4Free. Nur ist das halt auf meiner Hardware zu langsam. Nur mal testweise habe ich ein JBOD auf NAS4Free angelegt. Da könnte ich zwar Platten nachschieben, dafür habe ich aber nicht herausgefunden wie ich einzelne Volumes anlegen kann (das was unter Linux LVM macht). Ob das überhaupt geht würde mich schon noch interessieren, aber schneller wuerde es dadurch wohl auch nicht mehr.

Auf den beiden Linux-Systemen habe ich jeweils ein LVM aus zwei 10GB-Platten angelegt — bei OpenMediaVault mit einem nachinstallierten Plugin — und darin ein ext4-Volume mit 12GB erzeugt auf dem ich getestet habe. Openfiler unterstützt auch schon btrfs, also habe ich das auch mal ausprobiert.

Drei Tests habe ich auf allen diesen Plattformen durchgeführt: erst habe ich ein ISO-File per SCP auf die Laufwerke übertragen (ubuntu-12.10-desktop-amd64.iso, etwa 800MB), dann jeweils an der Shell lokal auf den NAS-Systemen ein tar-File dieses ISOs angelegt (time tar cf test.tar ubuntu*.iso). Zusätzlich habe ich die beiden Tests lokal auf dem Proxmox durchgeführt, nur um ein Gefühl dafür zu bekommen was die Physik hergeben würde. Hier die Zahlen:

  ISO per SCP kopieren ISO in tar packen (lokal)
Lokal, ohne NAS 40.2MB/s 17s
NAS4Free / ZFS 3.7MB/s 247s
NAS4Free / JBOD 6.4MB/s 94s
OpenMediaVault / LVM / ext4 13.5MB/s 26s
Openfiler / LVM / ext4 17.7MB/s 77s
Openfiler / LVM / btrfs 15.9MB/s 50s

Nochmal der Hinweis: das sind nur Stichproben. Ich habe alle Tests nur einmal durchgeführt, und man wird garantiert andere Werte bekommen wenn man die NAS-Systeme nicht in einer virtuellen Maschine installiert sondern auf richtigem Blech. Mir persönlich reichen die Zahlen als Anhaltspunkte. YMMV.

So gerne ich auch bei NAS4Free bleiben würde: ich denke mein neuer Fileserver wird ein OpenMediaVault werden. Auf meiner schmalen und noch dazu virtualisierten Hardware kann NAS4Free sich leider nicht wirklich entfalten. Die Zahlen sprechen hier einfach für Linux. Und OpenMediaVault macht nicht nur beim IO einen guten Eindruck, auch der schmale Fußabdruck bei der Installation ist sympathisch. Oh, und unten drunter liegt ein Debian, das befindet sich hier in guter Gesellschaft. Nur auf btrfs muss ich leider noch verzichten. Das gibt es erst wenn OMV ein Update auf Squeeze vornimmt. Aber bis dahin habe ich schonmal was… :-)