Scrittura di file di registro su SSD


0

Abbiamo un'applicazione che fa MOLTE registrazioni. Il supporto a cui accediamo è unità SSD SLC, tuttavia stiamo iniziando a vedere alcuni guasti sul campo. Potremmo disattivare la registrazione (lo facciamo), avere livelli di registrazione (lo abbiamo), tuttavia a volte un ingegnere attiva la registrazione per diagnosticare un errore e si dimentica di disattivarlo, il che si traduce in un SSD fallito qualche tempo dopo.

Guardando il codice di registrazione, salviamo la voce di registro in una coda e ogni 5 secondi, ripetiamo la raccolta e usiamo File.AppendAllText per scrivere la riga nel file.

Secondo MSDN questo scrive nel file quindi lo chiude.

Quale sarebbe un regime migliore da utilizzare per ottenere la stessa funzionalità ma prevenire (o ridurre) i danni all'SSD?

Sarebbe meglio aprire un FileStream all'avvio del software, scrivere nello stream durante l'uso e chiudere prima della chiusura del software? In che modo ciò alleverebbe la situazione a livello del disco? Quali processi sono coinvolti e come è meglio che aprire il file e chiuderlo immediatamente. L'uso di FileStream "sembra" migliore, ma ho bisogno di una logica più concreta prima di apportare modifiche.

Forse c'è un modo migliore che non abbiamo considerato.


Sono sorpreso che stai incontrando SSD falliti in questo giorno in età - Indossare il livellamento e la rifinitura dovrebbero alleviare la maggior parte del problema. Non stai facendo un raid, vero? Hai preso in considerazione il passaggio alle unità SLC?
Arthur,

Nessun raid. Sto già usando SLC. MLC dovrebbe leggere SLC sopra. Ho modificato per riflettere.
Sparers

Come Arthur, sono sorpreso che tu stia riscontrando guasti con SSD SLC. Quanto sei sicuro che la scrittura dei registri stia causando errori? Nel caso in cui gli ingegneri lasciassero la registrazione accesa, forse potresti aggiungere un'opzione per quanto tempo deve essere abilitata la registrazione senza scelta "per sempre".
Andrew Morton,

Sì, Andrew, avevamo anche considerato "il timeout" della registrazione. Non posso essere sicuro che la registrazione stia causando il problema e che nuove informazioni stamattina sembrano indicare due marchi di cui un marchio ha più problemi. Immagino che la soluzione (se la registrazione sta causando il problema) sia quella di fare la coda e di impegnarsi meno regolarmente e di avere un timeout della registrazione.
Sparers

Maggiori dettagli sarebbero d'aiuto. Stai eseguendo un sistema operativo che supporta TRIM (ad esempio Win7 o successivo)? Puoi quantificare ciò che intendi con MOLTO logging ? Vale a dire quando la registrazione viene lasciata attiva, qual è la frequenza di registrazione al secondo / minuto / ora? E più o meno che tipo di MB / GB totali vengono scritti al giorno o alla settimana? Ho il sospetto che la velocità di registrazione potrebbe effettivamente essere il problema piuttosto che la scrittura di MB / GB e posso spiegarlo meglio in una risposta, ma se possibile puoi ottenere prima alcuni numeri di ball-park.
misha256,

Risposte:


1

OK, sono abbastanza sicuro di avere la tua risposta.

Da quello che raccolgo, File.AppendAllTextviene utilizzato per scrivere ogni riga nel file di registro. Ciò significa che il file di registro viene aperto, scritto e chiuso ogni volta che AppendAllTextviene chiamato.

Senza guardare esattamente come AppendAllTextviene implementato, possiamo anche supporre che nella migliore delle ipotesi vengano scritti sul disco solo i dati aggiuntivi più i corrispondenti metadati (file system).

Migliaia di iterazioni di quanto sopra, per un periodo di tempo, distruggeranno effettivamente un SSD (tipi MLC più rapidamente di SLC). Questo perché gli SSD possono scrivere nella loro memoria interna solo in blocchi di grandi dimensioni.

Esempio

Prendi un SSD da 128 GB con una dimensione di blocco interna di 512 KB. Sono 262.144 blocchi in totale.

Per dirla in parole povere, senza contare le scritture di metadati (file system), se si aprono-scrivono-chiudono 262.144 piccoli file, si avrà la scrittura su ogni blocco dell'SSD. Fallo altre 1000-4000 volte (a seconda dell'SSD) e l'hai praticamente ucciso.

Ora sono sicuro che gli SSD hanno cose intelligenti in corso per minimizzare il tipo di usura sopra, quindi prendi l'esempio con un granello di sale. Ma il principio qui è vero ed è importante: agli SSD non piacciono milioni di piccole scritture.

L'aggiunta di una riga a un file di registro costituisce una piccola scrittura di dati (o forse una grande scrittura, a seconda di come MS ha implementato le cose) e una o più piccole scritture per aggiornare i metadati.

Possibili soluzioni

  • Scrivi nel registro meno frequentemente, dì ogni 60 secondi e / o ...

  • Apri il file di registro come a Stream, aggiungi quello che vuoi nel tuo ciclo, quindi scarica / chiudi lo Stream. Questo approccio implica che il file viene aperto una sola volta , scritto e quindi chiuso. .NET e il sistema operativo ottimizzeranno la scrittura.

  • Utilizzare un disco rigido non SSD per la registrazione. Se non è possibile modificare il codice di registrazione, ma è possibile specificare un percorso di registrazione, questa potrebbe essere l'opzione migliore. Anche un disco rigido USB farebbe bene! Finché non è SSD.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.