Ich habe vor, eine Anwendung zu schreiben, die versucht, so viel wie möglich in eine Datei zu schreiben, damit keine nennenswerten Daten verloren gehen. Sie schreibt jeden Tastendruck im Mikro- oder sogar Nanosekundentakt auf die Festplatte. Das klingt jetzt nach viel, aber es wird trotzdem eine ganze Weile dauern, bis ein GB an Daten geschrieben ist. Um die Sache zu erleichtern, habe ich vor, diese Daten als Updates an das Ende der Datei zu schreiben und dabei einen Ausgabestream zu verwenden, den Stream aber unmittelbar danach zu leeren.
Bei SSDs werden die Daten bei jedem Update normalerweise an einen anderen Speicherort geschrieben. Ich gehe davon aus, dass das Betriebssystem/FS nur „Sektoren“ an das Laufwerk sendet und nicht erkennen kann, dass es sich nur um Updates am Ende einer Datei handelt. Das würde also bedeuten, dass das SSD-Verschleißnivellierungssystem trotz der geringen Größe der Updates definitiv auf ein Ende begrenzt wird.
Ist die obige Beschreibung richtig und sollte ich eine angemessene Pufferung in der Anwendung berücksichtigen? Wie viel Cache speichern moderne Dateisysteme selbst, bevor sie auf die SSD schreiben? Oder kann die Pufferung innerhalb der SSD selbst Abhilfe schaffen? Hat jemand eine Analyse dieser Nutzung durchgeführt?
Antwort1
In einer solchen Situation sollte das Betriebssystem Ihre Schreibvorgänge puffern und etwa alle paar Sekunden löschen. Außerdem implementieren die meisten SSDs eine begrenzte Form der Schreibpufferung, die „sicher“ ist, sodass bei einem Stromausfall keine Daten verloren gehen. Beachten Sie, dass die meisten Speichergeräte und Betriebssysteme in 4-KB-Blöcken arbeiten, das System also keine einzelnen Bytes auf die Festplatte schreibt.
Wenn Ihre Anwendung jedoch kontinuierlich kleine Datenmengen auf die Festplatte schreiben muss, sollten Sie am besten explizit einen Schreibpuffer verwenden, indem Sie entweder selbst einen implementieren oder eine entsprechende Betriebssystemfunktion verwenden. Jeder Schreibvorgang auf die Festplatte bringt auf Betriebssystemebene einen nicht unerheblichen Overhead mit sich, daher sollten Sie in einen Speicherpuffer schreiben, der in angemessenen Intervallen oder wenn der Puffer eine bestimmte Größe erreicht (z. B. mehrere zehn oder hundert KB) geleert wird.
Wenn Sie in regelmäßigen Abständen relativ große Datenmengen schreiben und keine Daten an zufälligen Stellen auf der Festplatte überschreiben – und es scheint, als würden Sie nur einen kontinuierlichen Strom von Protokolldaten schreiben –, sollten Sie keine übermäßige Schreibverstärkung oder Leistungseinbußen feststellen. Das Wear Leveling des Laufwerks reicht hier völlig aus.