Warum wird das Verfolgen vieler symbolischer Links schnell langsam?

Warum wird das Verfolgen vieler symbolischer Links schnell langsam?

Ich habe ein Verzeichnis mit ca. 2 Millionen Symlinks, die auf echte Dateien auf demselben Laufwerk verweisen, das eine echte lokale Festplatte ist (keine Netzwerkfestplatte). Die Dateinamen sind alle eindeutig und die Dateien, auf die sie verweisen, sind über verschiedene Verzeichnisse verstreut, haben aber alle denselben übergeordneten Pfad. Ich konsolidiere Dateien in mehreren Verzeichnissen mithilfe von Symlinks.

/some/full/path/consolidated/my_file -> /some/full/path/mydir2/my_file
/some/full/path/consolidated/my_file2 -> /some/full/path/mydir3/my_file2
/some/full/path/consolidated/my_file3 -> /some/full/path/mydir4/my_file3
/some/full/path/consolidated/my_file4 -> /some/full/path/mydir4/my_file4
/some/full/path/consolidated/my_file5 -> /some/full/path/mydir2/my_file5
/some/full/path/consolidated/my_file6 -> /some/full/path/mydir3/my_file6

Es wird garantiert, dass die symbolischen Links nicht unterbrochen werden.

Das Problem ist, dass

time find "/some/full/path/consolidated/" -maxdepth 1 -type l -print > /tmp/foo

ist schnell fertig:

1.24 user 0.83 system 0:02.08elapsed

Jedoch,

time find -L "/some/full/path/consolidated/" -maxdepth 1 -type f -print > /tmp/foo

gefolgt von

watch wc -l /tmp/foo

zeigt, dass es sehr schnell ~660.000 Zeilen erreicht, dann ins Stocken gerät und ab und zu ein paar tausend Ergebnisse hinzufügt.

Warum könnte es ins Stocken geraten? Und ist es möglich, den zweiten Befehl so schnell wie den ersten zu machen?

Bearbeiten: /tmpwird überhaupt nicht angezeigt mount(also nehme ich an, dass es kein tmpfs ist). Laut htop habe ich nicht zu wenig Speicher; ich habe etwa 50 GB frei. Die CPU-Auslastung ist ebenfalls gering. Bei find -L path, das ins Stocken gerät, /tmp/foosind es etwa 90 MB, wenn die Verlangsamung auftritt. Bei find path, das nicht ins Stocken gerät, /tmp/foosind es 111 MB.

Bei mir tritt die gleiche Verlangsamung auf, wenn ich die Ausgabe nach ~/foo umleite.

Bearbeiten: Beim Übersehen iotopwird find -Lein E/A von 99,99 % aufgelistet, jedoch erst nach etwa 10 Sekunden, also deutlich nachdem der normale findVorgang abgeschlossen wäre.

Antwort1

Versuchen Sie, Ihren Inode-Cache zu vergrößern mit

echo 50 | sudo tee /proc/sys/vm/vfs_cache_pressure

Wert 100 ist Durchschnitt, niedrigere Werte = größerer Inode+Dentry-Cache
Nachteil: ein größerer Cachekann langsamer sein, Sie können also auch versuchen, Ihren Cache zu verkleinern mit

echo 200 | sudo tee /proc/sys/vm/vfs_cache_pressure

oder Sie können eine zwischengespeicherte Dateiliste verwenden mit

sudo updatedb
locate /some/full/path/consolidated

Achten Sie auch auf die Inode-Nutzung, Symlinks belegen Inodes (auch Hardlinks)

df -i

verwandt:https://serverfault.com/questions/338097/tuning-linux-cache-settings-for-inode-caching

mehr zum Thema Disk-Tuning:https://unix.stackexchange.com/questions/30286/kann-ich-mein-linux-system-für-aggressiveres-dateisystem-caching-konfigurieren/41831

verwandte Informationen