Ok, pytasz o doświadczenia, to sprawia, że pytanie jest trochę subiektywne i kłótliwe, ale możliwe do przejścia.
Linus powiedział, że odnosząc się do zastosowań, które ludzie zwykle przypisują O_DIRECT, i dla tych zastosowań, IMO Linus jest w większości poprawne. Nawet jeśli wykonujesz bezpośrednie operacje we / wy, nie możesz przesyłać danych do / z urządzeń bezpośrednio do instrukcji programu, potrzebujesz bufora, który jest wypełniany (przez program lub urządzenie) i przesyłany przez wywołanie systemowe na drugim końcu. Ponadto, aby uczynić go wydajnym, nie będziesz chciał ponownie czytać czegoś, co właśnie przeczytałeś, na wypadek, gdybyś go ponownie potrzebował. Potrzebujesz więc pamięci podręcznej ... i właśnie to zapewnia jądro bez O_DIRECT, pamięci podręcznej strony! Dlaczego tego nie użyć? Ma to również zalety, jeśli więcej procesów chce uzyskać dostęp do tego samego pliku jednocześnie, byłoby katastrofą z O_DIRECT.
Powiedziawszy to, O_DIRECT ma swoje zastosowania: Jeśli z jakiegoś powodu musisz uzyskać dane bezpośrednio z urządzenia blokowego. Nie ma to nic wspólnego z wydajnością.
Ludzie używający O_DIRECT do wydajności zwykle pochodzą z systemów ze złymi algorytmami pamięci podręcznej stron lub bez mechanizmów porad POSIX, a nawet bezmyślnie powtarzają to, co powiedzieli inni ludzie. Aby uniknąć tych problemów, O_DIRECT było rozwiązaniem. Linux, OTOH, ma filozofię, że powinieneś naprawić prawdziwy podstawowy problem, a podstawowym problemem były systemy operacyjne, które źle wykonały buforowanie stron.
Użyłem O_DIRECT do prostej implementacji cat, aby znaleźć błąd pamięci w mojej maszynie. Jest to jedno prawidłowe zastosowanie dla O_DIRECT. To nie miało nic wspólnego z wydajnością.