Werden Dateien nacheinander auf der Festplatte gespeichert?


22

Wie ich verstanden habe, bedeutet "spärliche Datei", dass die Datei "Lücken" aufweisen kann, sodass die tatsächlich verwendeten Daten möglicherweise kleiner als die logische Dateigröße sind.

Wie speichern Linux-Dateisysteme Dateien auf der Festplatte? Ich interessiere mich hauptsächlich für ext4. Aber:

  1. Kann eine Datei nicht nacheinander auf der Festplatte gespeichert werden? Damit meine ich, dass sich ein Teil der Datei an der physischen Adresse X und der nächste Teil an der physischen Adresse Y befindet, die nicht in der Nähe von X + Offset liegt.
  2. Kann ich irgendwie die Dateisequenz steuern?
    Ich möchte eine Datei von 10 GB zuweisen. Ich möchte, dass es sequentiell auf der Festplatte abläuft und nicht zwischen verschiedenen Offsets aufgeteilt wird.
  3. Funktioniert es zwischen den verschiedenen Typen unterschiedlich?


1
Wenn ich Ihre Absicht richtig verstehe, interessieren Sie sich möglicherweise mehr für APIs auf niedrigerer Ebene, bei denen Sie mit Speichergeräten arbeiten, ohne die Dateisystemschicht durchlaufen zu müssen. Ihr Einstiegspunkt könnte dann das dmsetupProgramm sein, eine Schnittstelle zum Geräte-Mapper. Dies ist möglicherweise eine gute Wahl, wenn Sie einen datenbankähnlichen Speicher planen.
wvxvw

4
Dies ist ein Implementierungsdetail des Dateisystems. Fast alle Dateisysteme tun Fragment Dateien standardmäßig; nur iso9660und romfssind dazu nicht in der Lage und erfordern eine kontinuierliche Speicherung (von diesen kann ich off-head auflisten).
Mirabilos

2
Unabhängig davon, ob die Datei auf der Festplatte zusammenhängend ist oder nicht, ist das Lesen / Schreiben von Daten immer zusammenhängend, sofern Sie nicht einen anderen Teil der Datei durchsuchen. Warum interessiert dich das? Es sei denn, Fragmentierung ist ein ernstes Problem, das die Leistung beeinträchtigt
phuclv

3
@hudac Eine Sache zu beachten ist, dass zusammenhängende nicht allzu nützlich in der Praxis ist. Die einfache Variante ist Flash, bei der die Fragmentierung keine große Rolle spielt. Auf einem sich drehenden Plattenteller profitieren Sie jedoch möglicherweise immer noch nicht von zusammenhängenden Daten. Auf einem sich drehenden Plattenteller müssen Sie über Ihre Zugriffsmuster nachdenken und wissen, wo sich die Daten befinden. Wenn Sie den Sektor benötigen, der gerade unter dem Kopf vorbeigegangen ist, müssen Sie warten, bis er wieder vollständig verfügbar ist. Um die besten Ergebnisse zu erzielen, sollten Sie die Daten so verschieben, dass sie "nah" sind, wenn sie gelesen werden müssen. Das Vergrößern des Caches ist einfacher ;-)
Ukko

Antworten:


41

Kann eine Datei nicht nacheinander auf der Festplatte gespeichert werden? Ich meine, ein Teil der Datei befindet sich unter der physischen Adresse X und der andere Teil unter der physischen Adresse Y, die nicht in der Nähe von X + Offset liegt.

Ja; Dies wird als Dateifragmentierung bezeichnet und ist insbesondere bei größeren Dateien keine Seltenheit. Die meisten Dateisysteme weisen Speicherplatz nach Bedarf zu, mehr oder weniger nacheinander. Sie können jedoch kein zukünftiges Verhalten erraten. Wenn Sie also 200 MB in eine Datei schreiben und dann weitere 100 MB hinzufügen, ist die Wahrscheinlichkeit nicht null, dass beide Datensätze dies tun in verschiedenen Bereichen der Festplatte gespeichert werden (grundsätzlich kann jeder andere Schreibvorgang, der nach dem ersten und vor dem zweiten Schreibvorgang mehr Speicherplatz auf der Festplatte benötigt, zwischen den beiden erfolgen). Wenn ein Dateisystem fast voll ist, ist die Situation in der Regel noch schlimmer: Möglicherweise gibt es keinen zusammenhängenden Bereich mit freiem Speicherplatz, der groß genug ist, um eine neue Datei aufzunehmen, sodass diese fragmentiert werden muss.

Kann ich die Reihenfolge der Dateien irgendwie kontrollieren? Ich möchte eine große Datei von 10 GB zuweisen. Ich möchte, dass es auf der Festplatte sequentiell abläuft und nicht zwischen verschiedenen Offsets aufgeteilt wird.

Sie können dem Dateisystem die Zielgröße Ihrer Datei mitteilen, wenn diese erstellt wird. Dies hilft dem Dateisystem, es optimal zu speichern. Viele moderne Dateisysteme verwenden eine als verzögerte Zuordnung bekannte Technik, bei der das Layout einer neuen Datei auf der Festplatte so spät wie möglich berechnet wird, um die bei der Berechnung verfügbaren Informationen zu maximieren. Sie können diesen Vorgang unterstützen, indem Sie mit der posix_fallocate(3)Funktion dem Dateisystem mitteilen, wie viel Speicherplatz insgesamt zugewiesen werden soll. Moderne Dateisysteme werden versuchen, diese Zuordnung nacheinander vorzunehmen.

Funktioniert es zwischen den verschiedenen Typen unterschiedlich?

Verschiedene Dateisysteme verhalten sich unterschiedlich, ja. Protokollbasierte Dateisysteme wie NILFS2 weisen Speicher nicht auf die gleiche Weise zu wie extensionsbasierte Dateisysteme wie Ext4, und das ist nur ein Beispiel für eine Variation.


1
Stellt die Verwendung fallocate(3)die Reihenfolge der Dateien sicher? oder wird nur auf das Dateisystem hingewiesen? Ich kann es nicht vollständig aus den Manpages verstehen.
Hudac

6
Die sequenzielle Zuordnung kann nicht sichergestellt werden. Dies ist nur ein Hinweis. Aber Sie sollten es auf jeden Fall verwenden, wenn Sie 10GiB-Dateien schreiben!
Stephen Kitt

6
Im Wesentlichen werden alle Dateisysteme, die komplexer als FAT sind - dies geht bis zum ursprünglichen Berkeley UFS zurück - absichtlich große Dateien aufteilen und auf mehrere "Zuordnungsgruppen" verteilen. Dies hilft ihnen dabei, die Gesamtfragmentierung der Festplatte zu minimieren . Es kann eine Möglichkeit geben, die Funktionsweise anzupassen, aber es ist gut möglich, dass Sie das Dateisystem von Grund auf neu erstellen müssen, um dies zu tun, und es gibt wahrscheinlich keine Möglichkeit, es vollständig auszuschalten.
zwol

2
@hudac Es ist unmöglich, in allen Fällen eine Aufeinanderfolge zu gewährleisten (siehe den Fall mit einem Laufwerk, das fast voll ist), und ehrlich zu sein, dass SSDs auf dem Vormarsch sind, ist weniger wichtig als früher (für diejenigen, die es sich zumindest leisten können) ).
Muzer

1
Beachten Sie auch, dass es Situationen wie RAID-Systeme gibt, in denen zusammenhängende Dateien weniger effizient sind, wenn dies überhaupt möglich ist. Ich denke, das ist wirklich der Zweck eines Platten- / Speichersubsystem-Controllers: die gesamte Arbeit des Speicherns von Dateien so optimal auszulagern, wie es vernünftigerweise zu erwarten ist.
Jamesqf

17

Mit dem Befehl filefragerfahren Sie, wie Ihre Datei physisch auf Ihrem Gerät gespeichert ist:

# filefrag -v /var/log/messages.1 
Filesystem type is: ef53
File size of /var/log/messages.1 is 41733 (11 blocks, blocksize 4096)
 ext logical physical expected length flags
   0       0  2130567               1 
   1       1 15907576  2130568      1 
   2       2 15910400 15907577      1 
   3       3 15902720 15910401      7 
   4      10  2838546 15902727      1 eof
/var/log/messages.1: 5 extents found

Wenn Sie Ihre Datei in einem Durchgang schreiben, kann ich davon ausgehen, dass Ihre Datei nicht fragmentiert wird.

Die Manpage von fallocate(1) ist ziemlich klar:

fallocate wird verwendet, um einer Datei Blöcke vorab zuzuweisen. Bei Dateisystemen, die den fallocateSystemaufruf unterstützen, geschieht dies schnell, indem Blöcke zugewiesen und als nicht initialisiert markiert werden, ohne dass für die Datenblöcke eine E / A erforderlich ist. Dies ist viel schneller als das Erstellen einer Datei durch Füllen mit Nullen.

Ab dem Linux-Kernel v2.6.31 wird der fallocateSystemaufruf von den Dateisystemen btrfs, ext4, ocfs2 und xfs unterstützt.

Ist es sequentiell? Das System versucht zunächst, die Blöcke der Reihe nach zuzuweisen. Wenn dies nicht möglich ist, werden Sie nicht gewarnt.


Was ist Typ 'ef53'. Ich habe es auch in meinen Akten gesehen. Aber mein FS-Typ ist ext4.
Hudac

2
EF53 ist die "SUPER_MAGIC" Nummer von ext2, ext3 und ext4. Suchen Sie in "include / uapi / linux / magic.h" in den Kernel-Quellen nach allen magischen Nummern jedes Dateisystems.
Vouze

Auf Debian filefragist versteckt in /usr/sbin. Aber es scheint für normale Benutzer zu funktionieren (zumindest für ext4). Es kann für straceden Betrieb lehrreich sein, zu sehen, wie Sie die Fragmentierung selbst messen können, wenn das Fehlen einer Warnung Sie behindert.
Toby Speight

6

Sie erwähnen spärliche Dateien, und keine der anderen Antworten hat sie erwähnt.

Die meisten Dateien sind nicht dünn. Am häufigsten erstellen Sie eine Datei, indem Sie sie von Anfang bis Ende auf einmal schreiben. Keine Löcher da.

Sie dürfen jedoch sagen: "Gehen Sie auf Position 1.000.000.000.000 und schreiben Sie dort ein Byte." Dadurch wird eine Datei erstellt, die aussieht, als wäre sie ein Etabyte groß, verwendet jedoch (wahrscheinlich) nur 4 KB auf der Festplatte. Dies ist eine spärliche Datei.

Sie können dies viele Male für dieselbe Datei tun, wobei kleine Datenmengen über die große Leere verstreut bleiben.

Dies kann zwar nützlich sein, hat aber zwei Nachteile.

Das erste ist, dass die Datei fragmentiert wird, worüber Sie sich Sorgen gemacht haben.

Der zweite Grund ist, dass nicht alle Programme mit diesen Dateien gut umgehen. Beispielsweise versucht eine Sicherungssoftware, die Leere zu sichern und erstellt dadurch eine Sicherung, die viel größer als erforderlich ist und möglicherweise zu groß für das Sicherungsmedium ist.


Aber selbst eine Datei mit geringer Dichte ist auf der Festplatte häufig nicht zusammenhängend.
Barmar

2

Kann ich irgendwie die Dateisequenz steuern? Ich möchte eine Datei von 10 GB zuweisen. Ich möchte, dass es sequentiell auf der Festplatte abläuft und nicht zwischen verschiedenen Offsets aufgeteilt wird.

Es gibt mindestens ein paar Möglichkeiten, dies zu erreichen.

  1. Verwenden Sie ein Dateisystem mit viel freiem Speicherplatz und weisen Sie den Speicherplatz vorab zu (z. B. verwenden Sie einen anwendungsspezifischen Datenende-Marker und hängen Sie zufällige Daten an, bis die Dateigröße 10 GB erreicht). Es ist nicht garantiert, dass dies zu unfragmentierten Daten führt.

  2. Verwenden Sie ein rohes (ungekochtes) Dateisystem anstelle von ext4 usw. DBMS tun dies manchmal aus Leistungsgründen. Der Kompromiss besteht darin, dass Sie bei Bedarf Ihr eigenes Caching / Journalling / Recovery usw. durchführen müssen.

Fälle, in denen Sie viel davon haben, sind relativ selten - ich würde mich zuerst umsehen, um die Leistung zu optimieren.


Siehe auch

Stimmt es, dass Datenbankverwaltungssysteme normalerweise Dateisysteme umgehen?


-1

Wenn dies nur eine einmalige Angelegenheit ist und es nicht wichtig ist, wie die Datei ursprünglich gespeichert wurde, ist nur das Ergebnis von Bedeutung, dann können Sie die Datei einfach normal speichern und dann den Defragmentierer Ihres Betriebssystems ausführen. Dann können Sie mit dieser Antwort überprüfen , ob Ihre Datei aus einem Stück besteht. Wenn nicht, wiederholen Sie diese. Dies ist die einfachste Methode, ohne Befehle oder externe Programme zu verwenden, aber sicherlich nicht die schnellste, da die gesamte Festplatte defragmentiert wird.


1
"Den Defragmentierer starten"? Gibt es so ein Programm? Das einzige, was ich bei der Suche gefunden habe, aptitude search ~ddefragwar ddrescueviewund die nidsTCP-Segment-Wiederzusammensetzungsbibliothek. Ihre Antwort ist nicht sehr hilfreich, wenn Sie nicht angeben, wie das Programm aufgerufen wird oder welche Argumente übergeben werden müssen.
Toby Speight

1
@TobySpeight - Ja, es gibt einen Defragmentierer. e4defrag.
Ravery
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.