Filesystem langsam?!

Beim Shell Zugriff auf einen Unterverzeichnisbaum beobachte ich extrem hohe i/o Last, der Zugriff ist langsam. Alle Daten befinden sich auf der lokal gemounteten Platte (ext3). Der Basispfad lautet /data/inhalt/,
darunter befinden sich bis zu 6 weiterer Verzeichnisebenenen. In jedem Verzeichnis sind max 100 Einträge. Beispiel

/data/inhalt/a/b/c/d/e/f/datei1.txt
/data/inhalt/a/b/c/d/e/f/datei2.txt

/data/inhalt/a/b/c/d/e/f/datei99.txt
/data/inhalt/a/b/c/d/e/g/datei1.txt

Ein „du -sk“ auf der Ebene /data/inhalt benötigt mehere Stunden. Während des Aufrufs wird eine i/o wait von 5-22% Verzeichnet. Breche ich den Aufruf mit CTRL-C ab, fällt die Last kurz darauf wieder auf 0%. Ich bin alleine auf dem Rechner, d.h. andere Störeinflüsse sind ausgeschlossen.

Selbst einfache Kommandos wie „cd a/b/c/d“ laufen sehr zäh. Ich habe den Eindruck, dass jeder Zugriff auf eine Verzeichnis unmengen i/o verursacht.

In Summe liegen im Verzeichnisbaum sehr viele Dateien (mehrere 100GB). Aber warum ist der Dateizugriff so langsam? Ich habe erwartet, dass Dateisystemoperationen wie ls oder cd nicht viele Plattenzugriffe erfordern. Trotzdem schein jede Navigation durch den Verzeichnisbaum unmengen an i/o zu verursachen. Warum?

Hallo,

In Summe liegen im Verzeichnisbaum sehr viele Dateien (mehrere
100GB). Aber warum ist der Dateizugriff so langsam? Ich habe
erwartet, dass Dateisystemoperationen wie ls oder cd nicht
viele Plattenzugriffe erfordern. Trotzdem schein jede
Navigation durch den Verzeichnisbaum unmengen an i/o zu
verursachen. Warum?

