Ok, vous demandez des expériences, cela rend la question un peu subjective et argumentative, mais passable.
Linus a déclaré que se référant aux utilisations que les gens attribuent habituellement à O_DIRECT, et pour ces utilisations, IMO Linus est généralement correct. Même si vous effectuez des E / S directes, vous ne pouvez pas transférer des données vers / depuis des périphériques directement vers vos instructions de programme, vous avez besoin d'un tampon qui est rempli (par le programme ou le périphérique) et transféré via un appel système à l'autre extrémité. De plus, pour le rendre efficace, vous ne voudrez pas relire quelque chose que vous venez de lire, au cas où vous en auriez besoin à nouveau. Vous avez donc besoin d'une sorte de cache ... et c'est exactement cela que le noyau fournit sans O_DIRECT, un cache de page! Pourquoi ne pas utiliser ça? Il présente également des avantages si plusieurs processus souhaitent accéder simultanément au même fichier, ce serait un désastre avec O_DIRECT.
Cela dit, O_DIRECT a ses utilisations: si, pour une raison quelconque, vous devez obtenir des données directement à partir du périphérique de bloc. Cela n'a rien à voir avec les performances.
Les personnes utilisant O_DIRECT pour les performances proviennent généralement de systèmes avec de mauvais algorithmes de cache de pages, ou sans mécanismes de conseil POSIX, ou même de personnes répétant sans réfléchir ce que d'autres ont dit. Pour éviter ces problèmes, O_DIRECT était une solution. Linux, OTOH, a la philosophie que vous devez résoudre le vrai problème sous-jacent, et le problème sous-jacent était les systèmes d'exploitation qui ont mal fait la mise en cache des pages.
J'ai utilisé O_DIRECT pour une implémentation simple de cat pour trouver une erreur de mémoire dans ma machine. Il s'agit d'une utilisation valide pour O_DIRECT. Cela n'avait rien à voir avec la performance.