Seite wählen

Überwachung von BTRFS Filesystemen

von | Feb 1, 2013 | Linux, Monitoring & Observability, Development

Grüss Gott beisammen, ich bin dann auch mal hier 🙂
In einem Kundenprojekt gehts dann auch gleich zur Sache: BTRFS gilt zwar als experimentiell, aber es gibt dennoch Setups, in denen BTRFS bereits als Filesystem verwendet wird. In OpenSUSE 12.2 gibt es BTRFS in einer verbesserten Fassung, und so ist es auch nicht verwunderlich, dass die Anforderung an ein entsprechendes Check Plugin gestellt wurde.
Das eigentliche Problem hierbei ist, dass der systemeigene df Befehl die BTRFS spezifischen Werte nicht kennt, und ebenso nicht ausgibt. Erst mit btrfs filesystem df / lässt sich beispielsweise ermitteln, dass nicht das eigentliche Filesystem vollgelaufen ist, sondern die Snapshots im Hintergrund zu 100% dicht sind, und sich deswegen nichts mehr auf die Platte schreiben lässt.
Da es im Monitoring Umfeld noch keine geeigneten Plugins gibt, habe ich ein Basisplugin in Perl programmiert, das den Output von btrfs filesystem df / parsen kann, sowie daraus die Werte extrahiert, die dann mit globalen Thresholds verglichen werden sollen. Das ist mitunter nicht ganz trivial, da die Ausgabe dieses Befehls einen kunterbunten Mix aus KB, MB und GB ausspuckt, den man in mathematisch logische Bytes zur weiteren Berechnung zerlegen muss. Alles andere ist aber Standardpluginkost und sollte jedem die Möglichkeit eröffnen, die eigenen BTRFS Filesystemfunktionalitäten neben den obligatorischen df Checks (zB check_disk) zu überwachen.
Um die BTRFS Werte auslesen zu können, werden Root Privilegien benötigt. Da der Icinga Core die Checks als Icinga Benutzer durchführt, muss diesem Benutzer das passwortlose sudo für den Befehl /usr/sbin/btrfs filesystem df /* eingeräumt werden. Achtung: /usr/sbin/btrfs ist zu wenig eingeschränkt – damit könn(t)en als Icinga Benutzer alle BTRFS Einstellungen manipuliert werden!

# visudo
icinga ALL=(ALL) NOPASSWD: /usr/sbin/btrfs filesystem df /*

Auch wenn der Icinga Benutzer keine Shell zur Verfügung hat, kann das Plugin mit diesem Befehl als root getestet werden:

# sudo -u icinga /usr/local/icinga/libexec/check_disk_btrfs -f / -w 50 -c 80
WARNING: btrfs "Data" 62.87% used (1.05GB/1.67GB) OK: "System, DUP" 0.05% used (4.00KB/8.00MB), "System" 0.00% used (0.00/4.00MB), "Metadata, DUP" 19.30% used (90.48MB/468.75MB), "Metadata" 0.00% used (0.00/8.00MB) | data_used=1127428915;50;80;; data_total=1793148846;50;80;; system_dup_used=4096;50;80;; system_dup_total=8388608;50;80;; system_used=0;50;80;; system_total=4194304;50;80;; metadata_dup_used=94875156;50;80;; metadata_dup_total=491520000;50;80;; metadata_used=0;50;80;; metadata_total=8388608;50;80;;

Das Plugin befindet sich in seiner ersten Version im GIT Repository auf git.netways.org – bitte um Tests, Feedback und Anregungen.
Für das Plugin selbst gilt dasselbe wie für das BTRFS Filesystem – experimentell in der ersten Version 🙂

4 Kommentare

  1. antubis

    danke erstmal für das hilfreiche Plugin.
    leider haben wir hier aber ein kleines Problem damit.
    folgendes Beispiel:
    # btrfs filesystem show
    failed to open /dev/sr0: No medium found
    Label: none uuid: 3a8b32f4-f801-429d-8716-6d29dd25e4a4
    Total devices 1 FS bytes used 802.68GB
    devid 1 size 5.46TB used 820.04GB path /dev/sdb1
    # btrfs filesystem df /data/
    Data: total=816.01GB, used=801.57GB
    System, DUP: total=8.00MB, used=92.00KB
    System: total=4.00MB, used=0.00
    Metadata, DUP: total=2.00GB, used=1.10GB
    Metadata: total=8.00MB, used=0.00
    man sieht hier: wie haben ein btrfs auf einem 5,4T-Volume, von dem das btrfs aktuell gerade mal 820G zugewiesen hat. innerhalb der 820G sind 801G für Nutzdaten und ~1G für Metadaten belegt. aufgrfund der prozentual hohen Belegung der Nutzdaten alarmiert das Plugin nun:
    CRITCAL: btrfs „Data“ 98.23% used (801.57GB/816.01GB) OK: „System, DUP“ 1.12% used (92.00KB/8.00MB), „System“ 0.00% used (0.00/4.00MB), „Metadata, DUP“ 55.00% used (1.10GB/2.00GB), „Metadata“ 0.00% used (0.00/8.00MB)
    diese Alarmierung ist aber leider total falsch, weil das Dateisystem ja eigentlich noch fast 5T übrig hat. dieser Zustand tritt immer dann auf, wenn ein neues Dateisystem nur befüllt, aber nichts gelöscht wird und/oder man kürzlich eine btrfs-Balancing durchgeführt hat.
    kann man das Plugin so ändern, dass es den gesamten Platz auf dem Volume berücksichtigt, nicht nur den aktuell verwendeten?!

    Antworten
  2. Michael Friedrich

    Das Plugin war explizit für das Filesystem ausgelegt, nicht für das Volume von dem man noch zusätzlichen Platz bekommen könnte. Wenn /data voll ist im Sinne von Daten und Metadaten, passiert doch keine dynamische Reallocation vom Volume, und der Kernel hat dann ein Problem (Platte voll!), oder sehe ich das falsch?
    Dementsprechend wäre eine Erweiterung auf das Volume eigentlich falsch – das ist eher ein zusätzlicher Check, der die Volumes und deren zusätzlich verfügbaren Platz überprüft. Im Alertfall würde man dann manuell mittels resize das Filesystem entsprechend erhöhen. Ähnlich wie man LVM und Konsorten abfrägt, dies aber unabhängig von check_disk passiert.
    Sofern du einen Patch hast, kannst du ihn gerne mit einem Feature Request hier reinstellen: https://www.netways.org/projects/plugins/issues
    Bzw einen Pullrequest schicken: https://git.netways.org/plugins/collection

    Antworten
  3. antubis

    Nein, das btrfs ist über das gesamte Volume (in meinem Fall sdb1) angelegt, alloziert sich den Platz darauf aber dynamisch, sonst würde der „btrfs filesystem show“ den Platz ja auch garnicht kennen. Ein Resize brauchst du nur, wenn sich das Volume ändern (z.B. LVM).
    # mount |grep data
    /dev/sdb1 on /data type btrfs (rw)
    # df -h /data
    Dateisystem Größe Benutzt Verf. Verw% Eingehängt auf
    /dev/sdb1 5.5T 1.3T 4.3T 23% /data
    fs03 [srv]: /root # btrfs filesystem show
    failed to open /dev/sr0: No medium found
    Label: none uuid: 3a8b32f4-f801-429d-8716-6d29dd25e4a4
    Total devices 1 FS bytes used 1.21TB
    devid 1 size 5.46TB used 1.34TB path /dev/sdb1
    fs03 [srv]: /root # btrfs filesystem df /data
    Data: total=1.34TB, used=1.20TB
    System, DUP: total=8.00MB, used=152.00KB
    System: total=4.00MB, used=0.00
    Metadata, DUP: total=2.00GB, used=1.72GB
    Metadata: total=8.00MB, used=0.00
    Btrfs v0.20-rc1
    ich mach mal nen feature request auf. perl is leider nicht meins, aber ich schau mal, ob ich nen patch hinkrieg…

    Antworten
  4. Jonas

    Hallo,
    vielen Dank für das Plugin aber bei mir unktioniert es leider nicht und Debian Jessie
    /usr/lib/nagios/plugins/check_btrfs -f / -w 50 -c 80
    Argument „Data“ isn’t numeric in sprintf at /usr/lib/nagios/plugins/check_btrfs line 447.
    Argument „single:“ isn’t numeric in sprintf at /usr/lib/nagios/plugins/check_btrfs line 447.
    Illegal division by zero at /usr/lib/nagios/plugins/check_btrfs line 289.
    btrfs filesystem show
    Label: none uuid: 2dd6ba7d-f6f5-47f9-948e-3777897e291a
    Total devices 1 FS bytes used 1.10TiB
    devid 1 size 2.73TiB used 1.61TiB path /dev/md1
    Btrfs v3.17

    Antworten

Trackbacks/Pingbacks

  1. check_disk_btrfs reloaded › NETWAYS Blog - […] with Docker and CoreOS setups. I did write a check plugin for a customer nearly 3 years ago called…

Einen Kommentar abschicken

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

Mehr Beiträge zum Thema Linux | Monitoring & Observability | Development