Ich verwende Openfiler 2.3 auf einem HP ML370 G5, Smart Array P400, SAS-Festplatten, die mit RAID 1 + 0 kombiniert wurden.
Ich habe eine NFS-Freigabe von einer ext3-Partition mithilfe der webbasierten Konfiguration von Openfiler eingerichtet und konnte die Freigabe von einem anderen Host aus bereitstellen. Beide Hosts sind über eine dedizierte Gigabit-Verbindung verbunden.
Einfacher Benchmark mit dd
:
$ dd if=/dev/zero of=outfile bs=1000 count=2000000
2000000+0 records in
2000000+0 records out
2000000000 bytes (2.0 GB) copied, 34.4737 s, 58.0 MB/s
Ich sehe, dass es eine moderate Übertragungsgeschwindigkeit (58,0 MB / s) erreichen kann.
Wenn ich jedoch ein Verzeichnis kopiere, das viele kleine Dateien ( .php
und .jpg
etwa 1 bis 4 KB pro Datei) mit einer Gesamtgröße von ~ 300 MB enthält, cp
endet der Vorgang in etwa 10 Minuten.
Ist NFS nicht wie oben beschrieben für die Übertragung kleiner Dateien geeignet? Oder gibt es einige Parameter, die angepasst werden müssen?
quelle
Antworten:
Es gibt viele Gründe, warum das Übertragen vieler kleiner Dateien immer langsamer ist als das Übertragen einer einzelnen großen Datei. Beim Lesen sind die Dateien mit größerer Wahrscheinlichkeit auf der Festplatte verteilt, sodass überall gesucht werden muss, um sie abzurufen. Wie Evan erwähnte, gibt es auch Metadaten im Fall von NFS (oder einem anderen Dateisystem!), Was die Dinge ebenfalls kompliziert macht.
Sie können versuchen, Ihre
rsize
undwsize
Parameter auf den NFS-Mount zu erhöhen , um festzustellen, ob dies die Leistung ein wenig verbessert. Lesen Sie auch diese Frage zum Optimieren von NFS auf minimale Latenz, da sie viele hilfreiche Ratschläge enthält, die bei vielen kleinen Dateiübertragungen hilfreich sind.quelle
Ich habe nicht viel NFS-Erfahrung, aber meine Erfahrung mit anderen Netzwerk-Filesharing-Protokollen zeigt, dass die Leistung im Szenario "Viele kleine Dateien" fast überall leidet. Sie haben eine Round-Trip-Latenz und über eine große Gruppe von Dateien summiert sich diese Latenz.
quelle
Haben Sie es mit einem anderen Dateisystem wie XFS versucht? Es löste alle meine Probleme bei extrem kleinen Mengen kleiner iSCSI-Blockübertragungen. Keine Ahnung warum.
Außerdem ist iSCSI / NFS normalerweise für ziemlich große Datenrahmen (Jumbo-Rahmen usw.) konfiguriert. Es kann Sie verletzen, wenn Sie winzige Dateien einzeln kopieren. Vielleicht würde es Ihnen helfen, zu tarieren und dann zu übertragen.
quelle
Überprüfen Sie, ob Sie eine TCP-Verbindung verwenden ( mount -t nfs -o TCP- Host: / mount / target ). Die Leistung auf modernen Systemen wird nicht beeinträchtigt, aber kleine E / A können sich erheblich verbessern, wenn Ihr Netzwerk geladen ist.
Und Sie sollten auch ein anderes Dateisystem ausprobieren. ext3 ist im Grunde das langsamste von allen. Es ist solide, bekannt, aber für einen Dateiserver ziemlich ungeeignet. XFS ist viel besser und reiserfs ist auch bei kleinen E / A viel besser.
quelle
Wenn Sie einen großen Verzeichnisbaum kleiner Dateien über NFS übertragen möchten und sich beim Server anmelden können, erstellen Sie am besten eine TAR-Datei, die automatisch auf dem Client wie folgt extrahiert wird:
tar c mydirectory | ssh user @ host tar -xf - -C destdir
Auf diese Weise wird nur eine einzige "Datei" über das Netzwerk übertragen und Sie haben sofort alle Ihre Dateien auf dem Host.
quelle
Um Evans Antwort zu ergänzen, haben Sie auch den gesamten Aufwand für das Erstellen der Metadaten (Verzeichniseinträge usw.) für jede Datei, über die Sie kopieren.
quelle
Eine ähnliche Lösung wie Chris 'Antwort wäre, Ihre Dateien regelmäßig mit den Clients zu synchronisieren. Wenn Sie bidirektionale Änderungen vornehmen möchten, können Sie auch unisono verwenden.
quelle
Das Problem ist, dass Ihre Freigabe mit der
sync
Option (Standardeinstellung) exportiert wird . Verwenden Sieasync
diese Option, um das Schreiben erheblich zu beschleunigen. Siehe nfs.sourceforge.net/nfs-howto/ar01s05.htmlquelle