Was ist in einer Hochleistungsumgebung (viele gleichzeitige Aktualisierungen) unter Linux die effektivste Methode zum Aktualisieren einer 30 KB großen Datei auf der Festplatte:
1. Aktualisieren Sie einfach die entsprechende Datei
2. Löschen Sie die alte Datei und speichern Sie die neue
Mir geht es vor allem um die Zugriffszeit auf die Festplatte, aber auch die Prozessorauslastung kann hier eine Rolle spielen.
Antwort1
Das von Ihnen verwendete Festplattensubsystem und Dateisystem haben hier einen großen Einfluss. Tatsächlich gibt es so viele verschiedene mögliche Ergebnisse, dass Sie wahrscheinlich einen Benchmark durchführen sollten. Allerdings:
- Beachten Sie, dass echte, synchrone IOs bei einem SATA-Laufwerk auf etwa 100 IOPS und bei einem SAS-Laufwerk auf 200 IOPS begrenzt sind und bei SSDs stark zwischen 10 und 10.000 IOPS variieren. Multiplizieren Sie die Anzahl der IOPS mit der Anzahl der Datenlaufwerke.
- Moderne Dateisysteme bündeln Schreibvorgänge. Die richtige Auswahl des Dateisystems und eine detaillierte Feinabstimmung können die Ergebnisse um den Faktor 10 bis 100 verändern.
- Moderne Speichercontroller können Schreibvorgänge zwischenspeichern. Die richtigen Einstellungen für den Write-Back-Cache ändern die Ergebnisse noch einmal um den Faktor 10 bis 1000.
Daher werden die richtige Hardware (echter RAID-Controller mit WB-Cache, SSD), die richtige Software (modernes Dateisystem, ext3 kommt hier absolut nicht in Frage, ich würde xfs nehmen, aber ext4 ist eine Option) und die richtige Abstimmung (Testen verschiedener Einstellungen für Kernel-IO-Scheduler, IO-Größe usw.) enorme Auswirkungen haben.
Antwort2
Wenn Sie es HÄUFIG aktualisieren, ist es für Sie wahrscheinlich kein Problem, dass der Inhalt der Dateien veraltet ist. Wenn doch, speichern Sie es auf tmpfs, kürzen Sie die Datei beim Update und schreiben Sie sie neu hinein. Das wäre die billigste Methode, da dabei wahrscheinlich überhaupt keine Festplatte verwendet wird.
Die nächstliegende Lösung ist das Abschneiden/Schreiben auf ein Dateisystem mit demnoatimeMount-Option gesetzt und Journaling ausgeschaltet. Aber es ist wieder riskant, wenn es abstürzt, da Sie möglicherweise die Daten verlieren.
Danach ist keine Zeit mehr, das Journaling zu aktivieren.
Denken Sie daran, dass Linux Schreibvorgänge puffert und in festgelegten Intervallen mit der Festplatte synchronisiert, sodass Sie die Auswirkungen eines Schreibvorgangs aus E/A-Sicht normalerweise nicht „spüren“ (es sei denn, es handelt sich um sehr umfangreiche Schreibvorgänge, aber das ist einstellbar). Sie können auch die Bedingungen für die Synchronisierung mit der Festplatte ändern, sodass der Schreibpuffer recht lange gefüllt sein kann, bevor mit der Festplatte synchronisiert wird.
Wenn Sie etwas wirklich Schlaues tun wollen, verwenden Sie fallocate, um der Datei vorab Speicherplatz zuzuweisen, der dem maximal möglichen Wert entspricht. Öffnen Sie die Datei dann mit mmap, um sie direkt in den Speicher zu lesen. Das Neuschreiben erfolgt dann nahezu augenblicklich (aber verlustbehaftet, wenn es zu einem Stromausfall kommt). Sie können dann mit dem msync-Aufruf steuern, wann die Datei wieder auf die Festplatte geschrieben werden soll.
Antwort3
Angenommen, es handelt sich um eine FLAT-Datei und nicht um eine Datenbankdatei, dann gibt es bei beiden Methoden die Vor- und Nachteile:
Wenn Sie den Inhalt der Datei einfach an Ort und Stelle überschreiben, vermeiden Sie sicherlich die Schritte zur Neuzuweisung. Sie könnten also dort etwas Zeit sparen. Allerdings ist die Platzierung der Teile möglicherweise nicht optimal.
Abhängig von der Fragmentierung der Festplatte erhalten Sie möglicherweise eine optimalere Platzierung der Daten. Dies wird jedoch etwas langsamer sein, da Speicherplatz zugewiesen werden muss und wenn Sie in einer sichereren Umgebung arbeiten, wird es einige Zeit dauern, den Block vor der Zuweisung auf Null zu setzen.