Хорошо, вы спрашиваете об опыте, это делает вопрос немного субъективным и спорным, но сносным.
Линус сказал, что в отношении использования, которое люди обычно приписывают O_DIRECT, и для этих применений, IMO Linus в основном правильно. Даже если вы выполняете прямой ввод-вывод, вы не можете передавать данные на / с устройств напрямую в операторы вашей программы, вам нужен буфер, который заполняется (программой или устройством) и передается через системный вызов на другой конец. Кроме того, чтобы сделать его более эффективным, вы не захотите перечитывать то, что только что прочитали, на случай, если оно вам понадобится снова. Так что вам нужен какой-то кеш ... и это именно то, что ядро предоставляет без O_DIRECT, кеша страниц! Почему бы не использовать это? Это также дает преимущества, если больше процессов хотят одновременно обращаться к одному и тому же файлу, с O_DIRECT было бы катастрофой.
Сказав это, O_DIRECT имеет свое применение: если по какой-то причине вам необходимо получать данные непосредственно с блочного устройства. Это не имеет ничего общего с производительностью.
Люди, использующие O_DIRECT для производительности, обычно приходят из систем с плохими алгоритмами кэширования страниц или без механизмов рекомендаций POSIX, или даже с людьми, бездумно повторяющими то, что говорили другие люди. Чтобы избежать этих проблем, O_DIRECT был решением. Linux, OTOH, придерживается философии, согласно которой вы должны исправить реальную проблему, а основной проблемой были ОС, которые плохо справились с кэшированием страниц.
Я использовал O_DIRECT для простой реализации cat, чтобы найти ошибку памяти на моей машине. Это одно допустимое использование для O_DIRECT. Это не имеет ничего общего с производительностью.