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:
/tmp
wird ü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/foo
sind es etwa 90 MB, wenn die Verlangsamung auftritt. Bei find path
, das nicht ins Stocken gerät, /tmp/foo
sind es 111 MB.
Bei mir tritt die gleiche Verlangsamung auf, wenn ich die Ausgabe nach ~/foo umleite.
Bearbeiten: Beim Übersehen iotop
wird find -L
ein E/A von 99,99 % aufgelistet, jedoch erst nach etwa 10 Sekunden, also deutlich nachdem der normale find
Vorgang 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