DRBD wait IO

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

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

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

PHP7 ein Test wert…

Aktuell ist die Beta1 von PHP7 veröffentlicht. Da Sie zum php5.2 abwärts kompatible ist funktioniert auch das meiste. Auf unterschiedlichen Seiten kann man sich jetzt schon Statistiken über den Speicher und CPU verbrauch anschauen, welche tatsächlich beeindruckend sind.
Wo es natürlich knallt ist die Kompatibilität zu php4 so sind mir folgende beiden Problem bereits untergekommen:

$var =& new $ojeckt()
Geht nicht da kann man das & einfach streichen. Dies war für php4 zwingen erforderlich und war schon im 5 nur noch abwärts kompatible.

split muss nun durch explode ersetzt werden. Dies gilt seit PHP 5.3.0 als DEPRECATED.

Weitere Tests folgen…

GPT Partition kopieren

Heute kam bei Boote ein Raid nicht komplett wieder „assemblet“ werden. Beim genaueren hinschauen viel auf das der nicht im Raid befindlichen Festplatte die Partitions Tabelle fehlte. Da es sich bei allen anderen Platten, in diesem Raid, um GPT Partitionen handelte, brauchte ich eine Lösung wie man diese Kopieren kann.

sgdisk -R /dev/sdN /dev/sdV
sgdisk -G /dev/sdN

Achtung die Reihenfolge ist hier bei: N=Nach, V=Von!