Unsere Anwendung schreibt Daten als riesigen Ringpuffer (30 bis 150 TB) auf die Festplatte. Schreiben neuer Dateien beim Löschen alter Dateien. Daher ist die Festplatte per Definition immer "nahezu voll".
Der Schriftsteller Prozess verschiedene Dateien zu einer Netto-Eingangsdrehzahl von etwa 100 bis 150 Mbits / s schafft. Datendateien sind eine Mischung aus 1 GB-Datendateien und mehreren kleineren Metadatendateien. (Die Eingabegeschwindigkeit ist konstant. Beachten Sie jedoch, dass neue Dateigruppen nur einmal pro zwei Minuten erstellt werden.)
Es gibt ein separates deleter Verfahren, das die „ältesten“ Dateien alle 30s löscht. Es wird so lange gelöscht, bis dort 15 GB freier Speicherplatz auf der Festplatte erreicht sind.
Im stabilen Betrieb haben alle Datenpartitionen nur 15 GB freien Speicherplatz.
Zu dieser SO-Frage im Zusammenhang mit der Verlangsamung des Dateisystems kommentierte DepressedDaniel :
Das Hängen der Synchronisierung bedeutet nur, dass das Dateisystem hart daran arbeitet, die neuesten Vorgänge konsistent zu speichern. In dieser Zeit wird mit Sicherheit versucht, Daten auf der Festplatte zu mischen. Ich kenne die Details nicht, aber ich bin mir ziemlich sicher, dass ext4 versuchen wird, etwas dagegen zu unternehmen, wenn Ihr Dateisystem stark fragmentiert ist. Und das kann nicht gut sein, wenn das Dateisystem fast 100% voll ist. Die einzig vernünftige Möglichkeit, ein Dateisystem mit nahezu 100% der Kapazität zu verwenden, besteht darin, es statisch mit einigen Dateien zu initialisieren und diese Dateien dann zu überschreiben (um eine Fragmentierung zu vermeiden). Funktioniert wahrscheinlich am besten mit ext2 / 3.
Ist ext4 eine schlechte Wahl für diese Anwendung? Welche Optimierung kann ext4 vorgenommen werden, um Fragmentierung, Verlangsamungen oder andere Leistungseinschränkungen zu vermeiden, da wir live ausgeführt werden? Ein Wechsel von ext4 wäre ziemlich schwierig ...
(und das Umschreiben statisch erstellter Dateien bedeutet das Umschreiben der gesamten Anwendung)
Vielen Dank!
BEARBEITEN I.
An den Server sind 50 bis 100 TB Festplatten angeschlossen (24 Laufwerke). Der Areca RAID-Controller verwaltet die 24 Laufwerke als RAID-6-RAID-Set.
Von dort aus teilen wir uns in mehrere Partitionen / Volumes auf, wobei jedes Volume 5 bis 10 TB beträgt. Die Größe eines Volumes ist also nicht sehr groß.
Der "Writer" -Prozess findet das erste Volume mit "genügend" Speicherplatz und schreibt dort eine Datei. Nachdem die Datei geschrieben wurde, wird der Vorgang wiederholt.
Bei einer brandneuen Maschine werden die Volumina der Reihe nach aufgefüllt. Wenn alle Volumes "voll" sind, beginnt der Prozess "Löschen" mit dem Löschen der ältesten Dateien, bis "genügend" Speicherplatz verfügbar ist.
Aufgrund der Wirkung anderer Prozesse wird die zeitliche Abfolge von Dateien über einen langen Zeitraum zufällig auf alle Volumes verteilt.
EDIT II
Laufen fsck
zeigt eine sehr geringe Fragmentierung: 1 - 2%. Doch in der Zwischenzeit hat sich langsam Dateisystemzugriff wurde wie auf verschiedene Systemaufrufe verfolgt fclose()
, fwrite()
, ftello()
usw. eine sehr lange Zeit auszuführen (5 bis 60 Sekunden!).
Bisher keine Lösung für dieses Problem. Weitere Details finden Sie in dieser SO-Frage: Wie debugge ich sehr langsam (200 Sek.) Fwrite () / ftello () / fclose ()?
Ich habe deaktiviert sysstat
und um raid-check
zu sehen, ob es Verbesserungen gibt.
fallocate(fd,FALLOC_FL_ZERO_RANGE,0,length)
Zuweisung des Speicherplatzes, bevor Sie in die Datei schreiben? Könnten Sie eine "feste" Zuordnungsgröße für die großen Datendateien verwenden (vorausgesetzt, sie weisen keine großen Größenunterschiede auf)? Dies ist ein schwieriger Fall, da die kleineren Metadatendateien eine Fragmentierung der großen Dateien verursachen können. Könnten Sie verschiedene Partitionen für die großen Datendateien und kleinen Metadatendateien verwenden?