2013-03-07 17 views
9

Ho un programma C che viene eseguito solo settimanalmente e legge una grande quantità di file una sola volta. Poiché Linux memorizza nella cache tutto ciò che viene letto, riempie inutilmente la cache e questo rallenta molto il sistema, a meno che non abbia un'unità SSD.Lettura file senza memorizzazione nella cache del disco in Linux

Quindi, come posso aprire e leggere da un file senza riempire la cache del disco?

Nota:

Con cache del disco voglio dire che quando si legge un file due volte, la seconda volta è letto dalla RAM, non dal disco. Cioè i dati letti dal disco vengono lasciati nella RAM, quindi le letture successive dello stesso file non necessitano di rileggere i dati dal disco.

+0

Si potrebbe pensare che Linux avrebbe una certa configurazione per quanto riguarda la memorizzazione nella cache del disco. Ad ogni modo, questo è davvero un problema di tipo C? Avresti lo stesso problema indipendentemente dal linguaggio di programmazione, non è vero? Hai provato a eseguire il programma in valgrind? Potrebbe essere che hai perdite di memoria. – Sebivor

+0

È vero, ma per il resto qualcuno potrebbe aver postato dei campioni di codice Python :) – sashoalm

+0

Beh, se non avessi chiesto C avresti avuto più risposte "Linux". Per favore rispondi a tutte le mie domande: hai provato a eseguire il tuo programma in valgrind? – Sebivor

risposta

6

È possibile utilizzare posix_fadvise() con la consulenza POSIX_FADV_DONTNEED per richiedere che il sistema liberi le pagine già lette.

+1

Grazie.POSIX_FADV_NOREUSE non sarebbe più appropriato? Ho appena visto il link. – sashoalm

+4

Probabilmente lo farebbe, ma la documentazione suggerisce che è un no-op. – Hasturkun

+0

Preferirei usare fadvise anziché O_DIRECT. Si può anche avere un altro programma che dice periodicamente al sistema che non è necessario memorizzare nella cache determinati file. L'ho avuto durante l'analisi di file di log di grandi dimensioni con awstats. – Marki555

7

credo passando O_DIRECT per open() dovrebbe aiutare:

O_DIRECT (Dal momento che Linux 2.4.10)

cercare di minimizzare gli effetti della cache di I/O per e da questo file. In generale, questo peggiorerà le prestazioni, ma è utile in situazioni speciali, ad esempio quando le applicazioni eseguono il proprio caching. L'I/O di file viene eseguito direttamente da/per i buffer di spazio utente. Il flag O_DIRECT da solo crea uno sforzo per trasferire i dati in modo sincrono, ma non fornisce le garanzie di O_SYNC che i dati e i metadati necessari vengano trasferiti. Per garantire l'I/O sincrono, O_SYNC deve essere utilizzato in aggiunta a O_DIRECT.

Non ci sono note ulteriori dettagliate sul O_DIRECT verso la parte inferiore del man page, tra cui una citazione divertente da Linus.

+2

Giusto per essere sicuri, dal momento che dice "In generale questo peggiorerà le prestazioni" - in realtà non lo degraderà per me, giusto? Perché sto davvero leggendo i file solo una volta. – sashoalm

+0

@sashoalm: Penso che sia esattamente ciò che significa. Ridurrà le prestazioni delle letture ripetute. Tuttavia, poiché non stai facendo letture ripetute, questo non si applica a te. Se mai, dovrebbe migliorare le prestazioni nel tuo caso, dal momento che non dovrai inquinare inutilmente la cache. – NPE

+4

IIRC, questo disabiliterà la lettura in anticipo, che è probabile che il degrado delle prestazioni si verifichi in – Hasturkun

Problemi correlati