ZFS unterirdisch langsam. Komme mit dem Tuning nicht weiter...

pbtraveller

Well-Known Member
Hallo,

Habe einen HP ProLiant MicroServer NL 36 mit zwei zugegeben langsamen Festplatten (WD204ARS mit 64MB Cache) als zfs pool raidz1. Eigentlich wollte ich noch eine Dritte Platte reinhängen, habe sie aber noch nicht besorgt. Root liegt auf dem zfs pool.

Der Server hat 8 GB RAM, sollte also genug sein.

Der Server soll nur als file-server dienen, ein davical soll drauf laufen, firefly und asterisk.

Die Schreibgeschwindigkeit der Maschine ist aber so unterirdisch, dass es ich erst einmal aufgehört habe, weiterzubasteln. Dass die Platten nicht gerade die schnellsten sind, war ja klar, aber die Geschwindigkeit kann eigentlich nicht alleine an den Platten liegen. Mein alter Laptop mit ext4 schafft da ja die 3-fache Geschwindigkeit. Die Tipps aus dem zfs tuning guide habe ich alle schon durch. Nur vfs.zfs.zil_disable="1" scheint ein bisschen was zu bringen.

iozone liefert folgende Ergebnisse:

Include fsync in write timing
Record Size 32 KB
File size set to 4194304 KB
Auto Mode
Command line used: iozone -e -r 32 -s 4g -a
Output is in Kbytes/sec
Time Resolution = 0.000001 seconds.
Processor cache size set to 1024 Kbytes.
Processor cache line size set to 32 bytes.
File stride size set to 17 * record size.
random random bkwd record stride
KB reclen write rewrite read reread read write read rewrite read fwrite frewrite fread freread
4194304 32 19098 18802 1613614 1682083 1651881 4633 1653437 28229^C


Die Einstellungen der Maschine sind aktuell wie folgt (wurden alle automatisch so gesetzt):

vm.kmem_size: 8171413504
vm.kmem_size_max: 329853485875
vfs.zfs.arc_max: 7097671680
vfs.zfs.vdev.cache.size: 10485760

hw.ata.wc: 1

in /boot/loader.conf habe ich aktuell folgende Parameter gesetzt:

vfs.zfs.txg.write_limit_override=1073741824
vfs.zfs.prefetch_disable="1"

Datenübertragungen per afp und smb sind auch unglaublich langsam.
Kann mir jemand weiterhelfen? Die Geschwindigkeit kann doch nicht sein. Gibt es jemand hier, der die gleiche Kiste hat und der seine Settings und die erzielten Geschwindigkeiten mitteilen kann? .

Vielen Dank und herzliche Grüße

pbtraveller
 
RaidZ1 und nur zwei Platten? Wie geht das denn? Oder meinst du lediglich einen Mirror...also Raid-1?
 
Hm, wenn es ein RaidZ1 mit einem missing vdev ist, dann könnte es die Langsamkeit erklären. Nach Einbau der dritten Platte und Rekonstruktion der Daten dürfte es dann schneller laufen.
 
Afaik ist es zfs egal ob ein RAID z1 aus nur 2 platten besteht. Es macht dann automatisch sowas wie nen mirror draus. Das wurde irgendwann mal auf den osol Mailinglisten breitgetreten.
 
Hallo,

HNur vfs.zfs.zil_disable="1" scheint ein bisschen was zu bringen.

Du willst den ZIL nicht abschalten... auch das ZFS Prefetch Disable bringt recht wenig, weil der Overhead minimal ist.

Was gibt eigentlich zpool iostat 5 5000 her wenn du mal lustig drauf rum schreibst und liest?

Selber hab ich keinen HP 36NL aber ich kenne mindestens ein halbes Dutzend Leute die diese Kiste in Kombi mit ZFS einsetzen und keiner hat das von Dir beschriebene Problem, weder mit Nexenta, OpenSolari, oder Solaris 11 express ausmachen können.

Boote doch mal zum Gegenvergleich mal ein OpenSolaris vom USB Stick, importiere den Pool und schreib drauf rum.

Für mich hört sich das sehr suspekt an...

Die komplette Platte wird vom Pool benutzt, oder hast DU
dort rumpartitioniert?
Wenn DU partitioniert hast, kann es gut sein das ZFS das Caching abgeschaltet hat.