Hm. Keine rechte Ahnung. Platte kaputt? Verrät dmesg was? oder /var/log/*? smartctl?

Gruß.

Sebastian

Hallo wortfuchs,
ich lehne mich jetzt mal ganz weit aus dem Fenster und denke, daß die Probleme mit der Festplatte zusammenhängen, nicht mit ext3.
Ich habe bei mir mal du -sk / durchgeführt. Für meine 55 GB hat das ca. 3 min 30 sek gebraucht. Wenn ich das jetzt hochrechne, komme ich bei 1000 GB auf rund 1 h. Das kann man natürlich nicht so extrapolieren, aber einen ungefähren Richtwert gibt es vielleicht doch. Als Festplatte habe ich eine stinknormale 320 GB von Western Digital (SATA), die in einem Rechner mit AMD64 steckt, alles ca. 4 Jahre alt, also alles andere als eine Rakete.
Für weitere Vergleiche habe ich ein paar Benchmarks gefunden, da kannst Du ja selbst vergleichen:
http://www.pro-linux.de/artikel/2/224/2,das-dateisys…
http://linuxgazette.net/122/TWDT.html#piszcz
http://www.bitblokes.de/2010/04/dateisystem-benchmar…
Das sind wohl alle (bis auf den letzten) ältere Benchmarks noch mit IDE-FP, aber das ist vielleicht um so besser, weil viel langsamer sollte es dann doch nicht werden.
Es gibt ja noch Tuningmöglichkeiten mit tune2fs (z.B. welchen Journalmodus, Verzeichnis Indexierung oder nicht, noatime bzw. reltime und die commit-Zeiten in der fstab), aber ich glaube nicht, daß das mehr als 10% Zuwachs bringen sollte. Ich habe es aber auch nicht ausprobiert, vielleicht haben andere praktische Erfahrungen damit.
Das hilft dir jetzt nicht so richtig bei der Ursachenfindung, aber vielleicht ein wenig beim Nachrechnen, ob dein System wirklich grottenlangsam ist oder, wider Erwarten, doch im Durchschnitt liegt.

Viele Grüße
Marvin

Hallo Marvin,

danke für deine Recherchen!

Ich habe bei mir mal du -sk / durchgeführt. Für meine 55 GB
hat das ca. 3 min 30 sek gebraucht. Wenn ich das jetzt
hochrechne, komme ich bei 1000 GB auf rund 1 h.

Mein „du -sk“ läuft nun seit gut 5 Stunden und dürfte jetzt 80% durch haben.

Es gibt ja noch Tuningmöglichkeiten mit tune2fs (z.B. welchen
Journalmodus, Verzeichnis Indexierung oder nicht, noatime bzw.
reltime und die commit-Zeiten in der fstab), aber ich glaube
nicht, daß das mehr als 10% Zuwachs bringen sollte. Ich habe
es aber auch nicht ausprobiert, vielleicht haben andere
praktische Erfahrungen damit.

Ich habe selbst noch ein wenig geforscht und bin hier fündig geworden:

http://entwickler-magazin.de/zonen/magazine/psecom,i…

[…] noatime: Bei jedem Zugriff auf eine Datei wird im Inode die Zugriffszeit gespeichert. Wenn Sie die Zugriffszeit nicht benötigen, können Sie über die Option noatime verhindern, dass diese in den Inode geschrieben wird und sparen somit eine Menge Schreibzugriffe im Dateisystem. […]

[…] ext3 verfügt über einen zusätzlichen H-Baum-Verzeichnisindex (hashed b-tree Indexing), der eine hohe Performance bei Zugriffen auf Verzeichnisse mit vielen Dateien ermöglicht (wie zum Beispiel bei einem Mail- oder Fileserver). Sie können diese Indexierung aktivieren, indem Sie -O dir_index beim Erstellen des Dateisystems zum mke2fs-Befehl hinzufügen. […]

Mein ext3 ist nur mit defaults gemountet. Ich habe irgendwie noch die Hoffnung, dass diese Punkte mein file system beschleunigen können. Auch fällt es mir schwer zu glauben, dass ein modernes File System wie ext3 nicht in der Lage, den Verzeichnis-Inhalt einer TB Platte deutlich unter einer Stunde herauszugeben.
Ich nehme zum Vergleich mal mein Windows mit einer TB Platte: auf NTFS benötigt das Tool Folder Size

Hallo,

Ich habe bei mir mal du -sk / durchgeführt. Für meine 55 GB
hat das ca. 3 min 30 sek gebraucht. Wenn ich das jetzt
hochrechne, komme ich bei 1000 GB auf rund 1 h.

Mein „du -sk“ läuft nun seit gut 5 Stunden und dürfte jetzt
80% durch haben.

Hm, auch das ist - finde ich - viel:

root@ceramic:~# time du -sh /
1,8T /

real 1m27.670s
user 0m0.840s
sys 0m4.176s

Anderer Versuch:

root@ceramic:~# time du -sk /
1871669150 /

real 0m53.116s
user 0m0.624s
sys 0m3.056s
root@ceramic:~# 

Der Rechner ist recht flott, die Platten sind SATA-Platten, die in erster Linie des niedrigen Geräuschpegels und des Preises wegen gekauft wurden - also auch nichts, was wirklich schnell ist. Und da ist noch komisches Zeug gemounted wie zweimal davfs.

root@ceramic:~# mount 
/dev/mapper/ceramic-root on / type ext3 (rw,errors=remount-ro)
tmpfs on /lib/init/rw type tmpfs (rw,nosuid,mode=0755)
proc on /proc type proc (rw,noexec,nosuid,nodev)
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
udev on /dev type tmpfs (rw,mode=0755)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=620)
/dev/sdb1 on /boot type ext2 (rw)
/dev/mapper/ceramic-home on /home type ext3 (rw)
/dev/mapper/ceramic-tmp on /tmp type ext3 (rw)
/dev/mapper/ceramic-usr on /usr type ext3 (rw)
/dev/mapper/ceramic-var on /var type ext3 (rw)
/dev/sda5 on /mnt/backup type ext3 (rw,noexec,nosuid,nodev)
rpc\_pipefs on /var/lib/nfs/rpc\_pipefs type rpc\_pipefs (rw)
fusectl on /sys/fs/fuse/connections type fusectl (rw)
nfsd on /proc/fs/nfsd type nfsd (rw)
binfmt\_misc on /proc/sys/fs/binfmt\_misc type binfmt\_misc (rw,noexec,nosuid,nodev)
https://mediacenter.gmx.net/ on /mnt/gmx-mw type davfs (rw,nosuid,noexec,nodev,\_netdev,uid=1000)
https://sd2dav.1und1.de/ on /mnt/einsundeins type davfs (rw,nosuid,noexec,nodev,\_netdev,uid=1000)
/etc/hylafax on /var/spool/hylafax/etc type none (rw,bind)
/dev/sdd1 on /media/EOS\_DIGITAL type vfat (rw,nosuid,nodev,uhelper=hal,uid=1000,utf8,shortname=mixed,flush)

Einen Teil der Geschwindigkeit erkläre ich mir damit, daß das nicht der erste Versuch ist und noch ein Teil der Informationen im FS-Cache liegt, aber auch der erste Versuch hat so um knapp 4 Minuten gedauert. Und ich vermag ehrlich gesagt auch nicht zu glauben, daß das an dem flotten Prozessor (AMD Phenom 2,8 GHz mit drei Kernen) liegt, sondern dass hier I/O viel maßgeblicher ist.

Ich habe selbst noch ein wenig geforscht und bin hier fündig
geworden:

http://entwickler-magazin.de/zonen/magazine/psecom,i…

[…] noatime: Bei jedem Zugriff auf eine Datei wird im Inode
die Zugriffszeit gespeichert. Wenn Sie die Zugriffszeit nicht
benötigen, können Sie über die Option noatime verhindern, dass
diese in den Inode geschrieben wird und sparen somit eine
Menge Schreibzugriffe im Dateisystem. […]

[…] ext3 verfügt über einen zusätzlichen
H-Baum-Verzeichnisindex (hashed b-tree Indexing), der eine
hohe Performance bei Zugriffen auf Verzeichnisse mit vielen
Dateien ermöglicht (wie zum Beispiel bei einem Mail- oder
Fileserver). Sie können diese Indexierung aktivieren, indem
Sie -O dir_index beim Erstellen des Dateisystems zum
mke2fs-Befehl hinzufügen. […]

Ich habe hier nur die defaults.

Gruß,

Sebastian

Hallo Wortfuchs,

Mein „du -sk“ läuft nun seit gut 5 Stunden und dürfte jetzt
80% durch haben.

Nein, das ist entschieden zu lange. Ich würde wirklich mal die „Gesundheit“ deiner Platte testen, z.b. mit den smartmonTools
http://sourceforge.net/apps/trac/smartmontools/wiki
Übrigens, welche Festplatte hast Du denn?

Mein ext3 ist nur mit defaults gemountet. Ich habe irgendwie
noch die Hoffnung, dass diese Punkte mein file system
beschleunigen können.

Meine läuft auch nur per default-Werte. Beschleunigen kannst Du so die FP sicher etwas, aber auf keinen Fall werden aus deinen über 5 Stunden z.B. 50 Minuten werden.

Auch fällt es mir schwer zu glauben,
dass ein modernes File System wie ext3 nicht in der Lage, den
Verzeichnis-Inhalt einer TB Platte deutlich unter einer Stunde
herauszugeben.

Wie gesagt, ich glaube nicht, daß es an ext3 liegt. Viele Profi-Server mit deutlich mehr als Terra-Byte-Volumen nutzen ext3, die wären ja bei solchen „Geschwindigkeiten“ aufgeschmissen. Der Flaschenhals liegt woanders.
Übrigens habe ich mal meine externe Backup-FP angeklemmt, auf der sich 140 GB tummeln, und mit ihr das Experiment mit du -sk /mnt wiederholt. Zeitdauer ca. 13 Minuten, also wiederum hochgerechnet noch weit unter deinen 5 Stunden.

Viele Grüße
Marvin

Danke für eure Antworten! Ich habe eigene Benchmarks angestossen und bin nun der Meinung, dass die Anzahl der Dateien im Filesystem ausschlaggebend für die Performance ist.

Um die Leistungsgrenze aufzuzeigen habe ich ein schwaches System ausgewählt: VMWare mit Linux auf der NTFS Partition. Ein bash Skript erzeugt eine Verzeichnisstruktur mit drei Ebenen, je Ebene sind bei etwa 12Mio Dateien liegt der io-wait bei 99%, die Platte ist 2% voll. Eine Viertelstunde nach Skriptabbruch liegt io-wait bei >80%. Test abgebrochen und VMWare resetted.

  1. ext3 mit noatime,dir_index,data=writeback
    Auch bei >12Mio Einträgen kaum io-wait. Nach 8h breche ich den Test bei einem Füllstand von etwa 2% ab. Diese Variante scheint deutlich schneller.
    => Die Platte wird deutlich schneller. Daten werden einfach geschrieben (reduziertes Journaling)

Insgesamt aber eine mühevolle Aufgabe, eine VMWare Platte auf 80% zu bringen. Vermutlich würde mein Testsystem >1 Woche benötigen :wink: