August, 2015

LVM2 RAID vs mdadm RAID 0, 5, 10

Samstag, August 22nd, 2015

Ich habe mir 4 neue HGST Ultrastar A7K3000 2TB SATA6 Festplatten für meine Server gegönnt. Zum Vergleichen habe ich ein paar Tests mit LVM und mdadm gemacht.

Dafür habe ich je ein 5GB großes Setup gebaut und mit dd die Volumen erst gelesen und dann beschrieben. Dies habe ich in dieser Reihenfolge gemacht, um sicherzugehen, dass keine Daten aus dem cash gelesen werden.

Dabei bin ich zu folgenden spannenden Ergebnissen gekommen:

5GB READ/s READ/MB WRITE/s WRITE/MB
LVM RAID0 9,97195 s 538 MB/s 9,64365 s 557 MB/s
LVM RAID5 31,1128 s 173 MB/s 67,4213 s 79,7 MB/s
LVM RAID10 18,661 s 288 MB/s 26,5428 s 202 MB/s
MDADM RAID0 9,81575 s 547 MB/s 9,5395 s 563 MB/s
MDADM RAID5 20,528 s 260 MB/s 24,9739 s 214 MB/s
MDADM RAID10 17,5713 s 305 MB/s 19,529 s 275 MB/s

Mein Fazit: LVM ist doch deutlich langsamer als mdadm. Erschrocken hat mich die 2,6 fach schlechtere Schreibperformance bei LVM Raid5. Überrascht hat mich auch, dass ein mdadm raid10 fast die Nativ mögliche Geschmeidigkeit, 1/2 facht von reid0, erreicht hat.

Für die Testbedienungen habe ich ein aktuelles Ubuntu 14.04 LTS mit lvm2 2.02.98-6ubuntu2 und mdadm 3.2.5-5ubuntu4.2 verwendet.
(mehr …)

DRBD wait IO

Sonntag, August 16th, 2015

In einem KVM DRBD Setup hatte sich auf Dauer eine Menge wait I/O angesammelt.

waitio3

Zunächst habe ich herausgefunden, dass die einzelnen VMs sehr viel write barriers erzeugen. Dies konnte ich bei den VMs, bei denen ich root Zugang habe, mit der Option barrier=0 in der /etc/fstab einstellen.
Bei den VMs, bei denen ich keinen root Zugang habe, ging das leider nur auf der DRBD Schicht. Dazu habe ich in den /etc/drbd.d/.res folgende Einstellung hinzugefügt:

disk {
    disk-barrier no;
    disk-flushes no;
}

Quelle: drbd.linbit.com

Die hieraus resultierende bessere IO Permanenz für alle VMs entnimmt man den oben aufgeführten Zabbix Graph.

fdisk Festplatten vergrößert

Dienstag, August 11th, 2015

Ab und zu kommt es vor das bei VMs Festplatten vergrößert werden müssen. Bei den alten Systemen ohne LVM im Gastsystem muss dies leider noch offline geschehen.
Zur Sicherheit sollte man ein snappshot des LVs machen und/oder den MBR zuvor sichern.

lvcreate -L 500M --snapshot -n mysnap /dev/vg/lv

Zunächst wird das LV auf dem Träger System vergrößert:

# lvresize -L +20G vg/lv
Size of logical volume vg/lv changed from 80,00 GiB (20480 extents) to 100,00 GiB (25600 extents).
Logical volume lv successfully resized

Danach kann man den MBR neu anlegen. Hier ist auf folgende Fehler Meldung in fdisk zu achten:

The device presents a logical sector size that is smaller than
the physical sector size. Aligning to a physical sector (or optimal
I/O) size boundary is recommended, or performance may be impacted.

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
switch off the mode (command 'c') and change display units to
sectors (command 'u').

bzw. erschient nach dem anlegen der Partition folgender hinweise, welcher auch auf den falschen Modus hinweist.
Partition 2 does not start on physical sector boundary.

Dann muss wie im Beispiel fdisk mit -c für den DOS-compatible Modus angegeben werden:

fdisk -c /dev/mapper/vg-lv

Befehl (m für Hilfe): d
Partitionsnummer (1-4): 2

Befehl (m für Hilfe): d
Partition 1 ausgewählt

Befehl (m für Hilfe): n
Befehl Aktion
e Erweiterte
p Primäre Partition (1-4)
p
Partitionsnummer (1-4): 1
Erster Zylinder (1-13054, Vorgabe: 1): 1
Last Zylinder, +Zylinder or +size{K,M,G} (1-13054, Vorgabe: 13054): +95G

Zunächst wurden die Vorhandenen Partitionen gelöscht. Dabei braucht man keine Sorge haben das alle Daten weg sind. (Das Löschen der Daten würde wesentlich länger dauern)
Dann wird eine „neue“ größere Partition angelegt.


Befehl (m für Hilfe): p

Platte /dev/mapper/vg-lv: 107.4 GByte, 107374182400 Byte
255 Köpfe, 63 Sektoren/Spur, 13054 Zylinder
Einheiten = Zylinder von 16065 × 512 = 8225280 Bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 524288 bytes
Disk identifier: 0x00059ca1

Gerät boot. Anfang Ende Blöcke Id System
/dev/mapper/vg-lvp1 1 12402 99617792 83 Linux

Befehl (m für Hilfe): n
Befehl Aktion
e Erweiterte
p Primäre Partition (1-4)
p
Partitionsnummer (1-4): 2
Erster Zylinder (12402-13054, Vorgabe: 12402):
Benutze den Standardwert 12402
Last Zylinder, +Zylinder or +size{K,M,G} (12402-13054, Vorgabe: 13054):
Benutze den Standardwert 13054

Nach einer Überprüfung der Partition habe ich auch die zweite Partition über den Rest der Festplatte angelegt.


Befehl (m für Hilfe): a
Partitionsnummer (1-4): 1

Befehl (m für Hilfe): t
Partitionsnummer (1-4): 2
Hex code (L um eine Liste anzuzeigen): 82
Der Dateisystemtyp der Partition 2 ist nun 82 (Linux Swap / Solaris)

Befehl (m für Hilfe): w
Die Partitionstabelle wurde verändert!

Rufe ioctl() um Partitionstabelle neu einzulesen.

WARNING: Re-reading the partition table failed with error 22: Das Argument ist ungültig.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Synchronisiere Platten.

Anschließend habe ich noch den Boot Modi a und die Art der Partition 82 angegeben. Nur wenn man sich wirklich Sicher ist sollte man w zum Speichen angeben.

# partprobe
Warning: WARNING: the kernel failed to re-read the partition table on /dev/sda (Das Gerät oder die Ressource ist belegt). As a result, it may not reflect all of your changes until after reboot.

Um den Kernel noch bekannt zugeben, dass es eine neue Partitionstabelle gibt, muss einmal partprobe ausgeführt werden. Alternativ kann man auch die VM Booten und das vergrößern Online durchführen. (Achtung: dann sollte die Partition aber im Readonly Modus mountet sein)

# resize2fs -p /dev/mapper/vg-lv
resize2fs 1.41.12 (17-May-2010)
Bitte zuerst »e2fsck -f /dev/mapper/vg-lv« laufen lassen.

# e2fsck -f -y /dev/mapper/vg-lv
...
/dev/mapper/vg-lv: ***** DATEISYSTEM WURDE VERÄNDERT *****
/dev/mapper/vg-lv: 512061/4825088 Dateien (0.1% nicht zusammenhängend), 18926485/19922384 Blöcke

# resize2fs -p /dev/mapper/vg-lv
resize2fs 1.41.12 (17-May-2010)
Die Grösse des Dateisystems auf /dev/mapper/vg-lv wird auf 24904448 (4k) Blöcke geändert.

Start von Durchgang 1 (max = 153)
Vergrößere die Inode-TabelleXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Das Dateisystem auf /dev/mapper/vg-lv ist nun 24904448 Blöcke groß.

SimpleHTTPServer mit PHP

Dienstag, August 4th, 2015

Heute wollte ich mir mal eben schnell Vorschaubilder auf einem Server anzeigen lassen. Der PHP Code war schnell geschrieben:

read())) {
   echo " ".chr(10);
}

$d->close();
?>

Dann die Frage wie man ohne Webserever an die Daten harren kommt. Einfachste weg ist der in Python integrere Webserver:
python -m SimpleHTTPServer 8000

Diese kann aber kein PHP. Da php5-cli in der Version >= 5.4 installiert war funktionierte folgende spannende Lösung:
php -S 127.0.0.1:8000 -t .

Quelle: docs.python.org simplehttpserver, php.net commandline.webserver