Ok, du fragst nach Erfahrungen, das macht die Frage etwas subjektiv und argumentativ, aber passabel.
Linus sagte, dass mit Bezug auf die Verwendungen, die die Leute normalerweise O_DIRECT zuschreiben, und für diese Verwendungen IMO Linus meistens richtig ist. Auch wenn Sie direkte E / A-Vorgänge ausführen, können Sie keine Daten von / zu Geräten direkt in Ihre Programmanweisungen übertragen. Sie benötigen einen Puffer, der (vom Programm oder vom Gerät) gefüllt und über einen Systemaufruf an das andere Ende übertragen wird. Um es effizienter zu gestalten, sollten Sie nicht noch einmal etwas lesen, das Sie gerade gelesen haben, falls Sie es erneut benötigen. Sie brauchen also eine Art Cache ... und genau das bietet der Kernel ohne O_DIRECT, einen Seiten-Cache! Warum nicht das benutzen? Es hat auch Vorteile, wenn mehrere Prozesse gleichzeitig auf dieselbe Datei zugreifen möchten. Dies wäre mit O_DIRECT eine Katastrophe.
Allerdings hat O_DIRECT seine Verwendung: Wenn Sie aus irgendeinem Grund Daten direkt vom Blockgerät abrufen müssen. Es hat nichts mit Leistung zu tun.
Leute, die O_DIRECT für die Leistung verwenden, kommen normalerweise von Systemen mit schlechten Page-Cache-Algorithmen oder ohne POSIX-Hinweismechanismen oder sogar von Leuten, die gedankenlos wiederholen, was andere Leute gesagt haben. Um diese Probleme zu vermeiden, war O_DIRECT eine Lösung. Linux, OTOH, hat die Philosophie, dass Sie das eigentliche zugrunde liegende Problem beheben sollten, und das zugrunde liegende Problem waren Betriebssysteme, die beim Seiten-Caching schlechte Arbeit geleistet haben.
Ich habe O_DIRECT für eine einfache Implementierung von cat verwendet, um einen Speicherfehler in meinem Computer zu finden. Dies ist eine gültige Verwendung für O_DIRECT. Das hatte nichts mit Leistung zu tun.