Die Caching Metadatenlüge - oder ich bin zu doof
Posted: 08 Feb 2013 00:19
Habe den ketzerischen Titel gewählt damit möglichst viele reinschauen.
Einen Teil der Diskussion begann gegen Ende dieses Threads falls jemand das auch noch lesen mag.
viewtopic.php?f=29&t=2169&p=13433#p13433
Ich schlage mich seit geraumer Zeit mit der Problematik herum, daß Directory Scans (um z.b nach einem Dateinamen zu suchen
oder aber um die Größe eines Verzeichnisbaumes zu ermitteln) von zwei Windows 7 Clients aus schneckenlangsam sind.
Dasselbe Phänomen von einem Multimedia Player (Xtreamer Sidewinder Pro)
Insbesondere Verzeichnisbäume mit tausenden Dateien (also noch weit weg vom Zetta Bereich) fallen unangenehm auf.
Ich habe 2 Pools. Einer ist Raidz1 mit 4 Platten und der zweite Pool ist eine 4TB Platte als Single ZFS ohne Redunanz.
Hardware ist ein Asus E-350 Dual Core 1600 Mhz Board mit 8GB Ram.
Wie unangenehm , gemessen in Zeiten anhand eines Beispieles.
Ein Verzeichnisbaum auf dem RaidZ1 mit MP3 Dateien (Unterverzeichnissen A-Z ) dauert beim ersten Scan vom Client aus fast 7 Minuten.
Wiederholende Scans sind dann in ca 5 Sekunden durch.
Über die 4 TB gesucht würden wir von ca 2 Stunden reden !!!
Natürlich hab ich als eifriger Leser sofort die L2Arc Cache Karte gezückt. Erstmal ne SSD ausgeliehen. Brachte so gut wie nichts.
Dann auf USB 3.0 Stick gewechselt. War bei mir vergleichbar und die SSD mußte ich wieder abgeben.
Hab den Secondarycache der beiden Pools auf Metadata gestellt. Den Primarycache wollte ich erstmal auf ALL stehen lassen um
beim kopieren auch noch etwas vom Caching zu profitieren.
Dann hab ich tagelang diverse Tests gemacht. Es verhält sich im Prinzip so daß ich mühevoll über Stunden die Metadaten aufbaue
und dann bei wiederholten Zugriffen es auch halbwegs flott geht. Logisch nicht so schnell wie lokal auf NTFS aber damit kann ich
durchaus leben. Aber sobald ich irgendeinen größeren Film aufs NAS kopiere haut der Primary ARC die Metadaten wieder über Bord.
Da nun ein L2Arc werkelt landen die Daten zwar auch dort aber der Geschwindigkeitsgewinn liegt allenfalls in der schnelleren
Zugriffszeit des Sticks. Beim Transfer kommt er natürlich nie an den Primary Cache (Ram) heran. Ist ja auch noch logisch bis hierhin.
Da ich keinen Bock habe 2 Stunden nach einer Datei zu suchen hab ich nach Lösungen gesucht. Mir kam die Idee direkt auf dem NAS
einen Cronjob laufen zu lassen der zu bestimmten Zeiten halt sowas macht ...
Also über Putty ins System und es auf der CLI ausprobiert. So und dann kam der spannende Moment.
Pool1 -> find /mnt/SP1 -iname "*pillepalle*"
Pool2 -> find /mnt/RZ1 -iname "*pillepalle*"
Damit gehts rekursiv über alle Dateien und am Ende sind alle Metadaten im Primary Cache.
Das dauert auf der 4TB Platte beim ersten Mal ca 2 Minuten. (ca 600000 Dateien)
Auf dem Raidz1 Pool sind fast nur große Dateien. Da ist er in ca 45 Sekunden drüber gehuscht.
Das ist eine Metadaten Aufbauzeit mit der ich bestens leben könnte.
Also erneut die find Kommandos ausgeführt und auf der 4TB Platte ist er dann in 7 Sekunden durch und im RaidZ1 quasi unmittelbar nach
drücken der Entertaste. Feine Sache. Kann ich den ganzen Abend machen. Superschnell. So wollte ich es.
Irgendwie hatte ich beim Bau des NAS aber wohl fälschlicherweise daran gedacht so ein NAS Server genau diese Funktionalitäten wie
Caching den Clients zur Verfügung stellt und nicht ausschließlich dem User Root der sich lokal via SSH an die Büchse hockt.
Dumm gelaufen. Aber so sieht es aus. Daher der Titel "Die Metadaten Lüge".
Wenn ich direkt nach dem das Kommando -> sysctl vfs.zfs.arc_meta_used
auslöse kann ich sehen daß der Meta Speicher noch leer ist.
Dann setze ich die beiden o.g Find Kommandos über beide Pools ab. Anschließend nochmals
das -> sysctl vfs.zfs.arc_meta_used Kommando und ich sehe daß nun ca 2.5 GB Metadaten im Cache sind.
Von da ab kann ich lokal via SSH innerhalb weniger Sekunden alles lokal scannen.
Dann dasselbe vom Windows Client aus. Schneckenlangsam wie eh und je. Beide Clients mit Windows 7 und auch der
Hardware Player profitieren nicht die Bohne von den Metadaten im Cache. Im Gegenteil. Im Schneckentempo bauen sie nun
ihrerseits noch mehr Metadaten auf. Wenn ich dieses stundenlange Szenario laufen lasse hab ich hinterher tatsächlich
5 GB Metadaten im Speicher. Also aus meiner Laiensicht quasi zweimal die gleiche Information für ein und dieselbe Sache.
Kann das so gewollt sein. Ich glaube nicht. Da wirds dann auch mit 8GB schnell knapp.
Sobald nun irgendeine Kopieraktion läuft werden die Metadaten wieder rausgekickt und ich fang wieder bei Null an.
Gleich mal die relevanten Einstellungen aus meiner Loader.conf für 8GB Speicher
Die Variable -> vfs.zfs.arc_meta_limit
hab ich raufgesetzt weil default 1/4 des ARCs für Metadaten reserviert sind. Das wären bei mir 1.4GB
Da ich aber "mehr" Metadaten im Cache haben wollte und die Variable "meta_limit" im real Betrieb überschritten wurde
hab ich den Wert erhöht. Es hat aber alles keinen Unterschied gemacht.
kern.maxfiles="65536"
kern.maxfilesperproc="50000"
kern.cam.boot_delay="8000"
vm.kmem_size="7G"
vfs.zfs.arc_max="5832M"
vfs.zfs.arc_min="3584M"
vfs.zfs.txg.timeout="5"
vfs.zfs.txg.synctime="1"
vfs.zfs.txg.write_limit_override="1073741824"
vfs.zfs.vdev.min_pending="1"
vfs.zfs.vdev.max_pending="1"
vfs.zfs.prefetch_disable="0"
vfs.zfs.arc_meta_limit="2384M"
Als letzte Idee hab ich dann heute den Primarycache auch auf Metadata gestellt.
Die Idee dahinter ist halt , daß nur noch Metadaten gecached werden. Also auch kein Grund mehr für den ARC sie beim kopieren
aus dem Speicher zu werfen. Das klappt lokal auch. Sind meine 2.5 GB via Find Kommando erstmal wieder aufgebaut
geht der Scan in Sekunden. Ich kann nun auch übers Netz kopieren bis der Arzt kommt und sie bleiben im Primary Cache.
Leider nützt die ganze Idee ja nichts , via geplantem Cron Job , wenn der Sambazugriff nicht gecached wird so wie es meiner
Meinung nach sein sollte. Trotzdem, testweise in den sauren Apfel gebissen und vom Client wieder einen Scan gestartet
über mein MP3 Verzeichnis. Nach langen 7 Minuten dann den zweiten Scan angeworfen. Was soll ich sagen ...
Ich mußte wieder 7 Minuten warten. Nun wird gar nichts mehr gecached.
Der Metadatenspeicher wächst auch nicht mehr wie vorher von 2.5Gb auf bis zu 5GB an. Er bleibt völlig unverändert.
Lokal via Putty SSH geht weiterhin die Post ab. Das ist gelinde gesagt zum kotzen.
Ich habe nur eine Einzige Schlußfolgerung .. und bitte jetzt nicht den Pauschal Hinweis -> mehr RAM.
Selbst wenn Ram immer gut ist, keine Frage. Aber das Board gibt zum einen nicht mehr wie 8GB her laut Doku und zum
anderen ist das für mich ein BUG oder schöner ausgedrückt ein Designfehler, wenn ein Fileserver nicht die Directory Zugriffe cached.
Meine Schlußfolgerung ist die daß Zugriffe von Windows aus über das SMB Protokoll auf der ZFS Seite nicht wie Metadaten gehandled
werden. Da ich ja mit der Einstellung vorher -> Primarycache ALL wenigstens beim zweiten Zugriff eine Beschleunigung hatte
und diese nun völlig wegfällt muß ZFS anscheinend diese Zugriffe wie Daten oder Kopieraktionen interpretieren.
Selbes Phänomen auch vom Hardware Media Player aus zu sehen. Wechsel ins Verzeichnis MP3 -> Buchstabe A ... 15 Sekunden
wieder raus und nochmal rein. Wieder 15 Sekunden. Das war vorher beim zweiten Zugriff nach ca 3 Sekunden da.
Nebenbei gesagt hat die Einstellung Primarycache= Metadata auch die Kopiergeschwindigkeit deutlich reduziert.
Wenns beim Scan geholfen hätte, würde ich damit durchaus leben können.
Aber so wie es sich mir derzeit darstellt , ist das einfach nur Mist. Ich kann mir nicht vorstellen daß das so gewollt ist.
Hab dann heute auch noch das Update auf die 636 Version gemacht. Es hat sich nichts geändert.
Wäre vieleicht jemand so nett und kann ggf versuchen dieses Phänomen auf seinem NAS mal nachzustellen.
Ich hab es extra sehr ausführlich beschrieben. Es sollte relativ einfach nachzuvollziehen sein.
Vieleicht entdeckt ja auch jemand noch einen Bug in meiner Loader.conf.
Nachtrag:
Da ich Samba in Verdacht hatte, hab ich sowohl das SMB2 Protokoll wie auch NT1 mit Async I/O wechselweise ausprobiert.
Bei beiden Protokollvarianten derselbe unangenehme Effekt.
Hier hatte vor 4 Jahren schonmal einer denselben Problemansatz
http://thr3ads.net/zfs-discuss/2008/10/ ... che-almost
Einen Teil der Diskussion begann gegen Ende dieses Threads falls jemand das auch noch lesen mag.
viewtopic.php?f=29&t=2169&p=13433#p13433
Ich schlage mich seit geraumer Zeit mit der Problematik herum, daß Directory Scans (um z.b nach einem Dateinamen zu suchen
oder aber um die Größe eines Verzeichnisbaumes zu ermitteln) von zwei Windows 7 Clients aus schneckenlangsam sind.
Dasselbe Phänomen von einem Multimedia Player (Xtreamer Sidewinder Pro)
Insbesondere Verzeichnisbäume mit tausenden Dateien (also noch weit weg vom Zetta Bereich) fallen unangenehm auf.
Ich habe 2 Pools. Einer ist Raidz1 mit 4 Platten und der zweite Pool ist eine 4TB Platte als Single ZFS ohne Redunanz.
Hardware ist ein Asus E-350 Dual Core 1600 Mhz Board mit 8GB Ram.
Wie unangenehm , gemessen in Zeiten anhand eines Beispieles.
Ein Verzeichnisbaum auf dem RaidZ1 mit MP3 Dateien (Unterverzeichnissen A-Z ) dauert beim ersten Scan vom Client aus fast 7 Minuten.
Wiederholende Scans sind dann in ca 5 Sekunden durch.
Über die 4 TB gesucht würden wir von ca 2 Stunden reden !!!
Natürlich hab ich als eifriger Leser sofort die L2Arc Cache Karte gezückt. Erstmal ne SSD ausgeliehen. Brachte so gut wie nichts.
Dann auf USB 3.0 Stick gewechselt. War bei mir vergleichbar und die SSD mußte ich wieder abgeben.
Hab den Secondarycache der beiden Pools auf Metadata gestellt. Den Primarycache wollte ich erstmal auf ALL stehen lassen um
beim kopieren auch noch etwas vom Caching zu profitieren.
Dann hab ich tagelang diverse Tests gemacht. Es verhält sich im Prinzip so daß ich mühevoll über Stunden die Metadaten aufbaue
und dann bei wiederholten Zugriffen es auch halbwegs flott geht. Logisch nicht so schnell wie lokal auf NTFS aber damit kann ich
durchaus leben. Aber sobald ich irgendeinen größeren Film aufs NAS kopiere haut der Primary ARC die Metadaten wieder über Bord.
Da nun ein L2Arc werkelt landen die Daten zwar auch dort aber der Geschwindigkeitsgewinn liegt allenfalls in der schnelleren
Zugriffszeit des Sticks. Beim Transfer kommt er natürlich nie an den Primary Cache (Ram) heran. Ist ja auch noch logisch bis hierhin.
Da ich keinen Bock habe 2 Stunden nach einer Datei zu suchen hab ich nach Lösungen gesucht. Mir kam die Idee direkt auf dem NAS
einen Cronjob laufen zu lassen der zu bestimmten Zeiten halt sowas macht ...
Also über Putty ins System und es auf der CLI ausprobiert. So und dann kam der spannende Moment.
Pool1 -> find /mnt/SP1 -iname "*pillepalle*"
Pool2 -> find /mnt/RZ1 -iname "*pillepalle*"
Damit gehts rekursiv über alle Dateien und am Ende sind alle Metadaten im Primary Cache.
Das dauert auf der 4TB Platte beim ersten Mal ca 2 Minuten. (ca 600000 Dateien)
Auf dem Raidz1 Pool sind fast nur große Dateien. Da ist er in ca 45 Sekunden drüber gehuscht.
Das ist eine Metadaten Aufbauzeit mit der ich bestens leben könnte.
Also erneut die find Kommandos ausgeführt und auf der 4TB Platte ist er dann in 7 Sekunden durch und im RaidZ1 quasi unmittelbar nach
drücken der Entertaste. Feine Sache. Kann ich den ganzen Abend machen. Superschnell. So wollte ich es.
Irgendwie hatte ich beim Bau des NAS aber wohl fälschlicherweise daran gedacht so ein NAS Server genau diese Funktionalitäten wie
Caching den Clients zur Verfügung stellt und nicht ausschließlich dem User Root der sich lokal via SSH an die Büchse hockt.
Dumm gelaufen. Aber so sieht es aus. Daher der Titel "Die Metadaten Lüge".
Wenn ich direkt nach dem das Kommando -> sysctl vfs.zfs.arc_meta_used
auslöse kann ich sehen daß der Meta Speicher noch leer ist.
Dann setze ich die beiden o.g Find Kommandos über beide Pools ab. Anschließend nochmals
das -> sysctl vfs.zfs.arc_meta_used Kommando und ich sehe daß nun ca 2.5 GB Metadaten im Cache sind.
Von da ab kann ich lokal via SSH innerhalb weniger Sekunden alles lokal scannen.
Dann dasselbe vom Windows Client aus. Schneckenlangsam wie eh und je. Beide Clients mit Windows 7 und auch der
Hardware Player profitieren nicht die Bohne von den Metadaten im Cache. Im Gegenteil. Im Schneckentempo bauen sie nun
ihrerseits noch mehr Metadaten auf. Wenn ich dieses stundenlange Szenario laufen lasse hab ich hinterher tatsächlich
5 GB Metadaten im Speicher. Also aus meiner Laiensicht quasi zweimal die gleiche Information für ein und dieselbe Sache.
Kann das so gewollt sein. Ich glaube nicht. Da wirds dann auch mit 8GB schnell knapp.
Sobald nun irgendeine Kopieraktion läuft werden die Metadaten wieder rausgekickt und ich fang wieder bei Null an.
Gleich mal die relevanten Einstellungen aus meiner Loader.conf für 8GB Speicher
Die Variable -> vfs.zfs.arc_meta_limit
hab ich raufgesetzt weil default 1/4 des ARCs für Metadaten reserviert sind. Das wären bei mir 1.4GB
Da ich aber "mehr" Metadaten im Cache haben wollte und die Variable "meta_limit" im real Betrieb überschritten wurde
hab ich den Wert erhöht. Es hat aber alles keinen Unterschied gemacht.
kern.maxfiles="65536"
kern.maxfilesperproc="50000"
kern.cam.boot_delay="8000"
vm.kmem_size="7G"
vfs.zfs.arc_max="5832M"
vfs.zfs.arc_min="3584M"
vfs.zfs.txg.timeout="5"
vfs.zfs.txg.synctime="1"
vfs.zfs.txg.write_limit_override="1073741824"
vfs.zfs.vdev.min_pending="1"
vfs.zfs.vdev.max_pending="1"
vfs.zfs.prefetch_disable="0"
vfs.zfs.arc_meta_limit="2384M"
Als letzte Idee hab ich dann heute den Primarycache auch auf Metadata gestellt.
Die Idee dahinter ist halt , daß nur noch Metadaten gecached werden. Also auch kein Grund mehr für den ARC sie beim kopieren
aus dem Speicher zu werfen. Das klappt lokal auch. Sind meine 2.5 GB via Find Kommando erstmal wieder aufgebaut
geht der Scan in Sekunden. Ich kann nun auch übers Netz kopieren bis der Arzt kommt und sie bleiben im Primary Cache.
Leider nützt die ganze Idee ja nichts , via geplantem Cron Job , wenn der Sambazugriff nicht gecached wird so wie es meiner
Meinung nach sein sollte. Trotzdem, testweise in den sauren Apfel gebissen und vom Client wieder einen Scan gestartet
über mein MP3 Verzeichnis. Nach langen 7 Minuten dann den zweiten Scan angeworfen. Was soll ich sagen ...
Ich mußte wieder 7 Minuten warten. Nun wird gar nichts mehr gecached.
Der Metadatenspeicher wächst auch nicht mehr wie vorher von 2.5Gb auf bis zu 5GB an. Er bleibt völlig unverändert.
Lokal via Putty SSH geht weiterhin die Post ab. Das ist gelinde gesagt zum kotzen.
Ich habe nur eine Einzige Schlußfolgerung .. und bitte jetzt nicht den Pauschal Hinweis -> mehr RAM.
Selbst wenn Ram immer gut ist, keine Frage. Aber das Board gibt zum einen nicht mehr wie 8GB her laut Doku und zum
anderen ist das für mich ein BUG oder schöner ausgedrückt ein Designfehler, wenn ein Fileserver nicht die Directory Zugriffe cached.
Meine Schlußfolgerung ist die daß Zugriffe von Windows aus über das SMB Protokoll auf der ZFS Seite nicht wie Metadaten gehandled
werden. Da ich ja mit der Einstellung vorher -> Primarycache ALL wenigstens beim zweiten Zugriff eine Beschleunigung hatte
und diese nun völlig wegfällt muß ZFS anscheinend diese Zugriffe wie Daten oder Kopieraktionen interpretieren.
Selbes Phänomen auch vom Hardware Media Player aus zu sehen. Wechsel ins Verzeichnis MP3 -> Buchstabe A ... 15 Sekunden
wieder raus und nochmal rein. Wieder 15 Sekunden. Das war vorher beim zweiten Zugriff nach ca 3 Sekunden da.
Nebenbei gesagt hat die Einstellung Primarycache= Metadata auch die Kopiergeschwindigkeit deutlich reduziert.
Wenns beim Scan geholfen hätte, würde ich damit durchaus leben können.
Aber so wie es sich mir derzeit darstellt , ist das einfach nur Mist. Ich kann mir nicht vorstellen daß das so gewollt ist.
Hab dann heute auch noch das Update auf die 636 Version gemacht. Es hat sich nichts geändert.
Wäre vieleicht jemand so nett und kann ggf versuchen dieses Phänomen auf seinem NAS mal nachzustellen.
Ich hab es extra sehr ausführlich beschrieben. Es sollte relativ einfach nachzuvollziehen sein.
Vieleicht entdeckt ja auch jemand noch einen Bug in meiner Loader.conf.
Nachtrag:
Da ich Samba in Verdacht hatte, hab ich sowohl das SMB2 Protokoll wie auch NT1 mit Async I/O wechselweise ausprobiert.
Bei beiden Protokollvarianten derselbe unangenehme Effekt.
Hier hatte vor 4 Jahren schonmal einer denselben Problemansatz
http://thr3ads.net/zfs-discuss/2008/10/ ... che-almost