Nutzt du Compression?
DEDUP ??
Disk Encrypten?

Von welcher ZFS Version reden wir überhaupt?
 
Zuletzt bearbeitet:
Wenn DU partitioniert hast, kann es gut sein das ZFS das Caching abgeschaltet hat.

Was bei mir glatt eine Frage hervorruft: Wenn ich in einem System zwei Pools habe, einen auf blanken Disks, und einen weiteren kleinen auf einer Partition einer weiteren Disk...schaltet FreeBSD ZFS das Caching dann für ALLE Pools generell ab, oder nur für den betroffenen? Weiß das jemand genau?
 
Was bei mir glatt eine Frage hervorruft: Wenn ich in einem System zwei Pools habe, einen auf blanken Disks, und einen weiteren kleinen auf einer Partition einer weiteren Disk...schaltet FreeBSD ZFS das Caching dann für ALLE Pools generell ab, oder nur für den betroffenen? Weiß das jemand genau?

Ich kann es Dir nur für Solaris sagen...
Unter Solaris ist das Default Verhalten: Der Pool wird gecached, muss der Pool sich eine Disk mit irgend etwas anderem teilen, wird das Caching von ZFS sofort automatisch abgeklemmt.

Inwieweit das bei FreeBSD auch zu trifft, da bin ich leider überfragt. Kann mir aber nicht vorstellen das es geändert wurde.

Das Caching bei einem blanken Pool sollte jedenfalls nicht abgeschaltet werden, so das zu erwartende Verhalten.

Was die Pools aber alle beeinflusst, ist wenn z.B. der ZIL abgeschaltet wird, ZFS Prefetch systemweit angetatscht wird. Was eigentlich ziemlicher Murks ist, nur weil es irgendwann mal in den ZFS Evil Tuning Guide reingeklatscht wurde, macht es noch lange keinen Sinn. Eher sollte man dem ZIL dann ein Extra Device spendieren. Es besteht bei NFS Exports aus ZFS raus auf Clientseite nämlich die Gefahr von Data Corruption. Das musste nicht nur ich leidvoll erfahren.

Aber generell würde ich einen Pool immer plain auf die Disk hauen, wenn es um Produktivsysteme geht.

Wenn Tuning schon notwendig ist, würde ich generell eher den ARC_CACHE antatschen, bevor ich irgendwas anderes mache.

Wenn es um Datenbanken geht, fuer die Datenbank innerhalb des Pools entweder ein RAW ZVOL anlegen und mit dem geeignetsten Dateisystem formatieren, oder die DB selbst ins Rawdevice schreiben lassen.

Oder wie bei Mysql ein Dataset und mit der empfohlenen Blocksize versehen.

Z.B. bei Mysl Myisam Tabellen
Code:
zfs set recordsize=8k mypool/database/mysql/myisam
Code:
zfs set recordsize=16k mypool/database/mysql/innodb

Wo man immer noch keine effektive Handhabe hat, ist wenn der ZPOOl einen Füllstand von 90% überschritten hat, da wird ZFS generell schnarchlahm.
Egal auf welcher Plattform, da hilft nur noch Platten einhängen und den Pool vergrößern.

Was man auch noch machen könnte... wäre generell wenn eh viele Dateien auf der Büchse liegen die schon gepackt sind, einfach mal die ZFS Compression abzuschalten und dann mal sehen, ob die Kiste besser reagiert.

Code:
zfs get -r compression mypool
Code:
zfs set compression=off mypool

Was man vielleicht auch mal machen sollte.. .wäre generell mal zu kucken, was für Applikationen auf der Büchse laufen.
 
Vielen Dank für Eure Tips.
Ich habe noch einmal ein paar Dinge nachgeschaut, konnte aber noch nicht alles testen. Bisher kann ich mir das Ganze immer noch nicht erklären.

zdb | grep ashift

gibt mir: ashift=9

Selbstverständlich will ich ZIL nicht abschalten, wollte aber nur sehen, ob ein caching-Device (SSD) etwas bringen würde, habe es deshalb temporär abgeschaltet.

