Pokud je tato otázka příliš zaměřená na programátora, dejte mi vědět. Zajímalo by mě, jestli jsou lidé obeznámeni s příznakem O_DIRECT pro systémové volání open() na Linuxu 2.6? Linus znevažuje jeho použití, ale zdá se, že vysoký výkon zápisu souborů naznačuje jeho použití. Rád bych se dozvěděl o zkušenostech a doporučeních ze skutečného světa.
Další informace:
Aplikace, kterou používám, dělá udržovat svou vlastní mezipaměť a tím dosáhnout v průměru 5x nebo více zrychlení. Při zápisu do souboru musí být obsah mezipaměti zapsán do mezipaměti systému souborů, což se zdá být nadbytečné a představuje problém s výkonem.
Přijatá odpověď:
Dobře, ptáte se na zkušenosti, díky tomu je otázka trochu subjektivní a sporná, ale přijatelná.
Linus řekl, že odkaz na použití, která lidé obvykle připisují O_DIRECT, a pro tato použití má IMO Linus většinou pravdu. I když provádíte přímé I/O, nemůžete přenášet data do/ze zařízení přímo do vašich programových příkazů, potřebujete vyrovnávací paměť, která je naplněna (programem nebo zařízením) a přenesena prostřednictvím systémového volání na druhý konec. Aby to bylo efektivní, nebudete chtít znovu číst něco, co jste právě přečetli, pro případ, že to budete znovu potřebovat. Takže potřebujete nějakou mezipaměť… a přesně to jádro poskytuje bez O_DIRECT, mezipaměti stránek! Proč toho nevyužít? Přichází také s výhodami, pokud chce více procesů přistupovat ke stejnému souboru současně, s O_DIRECT by to byla katastrofa.
O_DIRECT má své využití:Pokud z nějakého důvodu potřebujete získat data přímo z blokového zařízení. Nemá to nic společného s výkonem.
Lidé používající O_DIRECT pro výkon obvykle pocházejí ze systémů se špatnými algoritmy mezipaměti stránek nebo bez poradenských mechanismů POSIX, nebo dokonce z lidí bezmyšlenkovitě opakujících, co řekli jiní lidé. Chcete-li se těmto problémům vyhnout, řešením bylo O_DIRECT. Linux, OTOH, má filozofii, že byste měli opravit skutečný základní problém, a základním problémem byly operační systémy, které dělaly špatnou práci s ukládáním stránek do mezipaměti.
Použil jsem O_DIRECT pro jednoduchou implementaci cat k nalezení chyby paměti v mém počítači. Toto je jedno platné použití pro O_DIRECT. To nemělo nic společného s výkonem.
Související:OpenVPN – Vazba soketu selhala na místní adrese [AF_INET] IP:1194:Nelze přiřadit požadovanou adresu?