Ok, chiedi esperienze, questo rende la domanda un po 'soggettiva e polemica, ma fattibile.
Linus ha detto che riferendosi agli usi che le persone di solito attribuiscono a O_DIRECT, e per questi usi, IMO Linus è per lo più corretto. Anche se si esegue l'I / O diretto, non è possibile trasferire i dati da / verso i dispositivi direttamente alle istruzioni del programma, è necessario un buffer riempito (dal programma o dal dispositivo) e trasferito attraverso una chiamata di sistema all'altra estremità. Inoltre, per renderlo efficiente, non vorrai rileggere qualcosa che hai già letto, nel caso ne avessi bisogno di nuovo. Quindi hai bisogno di una sorta di cache ... ed è esattamente quello che il kernel fornisce senza O_DIRECT, una cache di pagina! Perché non usarlo? Presenta anche vantaggi se più processi desiderano accedere allo stesso file contemporaneamente, sarebbe un disastro con O_DIRECT.
Detto questo, O_DIRECT ha i suoi usi: se per qualche motivo è necessario ottenere dati direttamente dal dispositivo a blocchi. Non ha nulla a che fare con le prestazioni.
Le persone che usano O_DIRECT per le prestazioni di solito provengono da sistemi con algoritmi di cache delle pagine errati, o senza meccanismi di consulenza POSIX, o persino persone che ripetono inconsapevolmente ciò che altre persone hanno detto. Per evitare questi problemi, O_DIRECT era una soluzione. Linux, OTOH, ha la filosofia secondo cui dovresti risolvere il vero problema di fondo, e il problema di fondo erano i SO che facevano un cattivo lavoro con la memorizzazione nella cache delle pagine.
Ho usato O_DIRECT per una semplice implementazione di cat per trovare un errore di memoria nella mia macchina. Questo è un uso valido per O_DIRECT. Non aveva nulla a che fare con le prestazioni.