Kopiergeschwindigkeit: kleine vs. große Dateien

Mickey Cohen

Commander
Registriert
Mai 2015
Beiträge
2.818
Hallo,

warum dauert es um so viel länger, viele kleine dateien zu kopieren als eine große datei? insbesondere beim kopieren von dateien von einer SSD auf eine jungfräuliche SSD ist mir das neulich wieder aufgefallen.

ich habe das natürlich gegoogelt, aber keine so wirklich befriedigende antwort gefunden.

1. overhead
daran kanns alleine jedenfalls nicht liegen. der overhead wird bei der dateigröße ja mitgezählt (oder?). das heisst, wenn ich jetzt eine 100GB-Datei oder 100 Millionen 1kB-Dateien kopiere, müssen in beiden fällen 100GB gelesen und geschrieben werden, da der overhead ja jeweils bereits mitgezählt wurde. selbst wenn er nicht mitgezählt würde: das schreiben von vielen kleinen dateien geschieht um so viel langsamer, dass der overhead unverhältnismäßig groß sein müsste, um das zu kompensieren: ein overhead um mehr als das 30-fache liegt bei 1kB-Dateien sicher nicht vor, wenn man mal von einer kopiergeschwindigkeit von 5MB/s (kleine dateien) zu 150 MB/s (große dateien) ausgeht.

2. lesen fragmentierter Dateien
auch das erklärt die geringere geschwindigkeit mMn. nicht vollständig. Selbst wenn die Quelle stark fragmentiert wäre und beim Lesen daher extrem viele random-zugriffe nötig wären, so dürfte der lesevorgang der quelle (SSD) immer noch schneller als im niederigen einstelligen MB/s bereich vonstatten gehen. Außerdem kann auch eine große Datei in viele kleine kleine Stückchen zerstückelt vorliegen.

3. Daten werden beim schreiben fragmentiert
Hier gilt eigentlich das selbe: auch eine große datei kann in viele kleine stückchen zerpflückt werden. Da es sich in meinem fall aber um eine Leere SSD gehandelt hat, gibt es garkeinen grund, beim schreiben großartig rumzufragmentieren.


Vll. kanns mir wer erklären, vielen Dank!
 
Fragmentierung ist zwar ein Thema (Bulk vs Random Zugriffe), aber nicht sooo relevant bei SSDs.
Das Geheimnis ist der Overhead im OS. Jede Datei muss einzeln befehligt werden. Und zwar jedesmal wenn die vorherige fertig ist. Inkl Abläufe die das OS + Dateisystem so ausführen (Datei Kontrolle, Speicherzuweisung, etc). Da geht die Zeit hin und damit die durchschnittliche Übertragungsrate in den Keller.

Das ist natürlich vereinfacht, aber IMHO zutreffend genug.
 
  • Gefällt mir
Reaktionen: Mickey Cohen
Mickey Cohen schrieb:
daran kanns alleine jedenfalls nicht liegen. der overhead wird bei der dateigröße ja mitgezählt (oder?)
Was soll da mitgezählt werden? Zugriffe auf das Dateisystem oder einfach nur zusätzliche Systemaufrufe zählt niemand mit. Zur Dateigröße gehört noch nicht einmal der Directory-Eintrag, von dem halt entweder einer oder (in Deinem Beispiel) 100 Mio Einträge zu lesen und zu schreiben sind, was selbst mit Caching im extremst übertakteten Ram seine Zeit dauert.

Das sind dann in Deinem Beispiel für die 100 Mio 1KB Dateien 600 Mio Systemaufrufe (Datei öffnen, einen Sektor lesen/schreiben, Datei schließen vs. ca. 100k Systemaufrufen (Datei öffnen, 1 MB lesen/schreiben und Datei wieder schließen). Das können auch ein paar Aufrufe mehr sein, wenn der Explorer mit kleineren Blöcken arbeitet, es sind aber trotzdem um Größenordnungen weniger.

Mickey Cohen schrieb:
das heisst, wenn ich jetzt eine 100GB-Datei oder 100 Millionen 1kB-Dateien kopiere, müssen in beiden fällen 100GB gelesen und geschrieben werden
Warum wohl sind selbst bei SSD-Tests die Werte mit 1KB Blöcken kleiner wie mit 64 KB blöcken? Bei 512KB Blockgröße (mögen mittlerweile auch 4MB sein) sind je 512 KB Nutdaten bei einer Datei, die >512KB groß ist, genau ein Block zu lesen/schreiben, bei 512 Datein a 1KB sind es aber 512 Blöcke. Wobei bei SSDs die Fragmentierung zwar egal ist, nicht aber die Anzahl der zwischen SSD und CPU zu übertragenden Blöcke/Sektoren.

Mickey Cohen schrieb:
ein overhead um mehr als das 30-fache liegt bei 1kB-Dateien sicher nicht vor, wenn man mal von einer kopiergeschwindigkeit von 5MB/s (kleine dateien) zu 150 MB/s (große dateien) ausgeht.
Lassen wir mal die "tolle" Anzeige vom Explorer oder robocopy weg (hast Du bei Deinen Tests hoffentlich auch, auch sowas kostet Zeit da Windows immer nur eine Datei nach der anderen Kopiert und zwischendrin die Anzeige aktualisiert) dürfte es vor allem die Anzahl zu schreibender Blöcke sein, die sich halt massiv unterscheidet.

So Dinge wie die Protokollierung von NTFS (dort kann man die Protokollierung des letzen lesenden Zugriffs auf eine Datei einstellen, was dann halt 100 Mio Schreibzugriffe vs. einen Zugriff wäre) oder beim Schreiben das Transaktions-Log lasse ich einfach mal weg, dafür kenne ich die Internas von NTFS zu wenig.

Versuche einfach mal die kleinen Dateien mit robocopy und der Option /MT:8 (oder noch mehr, also hier im Beispiel mit 8 Dateien parallel) zu kopieren.
 
  • Gefällt mir
Reaktionen: andy_0 und Mickey Cohen
Für jeden Ordner, jede Datei wird ein Eintrag erstellt, damit das OS "weiß", wo sie zu finden ist... und ob das einmal oder 100 Millionen mal gemacht wird, ist halt ein Unterschied...
 
Der Verwaltungsoverhead kann durchaus der limitierende Faktor werden. Wenn ausreichend viele kleine Dateien betroffen sind, wird jeder noch so schnelle Datenträger dadurch ausgebremst.

Ein ehemaliger Entwickler von Microsoft (war an Windows NT und 9x beteiligt) hat das vor etwa einer Woche gerade in einem Video erklärt. Geht zwar vorranggig darum, warum die Fortschrittsanzeige beim Kopieren teils extrem ungenau ist, aber er geht da auf die technischen Hintergründe ein.
 
  • Gefällt mir
Reaktionen: Mickey Cohen
Zurück
Oben