Heisenbug – erfolgreiche Fehlersuche mit Quobyte und Canonical

Heisenbug – erfolgreiche Fehlersuche mit Quobyte und Canonical

Unser OpenStack Cluster läuft ja unten drunter mit dem verteilten Quobyte Dateisystem. Die Aufgabe dieser Software ist, grob gesagt, die Festplatten in jedem Rechner des Clusters zu nehmen und aus allen diesen Platten ein großes Dateisystem zu bauen, das dann für den Cluster zur Verfügung steht. Dabei werden alle Daten mehrfach gespeichert, sodaß durch den Ausfall eines einzelnen Rechners kein Datenverlust entstehen kann.
Das so gebaute Dateisystem wird in Linux-Clients mit Hilfe des Userspace-Dateisystems FUSE nutzbar gemacht und im Großen und Ganzen funktioniert das ganz wunderbar.
Als wir jedoch unsere Clients auf die Linux Kernelversion 4.1 oder höher aktualisieren wollten, stürzten die Systeme nach kurzem Betrieb häufig mit einer Panic-Meldung ab.
Wer einmal sehen möchte, wie ein solches Ereignis aussieht:
Panic
Einen offiziellen Bug-Report dazu haben wir im Oktober 2015 eingeworfen und seitdem zusammen mit Quobyte und Canonical dem Fehler hinterher gejagt.

Die Jagd nach dem Heisenbug

Das hat sich als aufwendiger herausgestellt als zunächst gedacht, denn obwohl sich der Fehler recht zuverlässig nach einiger Zeit unter Last provozieren ließ, war er nicht mit genau einem Ereignis zu assoziieren. Stattdessen mußte man auf einer Gruppe von Testmaschinen Last erzeugen und dann eine Weile warten, bis auf einer der getesteten Maschine der Kernel den Geist aufgibt. Wenn man das nur oft genug macht, ergibt sich nach einigen Wochen Fehlersuche ein Muster, auf dessen Grundlage man vermuten kann, was das Problem ist.
Tatsächlich hat es dann von Oktober 2015 bis Anfang März 2016 gedauert, bis sich erste Verdachtsmomente so weit erhärten ließen, die sich in so etwas wie einen Patch gießen ließen. Wenn man den Code ansieht, versteht man, wieso der Fehler zu schwer zu finden war: eine Race-Condition, also ein Fehler, der nur dann auftritt, wenn mehrere Ereignisse zufälligerweise zeitgleich dieselben Variablen verändern wollen. Der klassische Heisenbug.
Der vollständige Fix ist ein bischen komplizierter geworden, steht jetzt aber zum Einbau in den Kernel bereit, und damit ist der Weg für das Kernelupgrade – und die damit zusammenhängenden Performancegewinne – frei.

Share this post

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.