Die Platten habe ich wie hier (http://wiki.freebsd.org/RootOnZFS/GPTZFSBoot/RAIDZ1) beschreiben partitioniert. Ich benutze keine Verschlüsselung.
Komprimiert werden nur die Dateisysteme zroot/var/tmp; zroot/var/mail; zroot/var/log; zroot/var/db/pkg; zroot/var/crash; zroot/usr/ports und zroot/tmp.

Die folgenden Dateisysteme/Verzeichnisse befinden sich auf zroot:

NAME USED AVAIL REFER MOUNTPOINT
zroot 1.40T 375G 559M legacy
zroot/tmp 3.37M 375G 3.16M /tmp
zroot/usr 1.40T 375G 809G /usr
zroot/usr/home 582G 375G 4.03G /usr/home
zroot/usr/ports 2.87G 375G 1.78G /usr/ports
zroot/usr/ports/distfiles 768M 375G 768M /usr/ports/distfiles
zroot/usr/ports/packages 67K 375G 20K /usr/ports/packages
zroot/var 754M 375G 168K /var
zroot/var/crash 54.5K 375G 21.5K /var/crash
zroot/var/db 749M 375G 638M /var/db
zroot/var/db/pkg 5.06M 375G 4.43M /var/db/pkg
zroot/var/empty 18K 375G 18K /var/empty
zroot/var/log 1.90M 375G 541K /var/log
zroot/var/mail 2.33M 375G 2.01M /var/mail
zroot/var/run 398K 375G 69.5K /var/run
zroot/var/tmp 172K 375G 83.5K /var/tmp

Hier noch ein paar Angaben von zfs-stats:

zfs-stats -F

ZFS Subsystem Report Thu Mar 1 10:59:01 2012
------------------------------------------------------------------------

System Information:

Kernel Version: 802000 (osreldate)
Hardware Platform: amd64
Processor Architecture: amd64

ZFS Storage pool Version: 15
ZFS Filesystem Version: 4



hier das Ergebnis von zfs-stats -M


ZFS Subsystem Report Thu Mar 1 10:59:45 2012
------------------------------------------------------------------------

System Memory:

1.31% 102.12 MiB Active, 0.15% 11.61 MiB Inact
29.26% 2.23 GiB Wired, 0.01% 876.00 KiB Cache
69.24% 5.27 GiB Free, 0.02% 1.75 MiB Gap

Real Installed: 8.00 GiB
Real Available: 98.25% 7.86 GiB
Real Managed: 96.82% 7.61 GiB

Logical Total: 8.00 GiB
Logical Used: 33.98% 2.72 GiB
Logical Free: 66.02% 5.28 GiB

Kernel Memory: 1.09 GiB
Data: 98.70% 1.07 GiB
Text: 1.30% 14.50 MiB

Kernel Memory Map: 7.61 GiB
Size: 7.90% 615.59 MiB
Free: 92.10% 7.01 GiB



@Chrest: was meinst Du mit Ausrichtung der Partitionen?

Ich werde demnächst eine Dritte Platte reinhängen. Muss ich auf dieser eigentlich wie hier (http://wiki.freebsd.org/RootOnZFS/GPTZFSBoot/RAIDZ1) beschrieben, die file-system Hierarchie anlegen, bzw. die Platte vorher partitionieren oder würde ein einfaches

zpool attach zroot (festplatte)

reichen?

Vielen Dank für Eure Hilfe und herzliche Grüße

pbtraveller
 
Zur Thematik von RaidZ1 mit nur 2 Disks hab ich folgende Aussage gefunden:

"Raidz1 can be used with only two disks but there with no advantage at all compared to mirroring. Adding a device to a raidz isn't supported. Should you want to add a disk to an existing raidz, the only way is to backup your data elsewhere, destroy the the pool and recreate it with the extra disk added then restore your data."

Dann also lieber gleich nen normalen Mirror einrichten.

Hier die einzigen Tuningparameter, welche ich auf mehreren Boxen ähnlich einsetze (seit 8.2):
Code:
   vfs.zfs.arc_max="1500MB"    # This should be a little less than the amount of your RAM. In this example, the box only had 2 GB RAM
   vfs.zfs.txg.timeout="5"            # Write wait time from default 30s down to 5s; helps a lot to improve constant write data throughput
 
Zurück
Oben